簡體   English   中英

如何在推送事件中跳過 GitHub Actions 作業?

[英]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 方法,每個人都需要一些不同的東西。 以下是為快速導航列出的答案:

所有答案都值得一票! 如果你喜歡我的問題,你應該對答案加倍喜歡

更新:請參閱 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 事件上觸發的工作流將被跳過。

鏈接: Github Actions 更新日志,2021 年 2 月

此外,對於您希望在所有推送中忽略的文件和目錄, 您可以配置工作流本身:

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

.github/workflows要做的所有操作

  • 簽出特殊分支和其中的特殊腳本:

那是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM