如何将AWS CodeDeploy AppSpec变量传递至Shell脚本?
问题分析
你遇到的核心问题是:在build-and-push-image任务中修改了本地appspec.yml的占位符,但deploy-to-ec2任务通过--github-location让CodeDeploy直接从GitHub拉取原始代码,导致替换后的appspec.yml未被使用。CodeDeploy拿到的是仓库里未修改的appspec.yml,占位符<PLACEHOLDER_FOR_COMMIT_SHA>没有被替换成实际的GitHub SHA,因此传递给脚本的IMAGE_TAG变量为空。
解决方案
以下两种方法可以解决这个问题:
方法一:在Deploy任务中重新替换占位符并使用本地部署包
修改deploy-to-ec2任务,放弃从GitHub拉取代码,改为本地打包修改后的代码并上传到S3,让CodeDeploy从S3获取部署包:
deploy-to-ec2: name: Deploy to EC2 needs: build-and-push-image runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-southeast-2 - name: Replace placeholder in AppSpec file run: | sed -i "s|<PLACEHOLDER_FOR_COMMIT_SHA>|${{ github.sha }}|" appspec.yml - name: Create deployment package run: zip -r deploy-package.zip . -x ".git/*" ".github/*" - name: Upload deployment package to S3 run: | aws s3 cp deploy-package.zip s3://your-deployment-bucket/deploy-package-${{ github.sha }}.zip - name: Deploy to EC2 using AWS CodeDeploy run: | aws deploy create-deployment \ --application-name cicd \ --deployment-group-name cicdtest \ --deployment-config-name CodeDeployDefault.OneAtATime \ --description "Deploying Docker image to EC2" \ --s3-location bucket=your-deployment-bucket,key=deploy-package-${{ github.sha }}.zip,bundleType=zip env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
注意:需要提前创建S3存储桶(替换
your-deployment-bucket为实际桶名),并确保CodeDeploy服务角色拥有该桶的访问权限。
方法二:通过Artifact传递修改后的代码
在build-and-push-image任务中上传修改后的代码作为Artifact,再在deploy-to-ec2任务中下载使用:
- 修改
build-and-push-image任务,添加上传Artifact步骤:
- name: Upload deployment artifact uses: actions/upload-artifact@v3 with: name: deploy-artifact path: .
- 修改
deploy-to-ec2任务,跳过代码拉取,直接下载Artifact:
deploy-to-ec2: name: Deploy to EC2 needs: build-and-push-image runs-on: ubuntu-latest steps: - name: Download deployment artifact uses: actions/download-artifact@v3 with: name: deploy-artifact - name: Set up AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-southeast-2 - name: Create deployment package run: zip -r deploy-package.zip . -x ".git/*" ".github/*" - name: Upload deployment package to S3 run: | aws s3 cp deploy-package.zip s3://your-deployment-bucket/deploy-package-${{ github.sha }}.zip - name: Deploy to EC2 using AWS CodeDeploy run: | aws deploy create-deployment \ --application-name cicd \ --deployment-group-name cicdtest \ --deployment-config-name CodeDeployDefault.OneAtATime \ --description "Deploying Docker image to EC2" \ --s3-location bucket=your-deployment-bucket,key=deploy-package-${{ github.sha }}.zip,bundleType=zip env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
额外优化
你的download_docker_image.sh脚本中,IMAGE_TAG=$IMAGE_TAG属于冗余代码,直接使用$IMAGE_TAG即可,CodeDeploy会自动将环境变量注入到脚本的运行环境中。
内容的提问来源于stack exchange,提问作者Junyao
相关产品推荐
相关产品推荐

