这几天一直在努力解决这个问题。我在 GitHub Actions 工作流程中有这些工作:
jobs:
check-for-changes:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Install Black
run: python -m pip install black
- name: Check Black Formatting
id: check
continue-on-error: true
run: |
black black_test.py --check
exit_code=$?
echo "exit_code=$exit_code" >> $GITHUB_OUTPUT
black-formatting:
runs-on: ubuntu-latest
needs: [check-for-changes]
if: ${{ needs.check-for-changes.outputs.exit_code == 1 }}
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Install Black
run: python -m pip install black
- name: Apply Black Formatting
run: black black_test.py
我要构建的逻辑是让
check-for-changes
作业始终先运行。然后,它检查 Python 文件是否需要使用 Black 进行格式化。我正在捕获退出代码并使用 output. 保存它
下一个工作,
black-formatting
应该运行ONLY如果1
来自check-for-changes
工作的退出代码。
我只是使用提供的
yml
文件运行它,其中包含一个需要重新格式化的文件(我检查了 check-for-changes
作业的输出,并且有一条消息指出文件需要格式化,退出代码为1)工作被跳过了?如果我将 if: ${{ needs.check-for-changes.outputs.exit_code == 1 }}
行切换为 == 0
,那么它会继续,但不应该发生这种情况。我不确定我是否正确捕捉了exit_code
或者是否有更好的方法来做到这一点。
如果您不将其声明为作业输出,您的第二个作业将无法访问步骤输出:
jobs:
check-for-changes:
# Map a step output to a job output
outputs:
exit_code: ${{ steps.check.outputs.exit_code}}
steps:
- name: Check Black Formatting
id: check
continue-on-error: true
run: |
black black_test.py --check
exit_code=$?
echo "exit_code=$exit_code" >> $GITHUB_OUTPUT
然后在第二份工作中参考:
jobs:
black-formatting:
runs-on: ubuntu-latest
needs: [check-for-changes]
if: ${{ needs.check-for-changes.outputs.exit_code == 1 }}