diff --git a/actions/build-ecr-image/action.yml b/actions/build-ecr-image/action.yml index 3b5a530..ba409b4 100644 --- a/actions/build-ecr-image/action.yml +++ b/actions/build-ecr-image/action.yml @@ -5,6 +5,9 @@ inputs: aws_region: description: aws region required: true + aws_account_id: + description: aws account id + required: true repository: description: aws ecr repository required: true @@ -12,6 +15,10 @@ inputs: description: make command default: container required: true + make-directory: + description: directory of makefile + required: false + default: $GITHUB_WORKSPACE outputs: tag: @@ -27,17 +34,20 @@ runs: uses: aws-actions/amazon-ecr-login@v1 env: AWS_REGION: ${{ inputs.aws_region }} + + - name: Get triggering commit sha + id: get_commit_sha + uses: Iterative-Scopes/cicd-framework/actions/get-commit-sha@feature/air-191 - name: Build, tag, and push image to Amazon ECR id: erc-image env: - REMOTE_REGISTRY: ${{ steps.login-ecr.outputs.registry }}/${{ inputs.repository }} - IMAGE_TAG: ${{ github.ref_name }} + REMOTE_REGISTRY: ${{ inputs.aws_account_id }}.dkr.ecr.${{ inputs.aws_region }}.amazonaws.com/${{ inputs.repository }} + IMAGE_TAG: ${{ steps.get_commit_sha.outputs.sha }} shell: bash run: | echo "image tag [$IMAGE_TAG]" - make ${{ inputs.make_cmd }} remotereg="$REMOTE_REGISTRY" tag="$IMAGE_TAG" - make ${{ inputs.make_cmd }}test + make -C ${{ inputs.make-directory }} ${{ inputs.make_cmd }} remotereg="$REMOTE_REGISTRY" tag="$IMAGE_TAG" docker push $REMOTE_REGISTRY:$IMAGE_TAG echo "set output tag ["$IMAGE_TAG"]" echo "::set-output name=tag::"$IMAGE_TAG"" \ No newline at end of file diff --git a/actions/build-lambda-package/action.yaml b/actions/build-lambda-package/action.yaml index 7c66b90..e8b3c3d 100644 --- a/actions/build-lambda-package/action.yaml +++ b/actions/build-lambda-package/action.yaml @@ -12,6 +12,9 @@ inputs: description: directory of makefile required: false default: $GITHUB_WORKSPACE + aws_account_id: + description: aws account id + required: true outputs: package_ref: @@ -41,15 +44,17 @@ runs: - name: Build Lambda container id: build-ecr if: ${{ steps.app_settings.outputs.app_registry == 'ecr' }} - uses: Iterative-Scopes/cicd-framework/actions/build-ecr-image@main + uses: Iterative-Scopes/cicd-framework/actions/build-ecr-image@feature/air-191 with: aws_region: ${{ steps.app_settings.outputs.aws_region }} + aws_account_id: ${{ steps.app_settings.outputs.aws_account }} repository: ${{ steps.app_settings.outputs.app_repository }} + make-directory: ${{ inputs. make-directory }} - name: Build Lambda zip id: build-zip if: contains(${{ steps.app_settings.outputs.app_registry}}, "s3:::") - uses: Iterative-Scopes/cicd-framework/actions/build-lambda-zip@main + uses: Iterative-Scopes/cicd-framework/actions/build-lambda-zip@feature/air-191 with: repository: ${{ steps.app_settings.outputs.app_repository }} registry: ${{ steps.app_settings.outputs.app_registry }} diff --git a/actions/build-lambda-zip/action.yaml b/actions/build-lambda-zip/action.yaml index c431c85..cd3f1be 100644 --- a/actions/build-lambda-zip/action.yaml +++ b/actions/build-lambda-zip/action.yaml @@ -11,6 +11,9 @@ inputs: repository: description: "app or service name" required: true + aws_account_id: + description: aws account id + required: true make-directory: description: directory of makefile required: false @@ -31,10 +34,11 @@ runs: run: | echo "build zip..." make -C ${{ inputs.make-directory }} build + # TODO: Will delete this step in next PR. - name: Push to lambda registry s3 id: push-zip shell: bash run: | echo "push zip..." - aws s3 cp ${{ inputs.repository }}.zip ${{ inputs.registry }}/${{ inputs.env }}/${{ inputs.repository }}.zip + # aws s3 cp ${{ inputs.repository }}.zip ${{ inputs.registry }}/${{ inputs.env }}/${{ inputs.repository }}.zip echo "::set-output name=zip_uri::${{ inputs.registry }}/${{ inputs.env }}" \ No newline at end of file diff --git a/actions/cicdcfg/action.yml b/actions/cicdcfg/action.yml index 76cc5ba..c3fc9d9 100644 --- a/actions/cicdcfg/action.yml +++ b/actions/cicdcfg/action.yml @@ -31,6 +31,9 @@ outputs: app_name: description: "app or service name" value: ${{ steps.get-settings.outputs.app_name }} + app_deployer: + description: "application deployer (Default: none)" + value: ${{ steps.get-settings.outputs.app_deployer }} app_registry: description: "app or service name" value: ${{ steps.get-settings.outputs.app_registry }} diff --git a/actions/cicdcfg/dist/cicdcfg-0.3.0.tar.gz b/actions/cicdcfg/dist/cicdcfg-0.3.0.tar.gz index f4f507c..051f8a5 100644 Binary files a/actions/cicdcfg/dist/cicdcfg-0.3.0.tar.gz and b/actions/cicdcfg/dist/cicdcfg-0.3.0.tar.gz differ diff --git a/actions/cicdcfg/src/cicdcfg/main.py b/actions/cicdcfg/src/cicdcfg/main.py index f364679..cd5b4d1 100644 --- a/actions/cicdcfg/src/cicdcfg/main.py +++ b/actions/cicdcfg/src/cicdcfg/main.py @@ -26,6 +26,9 @@ def get_settings(env, role, profile, outfile): file.write(f"aws_role={cfg['role'][role]['name']}\n") file.write(f"aws_role_duration={cfg['role'][role]['duration']}\n") file.write(f"app_name={cfg['application']['name']}\n") + deployer = cfg["application"]["deployer"] if "deployer" in cfg["application"] else "none" + print(f"Debug-Here->> [{deployer}]") + file.write(f"app_deployer={deployer}\n") file.write(f"app_registry={cfg['application']['package']['registry']}\n") file.write(f"app_repository={cfg['application']['package']['repository']}\n") file.write(f"app_runtime={cfg['application']['runtime']['name']}\n") diff --git a/actions/copy-ecr-image/action.yml b/actions/copy-ecr-image/action.yml new file mode 100644 index 0000000..e47f79a --- /dev/null +++ b/actions/copy-ecr-image/action.yml @@ -0,0 +1,99 @@ +name: copy ecr image +description: copy a container image from source env to destination env + +inputs: + src_env: + description: ecr source environment + required: true + dst_env: + description: ecr destination environment + required: true + profile: + description: cicd profle + required: true + package_ref: + description: container image tag to copy + required: true + + +outputs: + tag: + description: image tag + value: ${{ steps.erc-image.outputs.tag }} + +# assume caller has connect to AWS account +runs: + using: "composite" + steps: + - name: Get given application settings for ${{ inputs.src_env }} env + id: app_settings_src + uses: Iterative-Scopes/cicd-framework/actions/cicdcfg@feature/air-191 + with: + env: ${{ inputs.src_env }} + role: deploy + profile: ${{ inputs.profile }} + + - name: Configure AWS credentials + id: aws_configure_src + uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: arn:aws:iam::${{ steps.app_settings_src.outputs.aws_account }}:role/${{ steps.app_settings_src.outputs.aws_role }} + role-duration-seconds: ${{ steps.app_settings_src.outputs.aws_role_duration }} + aws-region: ${{ steps.app_settings_src.outputs.aws_region }} + audience: ${{ steps.app_settings_src.outputs.aws_audience }} + + - name: Get triggering commit sha + id: get_commit_sha + uses: Iterative-Scopes/cicd-framework/actions/get-commit-sha@feature/air-191 + + - name: Login to Amazon ECR (${{ inputs.src_env }}) + id: login_ecr_src + uses: aws-actions/amazon-ecr-login@v1 + env: + AWS_REGION: ${{ steps.app_settings_src.outputs.aws_region }} + + - name: Pull image from ECR (${{ inputs.src_env }}) + id: pull_erc_image + env: + REMOTE_REGISTRY: ${{ steps.app_settings_src.outputs.aws_account }}.dkr.ecr.${{ steps.app_settings_src.outputs.aws_region }}.amazonaws.com/${{ steps.app_settings_src.outputs.app_repository }} + IMAGE_TAG: ${{ steps.get_commit_sha.outputs.sha }} + shell: bash + run: | + echo "Pulling image $REMOTE_REGISTRY:$IMAGE_TAG" + docker pull $REMOTE_REGISTRY:$IMAGE_TAG + echo "::set-output name=src_registry::"$REMOTE_REGISTRY"" + + - name: Get given application settings for ${{ inputs.dst_env }} env + id: app_settings_dst + uses: Iterative-Scopes/cicd-framework/actions/cicdcfg@feature/air-191 + with: + env: ${{ inputs.dst_env }} + role: deploy + profile: ${{ inputs.profile }} + + - name: Configure AWS credentials + id: aws_configure_dst + uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: arn:aws:iam::${{ steps.app_settings_dst.outputs.aws_account }}:role/${{ steps.app_settings_dst.outputs.aws_role }} + role-duration-seconds: ${{ steps.app_settings_dst.outputs.aws_role_duration }} + aws-region: ${{ steps.app_settings_dst.outputs.aws_region }} + audience: ${{ steps.app_settings_dst.outputs.aws_audience }} + + - name: Login to Amazon ECR (${{ inputs.dst_env }}) + id: login_ecr_dst + uses: aws-actions/amazon-ecr-login@v1 + env: + AWS_REGION: ${{ steps.app_settings_dst.outputs.aws_region }} + + - name: Push image to ECR (${{ inputs.dst_env }}) + id: push_erc_image + env: + SRC_REGISTRY: ${{ steps.pull_erc_image.outputs.src_registry }} + REMOTE_REGISTRY: ${{ steps.app_settings_dst.outputs.aws_account }}.dkr.ecr.${{ steps.app_settings_dst.outputs.aws_region }}.amazonaws.com/${{ steps.app_settings_dst.outputs.app_repository }} + IMAGE_TAG: ${{ steps.get_commit_sha.outputs.sha }} + shell: bash + run: | + echo "Pushing image to $REMOTE_REGISTRY:$IMAGE_TAG" + docker tag $SRC_REGISTRY:$IMAGE_TAG $REMOTE_REGISTRY:$IMAGE_TAG + docker push $REMOTE_REGISTRY:$IMAGE_TAG diff --git a/actions/deploy-lambda/action.yaml b/actions/deploy-lambda/action.yaml index b588b30..0b67f59 100644 --- a/actions/deploy-lambda/action.yaml +++ b/actions/deploy-lambda/action.yaml @@ -12,13 +12,17 @@ inputs: description: lambda package ref from lambda build job required: true default: "null" + make-directory: + description: directory of makefile + required: false + default: $GITHUB_WORKSPACE runs: using: "composite" steps: - name: Get given application settings id: app_settings - uses: Iterative-Scopes/cicd-framework/actions/cicdcfg@main + uses: Iterative-Scopes/cicd-framework/actions/cicdcfg@feature/air-191 with: env: ${{ inputs.env }} role: deploy @@ -28,7 +32,7 @@ runs: shell: bash run: | echo LAMBDA_NAME=${{ inputs.env }}-${{ steps.app_settings.outputs.app_name }} >> $GITHUB_ENV - if [ $LAMBDA_NAME == "null" || ${{ inputs.package_ref }} == "null" ]; + if [[ $LAMBDA_NAME == "null" || ${{ inputs.package_ref }} == "null" ]]; then echo "Missing package ref [${{ inputs.package_ref }}] or lambda name: [$LAMBDA_NAME]"; exit 128; @@ -44,27 +48,36 @@ runs: audience: ${{ steps.app_settings.outputs.aws_audience }} - name: Update container lambda - get image uri with given image tag - if: ${{ steps.app_settings.outputs.app_registry == 'ecr' }} + if: ${{ steps.app_settings.outputs.app_registry == 'ecr' && + steps.app_settings.outputs.app_deployer != 'sls' }} uses: Iterative-Scopes/cicd-framework/actions/get-ecr-image-uri@main id: get-image-uri - with: + with: aws_region: ${{ steps.app_settings.outputs.aws_region }} repository: ${{ steps.app_settings.outputs.app_repository }} - image_tag: ${{ inputs.package_ref }} + image_tag: ${{ inputs.package_ref }} - name: Update container lambda - update lambda with image uri - if: ${{ steps.app_settings.outputs.app_registry == 'ecr' && - steps.get-image-uri.outputs.uri }} + if: ${{ steps.app_settings.outputs.app_registry == 'ecr' && + steps.get-image-uri.outputs.uri && + steps.app_settings.outputs.app_deployer != 'sls' }} shell: bash run: | echo ${{ steps.get-image-uri.outputs.uri }} aws lambda update-function-code --function-name ${{ env.LAMBDA_NAME }} --image-uri ${{ steps.get-image-uri.outputs.uri }} exit 0 - + - name: Update lambda from S3 registry - if: contains(${{ steps.app_settings.outputs.app_registry}}, "s3:::") + if: ${{ startsWith(steps.app_settings.outputs.app_registry, 's3:') && + steps.app_settings.outputs.app_deployer != 'sls' }} shell: bash run: | echo "update lambda with [${{ inputs.package_ref }}]" - aws lambda update-function-code --dry-run --function-name ${{ steps.app_settings.outputs.app_repository}}-${{ inputs.env }}-lookup_patient_data --s3-bucket dev-is-phi-infrastructure --s3-key serverless/dev/${{ steps.app_settings.outputs.app_repository}}.zip - exit 0 \ No newline at end of file + aws lambda update-function-code --dry-run --function-name ${{ steps.app_settings.outputs.app_repository}}-${{ inputs.env }}-lookup_patient_data --s3-bucket dev-is-phi-infrastructure --s3-key serverless/dev/${{ steps.app_settings.outputs.app_repository}}.zip + exit 0 + + - name: Deploy lambda + if: ${{ steps.app_settings.outputs.app_deployer == 'sls' }} + shell: bash + run: | + make -C ${{ inputs.make-directory }} deploy stage="${{ inputs.env }}" tag="${{ inputs.package_ref }}" \ No newline at end of file diff --git a/actions/get-commit-sha/action.yml b/actions/get-commit-sha/action.yml new file mode 100644 index 0000000..1de2fac --- /dev/null +++ b/actions/get-commit-sha/action.yml @@ -0,0 +1,23 @@ +name: fetch triggering commit sha +description: fetch triggering commit sha + +outputs: + sha: + description: commit sha + value: ${{ steps.commit_sha.outputs.sha }} + +# assume caller has connect to AWS account +runs: + using: "composite" + steps: + - name: Get commit sha + id: commit_sha + shell: bash + run: | + if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then + COMMIT_SHA=$(cat $GITHUB_EVENT_PATH | jq -r .pull_request.head.sha) + else + COMMIT_SHA=${{ github.sha }} + fi + echo "set output sha ["$COMMIT_SHA"]" + echo "::set-output name=sha::"$COMMIT_SHA"" \ No newline at end of file diff --git a/actions/setup-serverless/action.yml b/actions/setup-serverless/action.yml new file mode 100644 index 0000000..ad08897 --- /dev/null +++ b/actions/setup-serverless/action.yml @@ -0,0 +1,14 @@ +# This file is the sharable action with build,unittest, integration test, code coverage reports. +# The sharable action can be used across applications by referring this action in the github workflow. + +name: Setup serverless environment +description: Setup serverless environment + +runs: + using: "composite" + steps: + - name: Install serverless + shell: bash + run: | + npm install -g serverless@3.24.1 + serverless --version \ No newline at end of file