Bitbucket と連携して自動実行する Jenkins Declarative Pipeline ジョブの作り方
Bitbucket リポジトリへの Push を契機に動作する Jenkins ジョブを作ってみる。
今回は Declarative Pipeline を使い、いずれかのブランチに Push があったら develop ブランチでテストを実行する、というモノを作ってみよう。
いくつか Bitbucket のバグとかでハマったので、手順とともに注意点を紹介。
目次
- 1. Bitbucket 上で「Bitbucket Server Webhook to Jenkins」フックを設定する
- 2. Jenkins 上で Pipeline ジョブを作成する
- 3. Jenkinsfile を作成する
- 4. ジョブを手動実行する
- 完
1. Bitbucket 上で「Bitbucket Server Webhook to Jenkins」フックを設定する
まずは、ブラウザで Bitbucket の対象リポジトリを開き、左メニュー最下部の「設定」リンク → サブメニュー「ワークフロー」 → 「フック」リンク、と進み、 「Bitbucket Server Webhook to Jenkins」フックを「有効化」 する。
設定用のモーダルが開いたら、以下のように設定する。
- Jenkins URL : Jenkins サーバの URL を指定する
- Repo Clone URL : 「SSH」を選択する
- 右の Read-Only なテキストボックスに表示される「
ssh://git@ ... .git
」という URL は、Pipeline で使用する Git URL となるので、控えておくと良い。
- 右の Read-Only なテキストボックスに表示される「
- Skip SSL Certificate Validation : チェックする
- 必須ではないが、連携時の認証を緩めに設定しておく
- Omit Branch Name : チェックする
- Jenkins のバグでココにチェックを入れないと上手く Push 連携できない
- 参考 : JENKINS-38447 Bitbucket hooks don't work for Pipeline jobs - Jenkins JIRA
- ジョブの実行対象外としたいブランチがある場合は、Advanced Configration → Branch Options : 「Ignore from:」を選択し、無視したいブランチ名を指定する。例えば
feat*
などとすれば、feature ブランチに Push された場合に Jenkins 連携されなくなる。
ここまで出来たら、「Trigger Jenkins」ボタンを押下して動作確認する。「Success!」と表示されたら成功。
次のようなエラーが表示される場合は、Jenkins 側が受け取ったフックを無視してしまっていると思われる。
Error: Jenkins response: No git jobs using repository: ssh://git@【リポジトリ URL】.git and branches: master
No Git consumers using SCM API plugin for: ssh://git@【リポジトリ URL】.git
Jenkins サーバのコンソールログに no trigger, or post-commit hooks disabled, on 【リポジトリ名】
といったログが出力されていると思われる。この問題は「Omit Branch Name」にチェックを入れることで回避できるはず。
2. Jenkins 上で Pipeline ジョブを作成する
ブラウザで Jenkins のトップ画面を開き、左メニューの「新規ジョブ作成」リンクを押下、ジョブ名を決め、「パイプライン」を選択する。
ジョブの設定画面に移ったら次のように設定し、「保存」する。
- ビルドトリガ
- Build when a change is pushed to BitBucket : チェックする
- SCM をポーリング : チェックする。「スケジュール」は空欄のままで良い
- パイプライン
- その場に Declarative Pipeline を書くなり、別の Git リポジトリから Jenkinsfile を取得するなり、やり方はおまかせ
3. Jenkinsfile を作成する
以下のように Jenkinsfile を作成する。
pipeline {
// エージェント : 「any」で良い
agent any
// ビルドトリガ : ジョブ設定画面の「ビルドトリガ」で選択したものと同じトリガを念のため記述しておく
triggers {
bitbucketPush() // 「Build when a change is pushed to BitBucket」相当
pollSCM('') // 「SCM をポーリング」相当
}
options {
// ビルドの保存最大数を設定する
buildDiscarder(logRotator(numToKeepStr: '5'))
}
// 変数定義
environment {
// チェックアウトするブランチ名を指定する
BRANCH = 'develop'
// プロジェクト・リポジトリ URL
GIT_URL = 'ssh://git@【プロジェクト・リポジトリ URL】.git'
// リポジトリ・ブラウザ URL
BROWSER_URL = 'http://【Bitbucket リポジトリ・ブラウザ URL】/browse'
}
stages {
stage('Git チェックアウト') {
steps {
// Push を監視しチェックアウトする
checkout poll: true,
scm: [
$class: 'GitSCM',
branches: [[name: "origin/${BRANCH}"]],
browser: [
$class: 'BitbucketWeb',
repoUrl: "${BROWSER_URL}"
],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: '【認証情報】',
url: "${GIT_URL}"
]]
]
}
}
stage('テスト実行') {
steps {
// ここでは npm パッケージのテストを実行するテイ
nodejs(configId: '【.npmrc ファイル】', nodeJSInstallationName: '【利用する Node.js】') {
// Jenkins サーバの OS に応じて「bat」か「sh」を使用する
bat 'npm install'
bat 'npm test'
}
}
}
}
post {
always {
// ワークスペースを削除する
deleteDir()
}
}
}
「テスト実行」部分は対象のプロジェクトに合わせて適宜実装する。
4. ジョブを手動実行する
作成した Pipeline ジョブの左メニューから「ビルドの実行」リンクを押下し、動作確認する。
- Pipeline の構文エラーや、接続先誤り等がないか確認しておく。
- Push 時の自動連携は、一度ジョブを手動実行しておかないと有効にならないため、ジョブを新規作成したり、ジョブ設定を変更したりした場合は、必ず一度手動実行しておくこと。
Git関連のプラグインは、必ず一度手動実行しておく必要があります。
手動実行することでJenkinsノード上でgitのcheckoutを行っているようです。
完
これにて作成完了。ここまで辿り着くのに地味に苦労した…。