如何编写GitHub Action:仅在首个作业拉取代码供后续作业引用
解决GitHub Actions中仅拉取一次代码供多作业复用的问题
在GitHub Actions中,每个作业(Job)运行在独立的Runner环境里,默认情况下作业之间无法直接共享文件。要实现只拉取一次代码供后续Terraform和Docker作业使用,你需要通过**工件(Artifact)**来上传和共享代码文件。
修改后的完整配置示例
jobs: setup: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 # 建议使用最新版本的Action # 可选:其他环境初始化步骤,比如安装依赖等 - name: 初始化环境 run: | echo "完成环境初始化" # 将拉取的代码上传为工件,供后续作业下载 - name: 上传代码工件 uses: actions/upload-artifact@v4 with: name: repo-code # 工件名称,后续作业需用该名称下载 path: . # 上传当前目录下所有文件(即拉取的代码) retention-days: 1 # 工件保留天数,按需设置 deploy_docker: needs: setup # 依赖setup作业,确保其完成后再运行 runs-on: ubuntu-latest steps: - name: 下载代码工件 uses: actions/download-artifact@v4 with: name: repo-code # 与setup作业中设置的工件名称一致 path: . # 将文件下载到当前目录 # 后续Docker构建推送步骤 - name: 构建并推送Docker镜像 run: | # 此处编写你的Docker命令,如docker build、docker push等 echo "执行Docker部署逻辑" deploy_terraform: needs: setup # 同样依赖setup作业 runs-on: ubuntu-latest steps: - name: 下载代码工件 uses: actions/download-artifact@v4 with: name: repo-code path: . # 后续Terraform部署步骤 - name: Terraform初始化与部署 run: | # 此处编写你的Terraform命令,如terraform init、terraform apply等 echo "执行Terraform部署逻辑"
关键说明
- 工件传递机制:通过官方的
actions/upload-artifact和actions/download-artifact实现跨作业文件共享,确保代码仅在setup作业中拉取一次。 - 路径优化:如果只需共享特定目录(如
terraform/或docker/),可修改path参数为对应目录,减少传输体积。 - 依赖控制:
needs: setup确保后续作业仅在setup作业成功完成后启动,避免因工件未生成导致的错误。 - 版本兼容性:使用最新版本的官方Action(如
@v4),可获得更好的性能和兼容性。
内容的提问来源于stack exchange,提问作者Steven Burgess
相关产品推荐
相关产品推荐

