使用GitHub可复用工作流时遭遇目录未找到错误的排查求助
GitHub可复用工作流工作区问题排查与修复
问题场景
尝试使用GitHub可复用工作流拆分任务:一个工作流负责Java项目的构建与测试,调用方工作流负责基于代码创建Docker镜像并推送到AWS ECR仓库。
可复用工作流(ci_resusable.yml)
name: "Java CI with Gradle" on: workflow_call: permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: "Set up JDK 11" uses: actions/setup-java@v3 with: java-version: '11' distribution: 'temurin' - name: "Build with Gradle" uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 with: arguments: build
调用方工作流(Release.yml)
name: "Release" on: release: types: - published permissions: contents: read jobs: ci: uses: ./.github/workflows/ci_resusable.yml push-images: runs-on: ubuntu-latest needs: ci - name: "Get tag name" id: get_tag_name run: | echo "::set-output name=tag_name::${{ github.ref_name}}" - name: "Configure AWS credentials" uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_USER_ID }} aws-secret-access-key: ${{ secrets.AWS_USER_PASSWORD }} aws-region: us-east-1 - name: "Login to Amazon ECR" id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: "Build, tag, and push image to Amazon ECR - stockapp-rest-adapter image" env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: stockapp-rest-adapter IMAGE_TAG: ${{ steps.get_tag_name.outputs.tag_name }} run: | pwd cd stockapp-rest-adapter docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
当前问题:执行cd stockapp-rest-adapter时提示目录不存在,疑似仓库未被检出;疑问:这些Job是否运行在同一个Runner并共享工作区?
问题解答
核心结论:不同Job完全独立,不共享Runner和工作区
GitHub Actions中每个Job都会启动全新的Runner实例,各自拥有独立的工作目录和运行环境,完全不会共享任何文件或状态。哪怕两个Job的runs-on配置相同,也只是使用同类型的Runner,而非同一个实例。
错误点分析
push-imagesJob缺少代码检出步骤ciJob的可复用工作流里执行了actions/checkout@v3,但这只会把代码拉取到ciJob对应的Runner工作区中。push-images作为独立任务,未执行任何代码检出操作,当前工作目录为空,自然找不到stockapp-rest-adapter目录。push-imagesJob的步骤格式错误
提供的代码里push-images的步骤没有缩进在steps:下,会导致GitHub Actions解析失败,必须修正格式。
修正后的push-images Job代码
push-images: runs-on: ubuntu-latest needs: ci steps: - name: "Checkout code" uses: actions/checkout@v3 - name: "Get tag name" id: get_tag_name run: | echo "::set-output name=tag_name::${{ github.ref_name}}" - name: "Configure AWS credentials" uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_USER_ID }} aws-secret-access-key: ${{ secrets.AWS_USER_PASSWORD }} aws-region: us-east-1 - name: "Login to Amazon ECR" id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: "Build, tag, and push image to Amazon ECR - stockapp-rest-adapter image" env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: stockapp-rest-adapter IMAGE_TAG: ${{ steps.get_tag_name.outputs.tag_name }} run: | pwd cd stockapp-rest-adapter docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
补充说明
如果Docker构建需要用到ci Job生成的构建产物(如Jar包),仅靠代码检出还不够,需要通过工作流 artifacts 传递产物:
- 在可复用工作流的
buildJob末尾添加上传步骤:- name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: build-output path: stockapp-rest-adapter/build/libs/ - 在
push-imagesJob中添加下载步骤(放在checkout之后):- name: Download build artifacts uses: actions/download-artifact@v3 with: name: build-output path: stockapp-rest-adapter/build/libs/
内容的提问来源于stack exchange,提问作者GionJh
相关产品推荐
相关产品推荐

