WEB問題集
次はリポジトリの .github/workflows に置いたワークフローです。
name: ci
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm testこのワークフローの実行について正しい説明はどれですか。
解説
【正解: B】の理由
ワークフローの実行がトリガーされると、GitHub はイベントに関連付けられたコミット SHA または Git ref に存在するワークフロー ファイルを .github/workflows ディレクトリで検索し、そのバージョンのワークフローを実行する。既定のブランチの最新版が常に使われるわけではない点が判断の分かれ目になる。実行時には GITHUB_SHA と GITHUB_REF がランナー環境に設定される。
【他選択肢が違う理由】
- A: 実行に使われるのは既定のブランチの最新版とは限らない。イベントに関連付けられたコミット SHA または Git ref の時点にあるバージョンが使われる。
- C: GITHUB_SHA と GITHUB_REF は、ワークフローの実行時に GitHub がランナー環境へ設定する環境変数である。
- D: 実行がトリガーされるのは、発生したイベントと一致する on キーの値を持つワークフローだけである。
【参考】
ブランチ保護で必須のチェックにしている CI を、プルリクエストのコミットに [skip ci] を付けてスキップしたところ、マージできなくなりました。マージできるようにする方法として、最も適切なものはどれですか。
解説
【正解: C】の理由
on: push や on: pull_request のワークフローは、HEAD コミットのメッセージに [skip ci] などがあるとトリガーされない。こうしてスキップされたワークフローのチェックは「保留中」のまま残り、そのチェックを成功させる必要があるプルリクエストはマージが禁止される。マージできるようにするには、スキップ命令を含まない新しいコミットをプルリクエストにプッシュし、ワークフローを実行させてチェックを成功させればよい。
【他選択肢が違う理由】
- A: [no ci] もスキップ命令の 1 つで、ワークフローはトリガーされずチェックは保留中のまま残る。
- B: スキップされたワークフローのチェックは保留中のまま残り、待っても成功には変わらない。
- D: スキップ命令を含むコミットではワークフローがトリガーされず、再実行できる実行が無い。
【参考】
README だけを直すコミットでは、push で動く CI のワークフローを起動させたくありません。コミットの作り方として正しいものはどれですか。2 つ選択してください。
解説
【正解: A / B】の理由
on: push で動くワークフローは、プッシュの HEAD コミットのメッセージに [skip ci]、[ci skip]、[no ci]、[skip actions]、[actions skip] のいずれかの文字列があるとトリガーされない。A と B はこの一覧の文字列をメッセージに含めているので、push の CI は起動しない。スキップ命令が効くのは、その命令を含むコミットで起きた実行だけなので、次にふつうのコミットをプッシュすれば CI はまた動く。
【他選択肢が違う理由】
- C: --no-verify は Git のフックを飛ばすだけで、Actions のワークフローは起動する。
- D: --cleanup=verbatim は改行をそのまま残すだけで、スキップ命令にはならない。
- E: [skip checks] というスキップ命令は無い。正しくは [skip ci] などの文字列である。
【参考】
パスのフィルター処理やコミット メッセージが理由でワークフローがスキップされたときの影響として、最も適切なものはどれですか。
解説
【正解: C】の理由
パスのフィルター処理、ブランチのフィルター処理、コミット メッセージのいずれかを理由にワークフローがスキップされた場合、そのワークフローに関連付けられているチェックは保留中の状態のままになる。リポジトリが特定のチェックの通過を必須にしていると、これらのチェックを成功させる必要があるプルリクエストはマージが禁止される。スキップ命令を含まない新しいコミットをプルリクエストにプッシュして解消するのが実務上の手順になる。
【他選択肢が違う理由】
- A: スキップされたワークフローのチェックは成功にはならず、保留中のまま残る。
- B: チェックは失敗ではなく保留中であり、スキップ指示のない新しいコミットのプッシュで解消できる状態にある。
- D: チェックは一覧から消えるのではなく保留中として残り、必須チェックの判定に影響する。
【参考】
非アクティブな Issue を閉じる actions/stale のワークフローを、毎日 1:30(UTC)に定期実行したいと考えています。on.schedule に書く行として正しいものはどれですか。
解説
【正解: A】の理由
schedule の cron 式は、左から分・時・日・月・曜日の 5 つの欄で書き、時刻は UTC で解釈される。毎日 1:30 なら分に 30、時に 1 を置き、日・月・曜日は * にして 30 1 * * * と書く。チュートリアルの例もこの式で、毎日 1:30 UTC に実行され、一定期間動きの無い Issue にラベルやコメントを付けて閉じる。なお schedule は高負荷の時間帯に遅れることがあり、毎時の開始時点は混みやすいので、0 分ちょうどを避けた時刻にしておくとよい。
【他選択肢が違う理由】
- B: 1 欄目は分、2 欄目は時なので、時に 30 を置くこの式は 0〜23 の範囲を外れている。
- C: 3 欄目は日で、1 を置くと毎月 1 日の 1:30 だけに実行され、毎日にはならない。
- D: 5 欄目は曜日で、1 を置くと毎週月曜日の 1:30 だけに実行され、毎日にはならない。
