GitLabのWebhookを使ってAnsible Towerと連携する方法


GitLabのリポジトリに対してPushをトリガーにAnsible Towerのワークフローをキックして結果のステータスをGitLabのリポジトリへ反映する方法です。

イメージ

以下はイメージ図です。

ユーザーがリモートのリポジトリにpushをしたタイミングでWebhookサーバにWebhookを飛ばしてAnsible TowerのWFを実行し結果をGitLabに反映します。

環境

コンポーネント バージョン 備考
CentOS 7.7 Webhookサーバ
RHEL 7.6 Ansible Towerサーバ
GitLab 12.2.5
Ansible Tower 3.5.1
Webhook 2.6.10 Go製

Webhook

Webhookインストール

インストール方法は以下を参照してください。

Webhook設定

Webhookは以下のように設定します。

trigger-ruleX-Gitlab-Token に設定してある value は以下のコマンドでランダムに生成しています。

これは、GitLabからWebhookを受け取ったときに同じ値のX-Gitlab-Tokenヘッダーがあれば実行すると言うルールです。
Webhookで実行されるスクリプトの引数は以下の通りです。

引数番号 name 説明
1 project_id プロジェクトのID
2 checkout_sha リポジトリへコミットしたハッシュ値
3 project.web_url リポジトリへのWeb URL

スクリプト

Webhookの条件が満たされた場合に実行されるスクリプトは以下のように作成しています。

スクリプトで取り扱う変数は以下の通りです。

変数名 説明 備考
project_id GitLabのプロジェクトのID 1番目の引数
commit_hash GitLabのコミットハッシュ値 2番目の引数
gitlab_server GitLabサーバのホスト 3盤面の引数
gitlab_token GitLabで生成したToken
ansible_tower Ansible Towerのホスト
ansible_user Ansible Towerのユーザー
ansible_password Ansible Towreのパスワード
ansible_wf 実行するAnsible Towerのワークフロー名

gitlab_token は次のGitLabのTokenの発行で発行した値を指定します。

GitLab

Tokenの発行

GitLabのリポジトリに外部からアクセスするようのトークンを生成します。

ユーザーSettings をクリックします。

Access Token をクリックして Name を入力し api にチェックを入れ Create personal access token をクリックします。

生成されたトークンを控えておきます。

Webhook設定

リポジトリの SettingsIntegrations をクリックします。

URL にwebhookのURLを入力し SecretToken にコマンドでランダムに生成した値を入れ Add webhook をクリックします。

Ansible Tower

Playbook

Playbookは以下の3つを作成しました。

Playbook 説明
main.yml pingモジュールを実行する
gitlab-build-status-running.yml GitLabリポジトリステータスを running にする
gitlab-build-status-success.yml GitLabリポジトリステータスを success にする
gitlab-build-status-failed.yml GitLabリポジトリステータスを failed にする

GitLabのリポジトリステータスはWeb API経由で変更しています。
APIドキュメントは以下を参照してください。

main.yml

gitlab-build-status-running.yml

gitlab-build-status-success.yml

gitlab-build-status-failed.yml

Project設定

Template設定

ansible-tower-gitlab-wf-main

main.ymlを実行するTemplateです。

GitLab Build Status Running

gitlab-build-status-running.ymlを実行するTemplateです。

GitLab Build Status Success

gitlab-build-status-success.ymlを実行するTemplateです。

GitLab Build Status Failed

gitlab-build-status-failed.ymlを実行するTemplateです。

Workflow Template設定

ansible-tower-gitlab-wf

今回作成したPlaybookを組み合わせて実行させるWorkflow Templateです。

SURVEYは以下のようにしています。
GitLab_TOKEN をAnsible Towerの履歴から見れないようにマスクしています。

Workflowは以下のように作成しています。

番号 説明
(1) GitLabのリポジトリステータスをrunningに変更
(2) テスト処理、ここでは例としてpingするだけのPlaybookを実行
(3) 問題なければGitLabのステータスをsuccessに変更
(4) 失敗した場合はGitLabのステータスをfailedに変更

デモ

実際に動かしてみたデモです。

Demo to run CI with Ansible Tower workflow by combining Ansible Tower and GitLab from sky_joker on Vimeo.

最後に

Ansible TowerとGitLabとWebhookを組み合わせる事でAnsible TowerのワークフローでCIちっくなことが出来そうですね。
ただ、今まで通りのCIツール(TravisとかShippabletとかJenkinsなど)ではないので、CIファイルにコマンド書きではなくPlaybookを作る必要があります。
なので、向き不向きがかなり分かれそうな感じがします。
どういったユースケースの場合だと便利かは今後も検証して確認してみようと思います 🙂

それでは、みんなでハッピーオートメーション!

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください