Corredor

ウェブ、プログラミングの勉強メモ。

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

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

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

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

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

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 となるので、控えておくと良い。
  • Skip SSL Certificate Validation:チェックする
    • 必須ではないが、連携時の認証を緩めに設定しておく
  • Omit Branch Name:チェックする
  • ジョブの実行対象外としたいブランチがある場合は、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を行っているようです。

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