Gitbucket と Jenkins の連携

created at 2019-08-20 15:11+0900

digraph { graph[ rankdir = LR; nodesep = 0.5; ranksep = 0.8; ]; subgraph cluster_0 { label = "ubuntu"; subgraph cluster_1 { label = "docker_nw1"; proxy; jenkins[style=filled,bgcolor="#F3F3F3"]; gitbucket[style=filled,bgcolor="#F3F3F3"]; proxy -> {jenkins gitbucket}[style=dashed]; gitbucket -> jenkins[taillabel = "WebHook",labeldistance=3, labelangle = 50, fontsize = 8]; jenkins -> gitbucket[taillabel = "git checkout", labeldistance=4, labelangle = 25,fontsize = 8]; {rank=same; jenkins; gitbucket;} } } browser[label="ブラウザ"] browser -> proxy; }

See also ネットワーク図.

Gitbucket から Jenkins へ WebHook

Jenkins に gitbucket plugin をインストールして、GitbucketのService Hook設定にWebHookのURLを入力してテスト接続、、、、失敗。

gitbucket pluginで連携できて楽チンだと思ったのも何年前のことだろうか。gitbucket pluginはずいぶん前からアップデートされてないようで、Jenkinsのスパルタにはついて行ってないらしい。

ここいらへんを参考に、Gitbucketのapi/v3とやらを適用しようとしてみた。

しかしこんなメッセージが出て失敗。

INFO: Received PushEvent for https://gitbucket.r-square.net/api/v3/repos/Spinx/blog from 172.18.0.3 ⇒ http://jenkins:8080/github-webhook/
WARNING: Could not match URL https://gitbucket.r-square.net/api/v3/repos/Spinx/blog
WARNING: Malformed repo url https://gitbucket.r-square.net/api/v3/repos/Spinx/blog
WARNING: Could not match URL http://gitbucket:8080/git/Spinx/blog.git

api/v3に非対応ってことなのか?

JenkinsとGitbucketは、proxy越しのdockerコンテナでそれぞれ稼働しているためなのか?

  • ブラウザからアクセスする時は

    • https://gitbucket.r-square.net/

    • https://jenkins.r-square.net/

  • JenkinsとGitbucketが相互に通信する時は

    • http://gitbucket:8080/

    • http://jenkins:8080/

ちなみにJenkins から「ビルド実行」でビルドする分には成功している。

Jenkins-Crumb 入りでPOST

ここいらへんを参考にJenkins執事長のスパルタを乗り越えようとしてみた。

Jenkins ジョブ作成

  1. jenkins ジョブ作成画面を開く

  2. ビルドトリガーは「リモートからビルド」を選択

    • 認証トークンはテキトーに入力

  3. 保存する

アクセスユーザ用API TOKEN作成

  1. jenkins api でアクセスする専用ユーザをJenkins「ユーザの管理」にて作成する。

  2. そのユーザでJenkinsへログインし、ユーザの設定ページでAPI TOKENを発行する。

Jenkins-Crumb 取得

Jenkins API の crumbIssuer を使ってCrumbをもらう

curl -u "{ユーザID}:{ユーザのAPI TOKEN}" 'http://jenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

実行結果はこんな感じ

Jenkins-Crumb:ab0cdefg2h34i56j7890klmn1234opqr

ビルド実行

Jenkins-Crum をヘッダに設定し、ビルドしろやオラアAPIを呼ぶ

curl -X POST -u "sebastian:{ユーザのAPI TOKEN}" \
   -H "Jenkins-Crumb:ab0cdefg2h34i56j7890klmn1234opqr" \
   'http://jenkins:8080/job/{作成したジョブ名}/build?token={ジョブの認証トークン}'

Jenkinsのビルド履歴をみるとモリモリ実行されてた。

課題

  • JenkinsへアクセスできるネットワークにいるならばGitbucketホストからでなくてもトリガー出せるねえ。どこから出す?

  • nginx-proxy通さないでアクセスできるようにしたらWebHookできるのか?

    • JenkinsとGitbucketそれぞれにSSLかますのは、めんどくさいなあ。

    • せっかくサブドメインでカッチョよくアクセスできるのにモッタイナイ。

  • めんどくさいから「定期的に実行」でいいかもしんない

  • Jenkinsでビルドしたとして、デプロイ先はまた別のDockerコンテナなんだよなあ。どうやって持っていこうかな?てかパーミッション大丈夫か?

    • というのは、コンテナ間でrsyncせなアカンのか?と思ったから。

    • よく調べたら、コンテナ間で共有するためのVolume作って繋げたら良さげ。