ワークフローのマニフェスト
ワークフローは YAML フォーマットで記述された マニフェスト(Manifest) により定義されます:
このマニフェストを記述し、Shisho Cloud 上のワークフローを作成することで、監査・検査やその後の対応をコードとして定義できます。
大構造
ワークフローのマニフェストは、以下の 5 つから構成されます:
version
: 定数 (0.1.0
)id
: ワークフローに対する一意な IDname
: ワークフローのわかりやすい表示名triggers
: ワークフローの実行タイミングの設定jobs
: ワークフロー内で行う監査・監査やその後の対応の設定
つまり、ワークフローのマニフェストは、以下のようなフォーマットに従う YAML ファイルだということです:
version: 0.1.0
id: "example-workflow"
name: "Example"
triggers:
# ...
jobs:
# ....
トリガー
ワークフローは複数の トリガー を triggers
ブロックとして定義します:
version: 0.1.0
id: "example-workflow"
# 複数のトリガーの定義
triggers:
# ...
1 つ 1 つのトリガーは、そのワークフローがいつ実行されるべきかを定義するものです。「一定時間おきにトリガーを実行する」といった時間に基づく定義や、「他サービスからの Webhook メッセージを受け取ったら実行する」というようなイベントに基づく定義が利用できます。
より具体的には、以下のようなトリガーを利用できます:
schedule
トリガーgithub
トリガー
schedule
トリガー
schedule
トリガーは、cron
フォーマットを用いてワークフローの実行タイミングを定義するためのトリガーです。
schedule
トリガーには cron
フォーマットでの実行タイミング設定を 1 つ以上含めることができ、少なくとも 1 つの cron 設定にマッチする時刻 にワークフローが実行されるようになります。
例えば、以下のようなトリガーを持つワークフローは 10 分おきに実行されます:
version: 0.1.0
id: "example-workflow"
triggers:
schedule:
# 10 分おきに実行
- cron: "*/10 * * * *"
# ...
以下は複数の cron
設定を含む schedule
トリガーの例です:
version: 0.1.0
id: "example-workflow"
triggers:
schedule:
- cron: "*/10 * * * *"
- cron: "*/30 * * * *"
# ...
複数の cron
設定が、同一時刻でのワークフローの実行を指示する場合であっても、ワークフローの実行は 少なくとも 1 回 しか保証されません。
github
トリガー
github
トリガーは、GitHub から Shisho Cloud に対して届けられた Webhook メッセージを用いてワークフローの実行タイミングを定義するためのトリガーです。
github
トリガーには、Webhook メッセージに基づくワークフローの実行条件を、1 つまたは複数個設定できます。
そのような設定のもと、GitHub から届いた Webhook メッセージが少なくとも 1 つの設定にマッチする場合 にワークフローが実行されるようになります。
例えば、以下のようなトリガーを持つワークフローは、各リポジトリのデフォルトブランチに対する push イベントが発生した際に実行されます:
version: 0.1.0
id: "example-workflow"
triggers:
github:
- push:
branches:
- :default_branch
以下は複数の条件を含む github
トリガーの例です:
version: 0.1.0
id: "example-workflow"
triggers:
github:
- push:
branches:
- :default_branch
- push:
branches:
- staging
GitHub が Webhook メッセージを通して配信するイベント情報のうち、Shisho Cloud は現在、以下のようなイベントを処理できます:
push
イベント (GitHub によるドキュメント)pull_request
イベント (GitHub によるドキュメント)
push
イベントの処理
push イベントに基づきワークフローの実行を制御する場合、以下のようなフィルタをご利用いただけます:
organization
: push 先のリポジトリが所属する GitHub Organization 名が、指定した文字列と一致するname
: push 先のリポジトリ名が、指定した文字列と一致するpush.branches
: 指定された パターン のうち、少なくとも 1 つに push 先のブランチ名が一致する- パターンと push 先ブランチ名を比較する際には、パターン中の以下の文字/文字列が特殊な挙動 をとる
*
:/
を除く 1 文字以上の文字列にマッチ**
: 1 文字以上の文字列にマッチ- 3 つ以上
*
が続く場合:*
が奇数個: 最後が/
でない 1 文字以上の文字列*
が偶数個: 1 文字以上の文字列にマッチ
- パターンが以下のどれかに完全一致する場合、一致の検証は特別な挙動をとる
:default_branch
: パターンと push 先ブランチ名を比較する代わりに、当該リポジトリのデフォルトブランチ名と push 先ブランチ名を比較する
- パターンと push 先ブランチ名を比較する際には、パターン中の以下の文字/文字列が特殊な挙動 をとる
push.branches_ignore
: 指定された パターン のどれとも push 先のブランチ名が一致しない- パターン中では
branches
同等の特殊文字・特殊な識別子が利用可能
- パターン中では
push.tags
: 指定された パターン のうち少なくとも 1 つに push されたタグ名が一致する- パターンと push されたタグ名を比較する際には、パターン中の以下の文字/文字列が特殊な挙動をとる
*
:/
を除く 1 文字以上の文字列にマッチ**
: 1 文字以上の文字列にマッチ- 3 つ以上
*
が続く場合:*
が奇数個: 最後が/
でない 1 文字以上の文字列*
が偶数個: 1 文字以上の文字列にマッチ
- パターンと push されたタグ名を比較する際には、パターン中の以下の文字/文字列が特殊な挙動をとる
push.tags_ignore
: 指定された パターン のどれとも push されたタグ名が一致しない- パターン中では
tags
同等の特殊文字が利用可能
- パターン中では
上述のフィルタが複数指定された場合は、それらは AND 条件として扱われます。つまり、全てのフィルタにマッチする場合のみ、ワークフローが実行されるようになります。
以下は上述のフィルタの利用例です:
triggers:
github:
# GitHub からの push イベントに基づきワークフローを実行する。ただし:
# - octcat/Hello-World に対する push イベントのみに反応する
# - staging ブランチ、または feat/ から始まるブランチにのみ反応する
- organization: "octcat"
name: "Hello-World"
push:
branches:
- staging
- feat/**
pull_request
イベントの処理
pull_request
イベントに基づきワークフローの実行を制御する場合、以下のようなフィルタをご利用いただけます:
organization
: push 先のリポジトリが所属する GitHub Organization 名が、指定した文字列と一致するname
: push 先のリポジトリ名が、指定した文字列と一致するpull_request.types
:pull_request
イベントの種別が、指定したリストの中に含まれるpull_request.branches
: 指定された パターン のうち、少なくとも 1 つにpull_request
のベースブランチ名が一致する- パターンと
pull_request
の ベースブランチ名を比較する際には、パターン中の以下の文字/文字列が特殊な挙動をとる*
:/
を除く 1 文字以上の文字列にマッチ**
: 1 文字以上の文字列にマッチ
- パターンが以下のどれかに完全一致する場合、一致の検証は特別な挙動をとる
:default_branch
: パターンとpull_request
のベースブランチ名を比較する代わりに、当該リポジト リのデフォルトブランチ名とpull_request
のベースブランチ名を比較する
- パターンと
PULL_REQUEST.branches_ignore
: 指定された パターン のどれともpull_request
のベースブランチ名が一致しない- パターン中では
branches
同等の特殊文字・特殊な識別子が利用可能
- パターン中では
上述のフィルタが複数指定された場合は、それらは AND 条件として扱われます。つまり、全てのフィルタにマッチする場合のみ、ワークフローが実行されるようになります。
以下は上述のフィルタの利用例です:
triggers:
github:
# GitHub からの pull_request イベントに基づきワークフローを実行する。ただし:
# - octcat/Hello-World に対する pull_request イベントのみに反応する
# - synchronize, opened, reopened イベントにのみ反応する
- organization: "octcat"
name: "Hello-World"
pull_request:
types:
- synchronize
- opened
- reopened
ジョブ
ワークフローは複数の ジョブ(Job) を定義します:
version: 0.1.0
id: "example-workflow"
# 複数のジョブの定義
jobs:
# ....
一つ一つのジョブは以下を含んでいます:
id
: ジョブのワークフロー内で一意な IDname
: ジョブのわかりやすい表示名decide
: どんなデータを・どのように検査/監査するかnotify
(optional): ジョブ実行の各フェーズにおいて、どのように通知するか