如何让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第一行是否在本次提交中被修改,若未修改则终止工作流,避免不必要的发布操作。
具体配置调整如下:
- 保留原有的
on触发规则(仍需在project.clj变更时进入校验环节) - 在工作流的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
相关产品推荐
相关产品推荐

