[英]How to skip GitHub Actions job on push event?
使用 Travis CI,我們可以通過向提交添加后綴來跳過特定提交的構建。 Travis CI對此進行了描述。 當我只編輯與代碼無關的README.md
並且不需要觸發飛行前構建時,我發現此功能很實用。
[skip ci]
如何跳過觸發的作業on: push
事件?
name: Maven Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check-out project
uses: actions/checkout@v1
- name: Set up JDK 11.0.3
uses: actions/setup-java@v1
with:
java-version: 11.0.3
- name: Build with Maven
run: mvn -B package --file pom.xml
答案摘要:
非常感謝所有提供各種方法來實現它的回答者。 我敢打賭,對於問題的根源和 CI 方法,每個人都需要一些不同的東西。 以下是為快速導航列出的答案:
readme.md
文件中跳過 CI: https ://stackoverflow.com/a/61876395/3764965[skip ci]
上跳過 CI 作為新的 GitHub 功能:
[skip ci]
消息上的 CI(可定制的解決方案):
所有答案都值得一票! 如果你喜歡我的問題,你應該對答案加倍喜歡。
更新:請參閱 Helmisek anwser ,其中指出 Github 現在具有內置功能。
如果您只想跳過一些工作/步驟,我的回答才有意義。
您可以嘗試以下方法:
name: Maven Build
on: [push]
jobs:
build:
if: "!contains(github.event.commits[0].message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- name: Check-out project
uses: actions/checkout@v1
- name: Set up JDK 11.0.3
uses: actions/setup-java@v1
with:
java-version: 11.0.3
- name: Build with Maven
run: mvn -B package --file pom.xml
截至目前(2021 年 2 月), GitHub 操作默認支持此行為。 默認情況下不再需要解析等。
看:
GitHub Actions:使用
[skip ci]
跳過拉取請求和推送工作流程GitHub Actions 現在支持通過在提交消息中查找一些常用關鍵字來跳過 push 和 pull_request 工作流。
如果您的推送或 PR 的 HEAD 提交中的任何提交消息包含字符串
[skip ci]
、[ci skip]
、[no ci]
、[skip actions]
或[actions skip]
在 push 或 pull_request 事件上觸發的工作流將被跳過。
此外,對於您希望在所有推送中忽略的文件和目錄, 您可以配置工作流本身:
on:
push:
paths-ignore:
- 'README.md'
Git 2.27(2020 年第二季度)展示了另一種方法:用戶可以指定要構建哪些分支,而不是總是通過 Actions 在 GitHub 上構建所有分支。
請參閱Jeff King ( peff
)的commit e76eec3 (2020 年 5 月 7 日)。
(由Junio C Hamano -- gitster
--在提交 dd4a287中合並,2020 年 5 月 13 日)
ci
:允許 GitHub Actions 的每個分支配置簽字人:傑夫·金
根據各個開發人員的工作流程,我們的 GitHub Actions CI 作業在每個分支上運行可能很方便,也可能很煩人。
舉個煩人的例子:如果你攜帶許多半完成的工作分支並經常針對 master 重新定位它們,你會得到大量不有趣的失敗報告(更不用說浪費的 CPU)。
此提交添加了一個新作業,該作業檢查存儲庫中的一個特殊分支以獲取 CI 配置,然后運行它找到的 shell 腳本來決定是否跳過其余的測試。
如果缺少該分支或腳本,默認值將繼續為所有 ref 運行測試。
討論了一些替代方案:
一種選擇是在提交本身中攜帶有關是否應該對其進行測試的信息,無論是在樹本身(更改工作流 YAML 文件)還是在提交消息中(“[skip ci]”標志或類似標志)。 但是這些使用起來令人沮喪且容易出錯:
- 您必須手動將它們應用於要標記的每個分支
- 他們很容易泄漏到其他工作流程中,例如通過電子郵件發送補丁
我們同樣可以嘗試從分支名稱中獲取一些信息。 但這導致了關於默認應該是“關閉”還是“打開”的爭論,並且覆蓋仍然會有些尷尬。
如果我們默認為“on”,您必須記住適當地命名您的分支以跳過 CI。
如果“關閉”,您最終將不得不扭曲您的分支名稱或使用額外的 refspec 復制您的推送。相比之下,此提交的解決方案允許您指定一次配置並忘記它,並且所有數據都在其自己的 ref 中關閉,可以通過單獨的 fork 更改它而無需觸及主樹。
有一些設計決策來自列表討論。 我在這里總結一下:
我們可以使用 GitHub 的 API 來檢索配置引用,而不是真正的結帳(然后只需通過一些 javascript 對其進行操作)。
無論哪種方式,我們仍然需要啟動一個 VM 並通過網絡聯系 GitHub,因此它最終不會快多少。
我選擇使用 shell 來保持與我們其他工具相似的東西(並且真的可以用你想要的任何語言實現 allow-refs)。 這也使得在本地測試你的腳本變得很容易,並在一個普通的git.git樹的上下文中修改它。我們可以將眾所周知的 refname 保留在
refs/heads/
之外,以避免混淆分支命名空間。 但這使得操縱起來很尷尬。
相比之下,您只需“git checkout ci-config
”即可進行更改。我們可以假設
ci-config
ref 除了 config 之外什么都沒有(即與git.git的其余部分無關的分支)。
但是處理孤兒分支很尷尬。 相反,我們將盡最大努力使用淺部分克隆僅有效地檢查ci/config
目錄,這允許您的ci-config
分支只是一個普通分支,而您的配置更改位於頂部。我們可以提供一個更簡單的接口,比如引用模式的靜態列表。
但是無論如何我們都無法擺脫啟動整個 VM 的情況,因此我們不妨使用該功能使配置盡可能靈活。
如果我們添加更多配置,我們應該能夠重用我們的部分克隆來設置更多輸出。
所以腳本是ci/config/allow-refs.sample
:
#!/bin/sh
#
# Sample script for enabling/disabling GitHub Actions CI runs on
# particular refs. By default, CI is run for all branches pushed to
# GitHub. You can override this by dropping the ".sample" from the script,
# editing it, committing, and pushing the result to the "ci-config" branch of
# your repository:
#
# git checkout -b ci-config
# cp allow-refs.sample allow-refs
# $EDITOR allow-refs
# git commit -am "implement my ci preferences"
# git push
#
# This script will then be run when any refs are pushed to that repository. It
# gets the fully qualified refname as the first argument, and should exit with
# success only for refs for which you want to run CI.
case "$1" in
# allow one-off tests by pushing to "for-ci" or "for-ci/mybranch"
refs/heads/for-ci*) true ;;
# always build your integration branch
refs/heads/my-integration-branch) true ;;
# don't build any other branches or tags
*) false ;;
esac
那是:
git -c protocol.version=2 clone \
--no-tags \
--single-branch \
-b ci-config \
--depth 1 \
--no-checkout \
--filter=blob:none \
https://github.com/${{ github.repository }} config-repo \
&& \
cd config-repo \
&& \
git checkout HEAD -- ci/config
這是:
enabled=yes
if test -x config-repo/ci/config/allow-ref &&
! config-repo/ci/config/allow-ref '${{ github.ref }}'
then
enabled=no
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.