web-dev-qa-db-ja.com

プッシュイベントでGitHubアクションジョブをスキップする方法

Travis CIを使用すると、コミットにサフィックスを追加して、特定のコミットのビルドをスキップできます。これは Travis CI で説明されています。コード関連ではないREADME.mdのみを編集し、プリフライトビルドをトリガーする必要がない場合、この機能は実用的です。

[skip ci]

GitHubアクションを使用して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
5
Nikolas

Git 2.27(2020年第2四半期)は別のアプローチを示しています。アクションを介して常にGitHubですべてのブランチを構築する代わりに、ユーザーはどのブランチを構築するかを指定できます。

Jeff King(peff による commit e76eec (2020年5月7日)を参照してください。
Junio C Hamano-gitster- によってマージ commit dd4a287 、2020年5月13日)

ci :GitHubアクションのブランチごとの構成を許可

サインオフ:Jeff King

個々の開発者のワークフローに応じて、GitHubアクションCIジョブがすべてのブランチで実行されるのは便利な場合もあれば、煩わしい場合もあります。

煩わしい例として、途中で終了している作業中のブランチを多数持ち、それらをマスターに対して頻繁にリベースすると、興味深い(大量のCPUは言うまでもありません)多数の障害レポートが表示されます。

このコミットは、リポジトリ内の特別なブランチでCI構成をチェックする新しいジョブを追加し、そこにあるシェルスクリプトを実行して、残りのテストをスキップするかどうかを決定します

デフォルトでは、そのブランチまたはスクリプトがない場合、すべての参照のテストが引き続き実行されます。

いくつかの代替案が議論されてきました:

1つのオプションは、ツリー自体(ワークフローYAMLファイルを変更する)またはコミットメッセージ(「[skip ci]」フラグなど)のいずれかで、テストする必要があるかどうかに関する情報をコミット自体に含めることです。しかし、これらは苛立たしく、エラーが発生しやすいものです。

  • マークしたい各ブランチに手動で適用する必要があります
  • パッチの電子メール送信など、他のワークフローに漏れるのは簡単です

同様に、ブランチ名から情報を取得することもできます。しかし、これはデフォルトを「オフ」にするか「オン」にするかについての議論につながり、オーバーライドは依然としてやや厄介です。
デフォルトで「オン」になっている場合、CIをスキップするには、ブランチに適切な名前を付けることを忘れないでください。
そして「オフ」の場合、ブランチ名を歪めるか、追加のrefspecでプッシュを複製する必要があります。

比較すると、このコミットのソリューションでは、一度設定を指定すればそれを忘れることができ、すべてのデータは独自の参照でオフになり、メインに触れることなく個々のフォークで変更できますツリー

リスト上の議論から生まれたいくつかの設計上の決定がありました。ここで要約します。

  • 実際のチェックアウトではなく、GitHubのAPIを使用して構成参照を取得することができます(その後、JavaScriptを介して操作するだけです)。
    VMを起動して、ネットワーク経由でいずれかの方法でGitHubに連絡する必要があるため、結果的にそれほど高速ではなくなります。
    私は他のツールと同様のものを維持するためにシェルを使用することを選択しました(そして本当にあなたが望む任意の言語で許可参照を実装することができました)これにより、スクリプトをローカルでテストし、通常の git.git ツリーのコンテキスト内でスクリプトを変更することも簡単になります。

  • ブランチの名前空間が乱雑になるのを避けるために、既知のrefnameをrefs/heads/に含めないようにすることができます。しかし、それでは操作が面倒になります。
    対照的に、「 git checkout ci-config 」だけで変更できます。

  • ci-config refには、config(つまり、残りの git.git とは無関係のブランチ)以外は何も含まれていないと想定できます。
    しかし、孤立したブランチを扱うのは厄介です。代わりに、浅い部分クローンを使用してci/configディレクトリのみを効率的にチェックアウトするように最善を尽くします。これにより、ci-configブランチを通常のブランチにして、構成を変更できます。

  • refパターンの静的リストのような、よりシンプルなインターフェースを提供できます。
    しかし、とにかく全体をスピンアップすることはできません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
1
VonC