ワークフロー Pro
ワークフローを使うと、複数のタスクテンプレートを分岐、承認、時間待ちを含む有向グラフ (DAG) として連結できます。ワークフローの実行は各ステップの完了に合わせて自動的に進みます。グラフは ビジュアルエディターで一度設計し、その後はワークフローのページから実行を開始します。
ワークフローは Semaphore Pro の機能です。ワークフローのメニュー項目は、サブスクリプションに 含まれている場合にのみ表示されます。
概要
ワークフローは次の要素で構成されます。
- ノード — グラフ内のステップです(テンプレートの実行、承認の待機、一定時間の待機、 メモによる注記)。
- エッジ — ノード間の接続です。それ ぞれに 条件 のラベルが付き、後続のノードを いつ開始するかを制御します。
ワークフローを開始すると、Semaphore は ワークフローの実行 を作成します。進行はサーバーが 制御します。タスクが完了し、承認が解決され、待機時間が経過するたびに、エッジの条件に従って 後続のノードが開始されます。
ワークフローの作成
- プロジェクトを開き、ワークフロー に移動します。
- 新しいワークフロー をクリックします。
- グラフィカルエディターで次の操作を行います。
- パレットからキャンバスにノードをドラッグします。
- あるノードの出力ハンドルから別のノードへドラッグして、ノードを接続します。
- ノードまたはエッジをクリックすると、サイドパネルでそのプロパティを編集できます。
- 名前 を設定します(必要に応じて、実行のバージョン管理用に 開始バージョン も設定します)。
- 問題 パネルに表示されている問題を解消し、保存 をクリックします。

エディターは保存前にグラフを検証します。有効なワークフローには、少なくとも 1 つのノードがあり、 開始ノ ードがちょうど 1 つ(入力エッジを持たないノード)あり、循環がなく、実行可能なすべての ノードの構成が完了している必要があります。
ノードの種類
| 種類 | 目的 |
|---|---|
| タスク | タスクテンプレートを実行します。タスクパラメーター により、ノードごとにテンプレートのパラメーター(インベントリ、変数グループ、Ansible の limit、追加の CLI 引数)を上書きできます。 |
| 承認 | 権限を持つユーザーが承認または却下するまで、実行を一時停止します。必要に応じてタイムアウト(秒)と承認メッセージを設定できます。 |
| 待機 | 設定した秒数だけ待ってから、後続のノードに進みます。冷却期間、メンテナンスウィンドウ、依存するステップの間隔調整などに便利です。 |
| メモ | キャンバス上の自由形式の注記です。メモのノードは実行されず、エッジで接続されることもありません。ドキュメント用の要素です。 |
合流
複数の入力エッジを持つノードは、上流のノードの すべて の完了を必要とするか(既定)、 いずれか 1 つの完了で進むかを指定できます。ノードのプロパティパネルで 合流 を設定します。
待機ノード
待機ノードは、設定した時間(最短 1 秒)だけワークフローの実行を一時停止します。待機中は 次のようになります。
- 実行は running のステータスのままです。
- 実行のビューでは、待機ノードにカウントダウンがリアルタイムで表示されます。
- エッジで接続された後続のノードは、待機が完了するまで開始されません。
待機が有効な間にワークフローの実行が 停止 された場合、待機はキャンセルされ、実行は stopped のステータスで終了します。
承認ノード
実行が承認ノードに到達すると、誰かが承認または却下するまでステータスが approval に 変わります。実行のビューに承認/却下の操作が表示されます。却下された承認は、接続されている エッジの条件に従って実行を失敗させます。
エッジの条件
各エッジには、後続のノードがいつ実行可能になるかを決める条件があります。
| 条件 | 上流のノードが次の状態になったときに後続が開始します |
|---|---|
| 成功時 | 正常に完了したとき(既定)。 |
| 失敗時 | エラーで完了したとき。 |
| 常に | 終了状態(成功または失敗)のいずれかで完了したとき。 |
失敗時 の分岐は、補償処理や通知に使用します。結果に関係なく次のステップを実行する場合は 常に を使用します。
実行と監視
- ワークフローを実行 — ワークフローの一覧から新しい実行を開始します。
- 実行のビュー — 各ノードのステータス(実行中、成功、失敗、承認、待機のカウントダウン)を リアルタイムで表示する全画面のグラフです。
- 停止 — 実行が
runningまたはapprovalの間、run_project_tasksを持つユーザーは 実行を停止できます。実行中のすべてのタスクが停止され、保留中の承認は却下され、実行は stopped としてマークされます。
実行のステータス: running、approval、success、failed、stopped。
実行のバージョン管理
ワークフローに 開始バージョン(たとえば 1.0.0)を設定すると、各 実行にバージョンの
ラベルが付きます。Semaphore はビルドテンプレートと同様に、実行ごとにバージョンを増加させます。
出力と入力
タスクノードは、後続のノードに構造化されたデータを引き渡すことができます。タスクは 出力を生成 します。 出力とは名前付きの値からなる JSON オブジェクトで、タスクが成功するとタスクとともに保存されます。 次のタスクノードへの接続は 入力を受け渡し ます。つまり、直前のノードの出力で、そのノードの テンプレートのサーベイ変数を埋めます。受け渡されるのはファイルではなく、値だけです。
出力の生成
ワークフローの実行によって開始されたすべてのタスクは、環境変数 SEMAPHORE_OUTPUTS_FILE を受け取ります。
これは、そのタスク専用に作成された空のファイルのパスです。タスクがこのファイルに JSON オブジェクトとして
書き込んだ内容が、そのタスクの出力になります。
| アプリ | 出力の生成方法 |
|---|---|
| Ansible | per_host: false(既定)を指定した ansible.builtin.set_stats。同梱の semaphore_outputs コールバックプラグインが、集計された実行の統計をファイルに書き込みます。ホストごとの統計は出力になりません。 |
| Terraform, OpenTofu, Terragrunt | 実行が成功した後、output -json から自動的に取得されます。タスク自身がファイルに書き込んだ値は、同じ名前の取得された出力より優先されます。 |
| Bash, Python, PowerShell, Pulumi | スクリプトがファイルに書き込みます。 |
# Bash: 出力ファイルに書き込む
cat > "$SEMAPHORE_OUTPUTS_FILE" <<EOF
{"image_tag": "1.4.2", "replicas": 3, "subnet_ids": ["subnet-1", "subnet-2"]}
EOF
# Ansible: set_stats が出力になる
- name: Publish the image tag for the next nodes
ansible.builtin.set_stats:
data:
image_tag: "{{ built_tag }}"
ルール:
- 出力は、タスクが 成功 した場合にのみ読み取られます。失敗または停止したタスクには出力がないため、 失敗時 の分岐は、失敗したノードから何も受け取りません。
- 出力の名前は
^[A-Za-z_][A-Za-z0-9_-]*$に一致します。値には、文字列、数値、真偽値、リスト、 オブジェクトなど、任意の JSON の値を使用できます。 - 制限: ファイルは最大 256 KB で、出力は最大 100 個、それぞれ最大 32 KB です。
- ファイルが存在しないか空の場合は「出力なし」を意味します。JSON オブジェクトでないファイル、不正な名前を 使用しているファイル、制限を超えるファイルは タスクを失敗させ、その理由がタスクのログに記録されます。
- 保存できない Terraform の出力(
sensitiveが指定されたもの、大きすぎるも の、名前が不正なもの、 制限を超えるもの)はスキップされ、タスクのログとタスクの 出力 (Outputs) パネルに 未取得 (Not captured) として一覧表示 されます。これらがタスクを失敗させることはありません。
入力の受け渡し
タスクノードで終わる接続をクリックすると、そのサイドパネルに 入力 (Inputs) セクションがあります。
- 名前で受け渡し(既定)。送り元のノードの出力のうち、名前が送り先のテンプレートのサーベイ変数と 一致するものが、その変数に入ります。一致する変数のない出力は無視されます。ハイフンを含む Terraform の 出力は有効な変数名にならないため、受け渡されません。
- 入力を明示的にマッピング (Map inputs explicitly)。チェックボックスをオンにすると、一覧に指定したペア(送り先の テンプレートのサーベイ変数と、その値の元になる出力のキー)だけが受け渡されます。一覧が空の場合は 何も受け渡されません。ワークフローに完了した実行があると、パネルはその実行で生成されたキーを候補として 表示し、取得されなかったキーには印を付けます。
どの接続からも値が入らない変数には、ノードに設定された値が、それもなければ変数のデフォルト値が使われます。 値のない 必須 の変数があると、ノードのタスクは開始前に失敗し、その変数名を示すログ行が記録されます。 そのため、 実行はその 失敗時 のエッジに従います。
値は変数のタイプに変換されます。int 変数は数値または数字の文字列を受け付け、enum または select
変数は自身の選択肢のみを受け付け、string または text 変数は任意の値を受け付けます(オブジェクトや
リストはコンパクトな JSON として渡されます)。タイプに合わない値は無視され、その理由がタスクのログに
記録され、フォールバックの値が適用されます。
承認ノードと待機ノード は出力をそのまま通過させます。task → approval → task でもデータは
受け渡され、最後の接続のモードが適用されます。
1 つのノードへの複数の接続。 送り元が成功した接続は、それぞれ値を提供します。2 つの接続が同じ変数を 埋める場合は、明示的なマッピングが名前による受け渡しより優先されます。同じ種類どうしでは先に作成された 接続が優先されるため、実行のたびに同じ結果になります。優先された接続はタスクのログに記録されます。

