GitHub Actions上传文件至GCS失败,求排查解决方法
问题分析与解决方案
核心原因
GitHub Actions的每个Job运行在独立的虚拟机环境中,Job之间的文件系统完全隔离。你的create_zip Job里虽然上传了artifact,但google_cloud_services Job没有执行下载artifact的操作,自然找不到./downloads/jobs.zip文件。另外,create_zip Job里的Download zip file artifact步骤完全多余——同一个Job内刚上传的artifact不需要下载,也无法跨Job共享文件。
解决步骤
- 移除冗余步骤:删除
create_zipJob中的Download zip file artifact步骤。 - 在目标Job中下载Artifact:在
google_cloud_servicesJob里添加下载jobsartifact的步骤,确保文件能被访问到。 - 可选调试步骤:添加目录查看命令,确认文件是否存在,方便排查路径问题。
修正后的完整Workflow代码
name: CI Workflow on: push: branches: - main env: PROJECT_ID: "flights-429420" BUCKET_NAME: "flights-cicd-bucket" jobs: create_zip: runs-on: ubuntu-latest needs: test steps: - name: Checkout code uses: actions/checkout@v2 - name: Install zip run: sudo apt-get install zip - name: Create jobs.zip run: | cd app zip -r ../jobs.zip jobs - name: Upload zip file uses: actions/upload-artifact@v3 with: name: jobs path: jobs.zip google_cloud_services: runs-on: ubuntu-latest needs: create_zip steps: - uses: actions/checkout@v3 # 新增:下载create_zip上传的artifact - name: Download jobs artifact uses: actions/download-artifact@v3 with: name: jobs path: ./downloads # 可选:调试用,查看下载后的文件结构 - name: Verify artifact exists run: ls -la ./downloads - name: Authenticate with GCP using Service Account uses: 'google-github-actions/auth@v2' with: credentials_json: ${{ secrets.GCP_ACCOUNT_KEY }} - name: Setup GCP CLI uses: 'google-github-actions/setup-gcloud@v2' with: project_id: ${{ env.PROJECT_ID }} # 修正原代码变量名不匹配问题 install_components: 'gsutil' - name: Create GCS bucket if not exists run: | if ! gsutil ls -b gs://${{ env.BUCKET_NAME }}/; then gsutil mb -l EU gs://${{ env.BUCKET_NAME }}/ fi - name: Upload files to GCS run: | gsutil cp ./downloads/jobs.zip gs://${{ env.BUCKET_NAME }}/jobs.zip gsutil cp app/main.py gs://${{ env.BUCKET_NAME }}/main.py gcloud storage objects update gs://${{ env.BUCKET_NAME }}/main.py --content-type=application/octet-stream
额外注意点
- 原代码中
setup-gcloud步骤的project_id引用了未定义的GCP_PROJECT_ID,已修正为env中定义的PROJECT_ID,避免GCP项目设置失败。 - 如果不需要拆分Job,也可以把打包和上传GCS的步骤合并到同一个Job里,省去artifact传递的步骤,提高执行效率。
内容的提问来源于stack exchange,提问作者KurczakChrupiacy2
相关产品推荐
相关产品推荐

