使用GitHub Action部署Cloud Run时日期标签镜像找不到问题
问题分析
你遇到的核心问题是GitHub Actions的env字段不会执行Shell命令:
- 你在env里定义
IMAGE_TAG: $(date "+%F-%H%M"),这个变量的实际值是字符串$(date "+%F-%H%M"),而非执行date命令生成的日期字符串。 - 构建阶段的run脚本在Shell环境中执行,所以
${{ env.IMAGE_TAG }}会被Shell解析为实际日期,推送的镜像标签是正确的。 - 但部署阶段调用
google-github-actions/deploy-cloudrun时,变量被原样传递给gcloud命令,导致镜像地址变成us-central1-docker.pkg.dev/***/samples/static-site:$(date "+%F-%H%M"),这个标签的镜像根本不存在,自然报错。
另外,你的deploy1步骤里的image字段末尾多了一个多余的单引号,这也是语法错误。
解决方案
要让IMAGE_TAG成为实际的日期字符串,需要在Shell步骤中生成并注入环境变量,而非直接在env字段里写Shell命令。具体步骤如下:
1. 移除env中的IMAGE_TAG定义
删除原配置中env块里的IMAGE_TAG: $(date "+%F-%H%M")行。
2. 添加步骤生成并设置IMAGE_TAG环境变量
在构建镜像的步骤之前,新增一个步骤来生成日期标签并写入GitHub Actions的环境变量:
- name: Generate image tag run: | echo "IMAGE_TAG=$(date "+%F-%H%M")" >> $GITHUB_ENV
3. 修正deploy1步骤的语法错误
去掉image字段末尾多余的单引号,正确写法应为:
image: ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
4. 统一构建步骤中的镜像地址(可选但推荐)
构建步骤里的docker tag命令硬编码了us-central1-docker.pkg.dev和${{ secrets.GKE_PROJECT }},建议改成使用env变量,保持一致性:
docker tag ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \ ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
修改后的完整配置示例
name: Build and Deploy to Cloud Run on: push: branches: ["master"] workflow_dispatch: env: PROJECT_ID: ${{ secrets.GKE_PROJECT }} REPOSITORY: samples # Add your repository name here. GAR_LOCATION: xxxx # Add your repository region name here. IMAGE_NAME: static-site # Add your image name here. jobs: build-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Generate image tag run: | echo "IMAGE_TAG=$(date "+%F-%H%M")" >> $GITHUB_ENV ### Build and Push the Docker image to Google Artifact Registry (GAR) ### - name: Build and Push to Artifact Registry run: |- docker build -t ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} . docker tag ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \ ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} docker push ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} ### Deploy to Cloud RUN (hello-cloud-run) ### - name: Deploy to Cloud RUN (hello-cloud-run) id: 'deploy1' uses: 'google-github-actions/deploy-cloudrun@v2' with: service: 'hello-cloud-run' region: 'asia-south1' flags: '--port=80 --allow-unauthenticated' image: ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} - name: 'Show output' run: echo ${{ steps.deploy1.outputs.url }} ### Deploy to Cloud RUN (ui-services) ### - name: Deploy to Cloud RUN (ui-services) id: 'deploy2' uses: 'google-github-actions/deploy-cloudrun@v2' with: service: 'ui-services' region: 'europe-west2' flags: '--port=80 --allow-unauthenticated' image: ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} - name: 'Show output' run: echo ${{ steps.deploy2.outputs.url }}
注意:原配置中缺少jobs和runs-on的定义,这是GitHub Actions的必填项,已补充完整。
内容的提问来源于stack exchange,提问作者Mohd Rashid
相关产品推荐
相关产品推荐

