You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让GitHub Actions PR工作流中指定步骤仅在main分支变更或每日执行

实现GitHub Actions条件执行耗时步骤

要实现仅在main分支有变更或资源超过1天未更新时执行耗时的Clone resources步骤,可以通过以下步骤配置工作流:

核心思路

  1. 检测main分支是否在当前PR的基准提交之后有新变更
  2. 检测资源目录的最后更新时间是否超过24小时
  3. 通过逻辑或(||)组合两个条件,控制目标步骤的执行

修改后的工作流配置

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

关键部分说明

  1. 完整拉取提交历史:actions/checkout添加fetch-depth: 0,确保能获取main分支的最新提交以及PR基准提交的时间信息。
  2. main分支变更检测:通过对比PR基准提交和main分支最新提交的时间,判断main是否有新的合并或修改。
  3. 资源过期检测:检查资源目录是否存在,若不存在则直接标记需要更新;若存在则计算最后修改时间与当前时间的差值,超过24小时则标记需要更新。
  4. 条件触发逻辑:手动触发工作流(workflow_dispatch)、main分支有变更、资源超期三个条件满足其一,就执行Clone resources步骤。

内容的提问来源于stack exchange,提问作者sasawatc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:00:33