Bitbucket と連携して自動実行する Jenkins Declarative Pipeline ジョブの作り方

Bitbucket リポジトリへの Push を契機に動作する Jenkins ジョブを作ってみる。

今回は Declarative Pipeline を使い、いずれかのブランチに Push があったら develop ブランチでテストを実行する、というモノを作ってみよう。

いくつか Bitbucket のバグとかでハマったので、手順とともに注意点を紹介。

目次

1. Bitbucket 上で「Bitbucket Server Webhook to Jenkins」フックを設定する

まずは、ブラウザで Bitbucket の対象リポジトリを開き、左メニュー最下部の「設定」リンク → サブメニュー「ワークフロー」 → 「フック」リンク、と進み、 「Bitbucket Server Webhook to 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 のトップ画面を開き、左メニューの「新規ジョブ作成」リンクを押下、ジョブ名を決め、「パイプライン」を選択する。

ジョブの設定画面に移ったら次のように設定し、「保存」する。

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 ジョブの左メニューから「ビルドの実行」リンクを押下し、動作確認する。

Git関連のプラグインは、必ず一度手動実行しておく必要があります。
手動実行することでJenkinsノード上でgitのcheckoutを行っているようです。

これにて作成完了。ここまで辿り着くのに地味に苦労した…。