如何让GitHub Actions PR工作流中指定步骤仅在main分支变更或每日执行
实现GitHub Actions条件执行耗时步骤
要实现仅在main分支有变更或资源超过1天未更新时执行耗时的Clone resources步骤,可以通过以下步骤配置工作流:
核心思路
- 检测
main分支是否在当前PR的基准提交之后有新变更 - 检测资源目录的最后更新时间是否超过24小时
- 通过逻辑或(
||)组合两个条件,控制目标步骤的执行
修改后的工作流配置
name: on-pr-update on: workflow_dispatch: pull_request: branches: - main jobs: on_pr_update: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整提交历史,用于时间对比 - uses: actions/setup-python@v4 with: python-version: '3.10' cache: 'pip' - name: Upgrade pip run: python -m pip install --upgrade pip - name: Install Python dependencies run: python -m pip install -r requirements.txt - name: 检查main分支是否有新变更 id: check_main_changes run: | # 获取当前PR的基准提交SHA BASE_SHA=${{ github.event.pull_request.base.sha }} # 获取main分支最新提交SHA MAIN_SHA=$(git rev-parse origin/main) # 对比两个提交的时间戳 MAIN_COMMIT_DATE=$(git show -s --format=%ci "$MAIN_SHA") BASE_COMMIT_DATE=$(git show -s --format=%ci "$BASE_SHA") if [[ "$MAIN_COMMIT_DATE" > "$BASE_COMMIT_DATE" ]]; then echo "has_changes=true" >> "$GITHUB_OUTPUT" else echo "has_changes=false" >> "$GITHUB_OUTPUT" fi - name: 检查资源是否超过1天未更新 id: check_resource_age run: | # 替换为你的资源实际目录路径 RESOURCE_DIR="resources" CURRENT_TIME=$(date +%s) if [ ! -d "$RESOURCE_DIR" ]; then # 资源目录不存在,需要更新 echo "needs_update=true" >> "$GITHUB_OUTPUT" exit 0 fi # 获取资源目录最后修改时间(秒级时间戳) RESOURCE_MODIFIED_TIME=$(stat -c %Y "$RESOURCE_DIR") # 计算时间差(秒),24小时=86400秒 TIME_DIFF=$((CURRENT_TIME - RESOURCE_MODIFIED_TIME)) if [ "$TIME_DIFF" -gt 86400 ]; then echo "needs_update=true" >> "$GITHUB_OUTPUT" else echo "needs_update=false" >> "$GITHUB_OUTPUT" fi - name: Clone resources # 满足任一条件则执行:main分支有变更 / 资源超期 / 手动触发工作流 if: ${{ github.event_name == 'workflow_dispatch' || steps.check_main_changes.outputs.has_changes == 'true' || steps.check_resource_age.outputs.needs_update == 'true' }} run: clone_resources
关键部分说明
- 完整拉取提交历史:
actions/checkout添加fetch-depth: 0,确保能获取main分支的最新提交以及PR基准提交的时间信息。 - main分支变更检测:通过对比PR基准提交和
main分支最新提交的时间,判断main是否有新的合并或修改。 - 资源过期检测:检查资源目录是否存在,若不存在则直接标记需要更新;若存在则计算最后修改时间与当前时间的差值,超过24小时则标记需要更新。
- 条件触发逻辑:手动触发工作流(
workflow_dispatch)、main分支有变更、资源超期三个条件满足其一,就执行Clone resources步骤。
内容的提问来源于stack exchange,提问作者sasawatc
相关产品推荐
相关产品推荐

