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

如何让GitHub Actions仅在project.clj第一行变更时运行工作流

仅在project.clj第一行变更时触发GitHub Actions自动发布Maven包

场景背景

我使用Clojure、ClojureScript、lein、shadow-cljs、re-frame、reagent,搭配Emacs和CIDER开发动态Web应用。目前正将项目依赖迁移到GitHub Packages的免费私有Maven仓库,已成功发布部分包。

当前GitHub Actions触发配置

现有的工作流.yml触发规则如下:

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - 'project.clj'
  pull_request:
    paths:
      - 'project.clj'

该配置会在修改project.clj的Pull Request,或是main分支上直接修改project.clj时触发工作流,和我的需求接近,但还不够精准。

核心需求

Clojure项目的版本号硬编码在project.clj的第一行,例如原版本行:

(defproject my-repository "0.6.50-RELEASE-TEST-9-via-GitHub-Actions-CD"

版本更新后变为:

(defproject my-repository "0.6.51"

我希望仅当project.clj的第一行发生变更时,才触发GitHub Actions自动发布新的Maven包,请问这是否可行?

实现方案

完全可行。GitHub Actions原生的paths规则只能检测文件是否有变更,无法直接定位行级修改,但可以在工作流中添加校验步骤,判断project.clj第一行是否在本次提交中被修改,若未修改则终止工作流,避免不必要的发布操作。

具体配置调整如下:

  1. 保留原有的on触发规则(仍需在project.clj变更时进入校验环节)
  2. 在工作流的jobs中新增校验逻辑,示例完整配置:
on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - 'project.clj'
  pull_request:
    paths:
      - 'project.clj'

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 2  # 拉取最近两次提交,用于对比文件内容

      - name: Verify project.clj first line change
        id: check_version
        run: |
          # 获取当前提交中project.clj的第一行
          CURRENT_LINE=$(head -n 1 project.clj)
          # 获取上一次提交中project.clj的第一行
          PREV_LINE=$(git show HEAD~1:project.clj | head -n 1)
          # 对比两行内容,输出判断结果
          if [ "$CURRENT_LINE" != "$PREV_LINE" ]; then
            echo "version_changed=true" >> $GITHUB_OUTPUT
          else
            echo "version_changed=false" >> $GITHUB_OUTPUT
          fi

      - name: Terminate if version not updated
        if: steps.check_version.outputs.version_changed == 'false'
        run: |
          echo "project.clj第一行的版本号未变更,终止工作流"
          exit 0

      # 以下是你的Maven包发布步骤,根据实际情况调整
      - name: Deploy to GitHub Packages
        run: |
          # 示例发布命令,替换为你的实际发布逻辑
          lein deploy github-packages

关键说明

  • fetch-depth: 2:确保能获取到上一次提交的project.clj内容,用于版本行对比
  • 校验步骤通过head -n 1提取文件第一行,对比两次提交的内容判断版本是否更新
  • 若版本未变更,直接执行exit 0终止工作流,不执行后续发布操作

这样就能精准实现仅当project.clj第一行(版本号)变更时,才自动发布新包的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:50:29