【Jenkins】Bitbucketとの連携を設定する

開発したソースをGitにプッシュ、Bitbucketで管理、Jenkinsを使ってCIをしたい!そんなときのBitbucketとJenkinsの設定方法について、記載します。因みに今回はJenkinsはローカルPCで動かすことを前提とします。

やりたいこと

今回やりたいことは、Jenkinsで自動的にGitのリポジトリを複製したいということ。しかし、管理しているのはBitbucketになるため、リポジトリを取得する先はBitbucketになることに注意です。

準備

他サイトで紹介されているところも多いため、その内容は参照HPを見てください。以下の内容を準備した状態で行います。

Bitbucketで公開鍵を登録する

JenkinsでGitのリポジトリを複製するには、Bitbucketの認証が必要です。そのためには「公開鍵」と「秘密鍵」を作り、右のように配置する必要があります。

公開鍵を作る

コマンドプロンプトを起動し、以下の内容を入力します。

ssh-keygen

途中でファイル出力するファイルのパスを聞かれます。デフォルトのファイル名でいいので、以下のように入力します。
※「ユーザ名」はご自身のユーザ名に変えてください

Enter file in which to save the key (C:\Users\ユーザ名\.ssh\id_rsa): C:\Users\ユーザ名\.ssh\id_rsa

結果、実際に作成されたかを「C:\Users\ユーザ名/.ssh/」で確認してください。3つのファイル「id_rsa」「id_rsa.pub」「id_rsa.ppk」が作成されています。
※「id_rsa.ppk」は秘密鍵のファイルなっているため、ほかの人に盗まれるとマズいです。管理には注意が必要です。

Bitbucketへ公開鍵を登録

次に作成した公開鍵をBitbucketに登録します。Bitbucketのアカウントでログインし、Jenkinsで複製したい、リポジトリを選択します。その後、画面に表示されている「設定」を押します。

ここで表示されている、「アクセスキー」で公開鍵の登録を行います。「鍵の追加」のボタンを押します。

以下のような画面が表示されたら、先程作成した「id_rsa.pub」をテキストエディタで開きます。書かれている内容をすべてコピーし、「Key」のボックスに貼り付けます。「Label」はアクセスキーの名前として画面に表示されるだけなので、何でもOKです。その後、「鍵の追加」を押して画面が閉じれば、登録完了。

sshとGitの設定

Bitbucketへの接続をsshで認証するために設定を行います。そのために「設定ファイルの作成」と「Gitのリンク」を行う必要があります。

設定ファイルの作成

設定ファイルは最初に作成した鍵と同じフォルダに作成します。拡張子なしで作るために、コマンドプロンプトで以下の内容を入力します。
※「ユーザ名」はご自身のユーザ名に変えてください。

cd c:\Users\ユーザ名\.ssh
type config > config

これでファイルが作成できたので、「c:\Users\ユーザ名.ssh」の「config」をテキストエディタで開きます。以下の内容をファイルに入力し、保存します。
※何度も言いますが、「ユーザ名」はご自身のユーザ名に変えてください。

Host bitbucket.org
  Hostname bitbucket.org
  User git
  Port 22
  IdentityFile "C:\Users\ユーザ名\.ssh\id_rsa"
  TCPKeepAlive yes
  IdentitiesOnly yes

Gitのリンク

現在の状態では、GitのコマンドでBitbucketへのアクセスしようとすると、拒否されリポジトリを複製できません。そこで、ここまで作成した鍵と設定でアクセスできるようにリンクさせます。やることは1つだけ、管理者権限でコマンドプロンプトを起動し、以下の内容を入力するだけです。
※「Program Files」のファイルをいじるには管理者権限が必要なため、管理者権限でコマンドプロンプトを起動します。

mklink "C:\Program Files\Git\etc\ssh\ssh_config" "C:\Users\ユーザ名\.ssh\config"

Jenkinsでクローンする

さて、やっとJenkinsに入ります。新規にジョブを作成し、実際にGitリポジトリを複製します。「新規ジョブ作成」を押し「ジョブ名」を入力後、「フリースタイル・プロジェクトのビルド」を押し、最後に「OK」を押します。

次にGitの設定をしますが、その前にBitbucketのページで複製したいリポジトリのURLを取得します。左の「+」「このリポジトリをクローンする」を押します。その後右上を「SSH」に変えて、表示されたURLを右の丸いボタンを押してコピーします。

そしてJenkinsに戻り、ジョブの「設定」を押した後、「ソースコード管理」で複製するリポジトリの設定を行います。先程コピーしたURLを「リポジトリURL」に貼り付けます。先頭に「git clone」がついている場合は消してください。

最後に認証情報を入力します。ここで最初に作成した秘密鍵id_rsa.ppk」をテキストエディタで開き、すべてコピーしておきます。リポジトリの「追加」を押し、下の画像のように秘密鍵を貼り付けます。
秘密鍵は他に貼り付けないように注意です。

ジョブ実行

ここまでの設定を行ったら、保存しジョブの実行を行います。問題なく実行が終わればOK!エラーが出ている場合は、以下の内容を参照してください。

エラーと対策

私がこの内容を構築した際に、引っかかったエラーは以下のもの。

ERROR: Error fetching remote repo 'origin'
hudson.plugins.git.GitException: Failed to fetch from https://〇〇〇〇〇@bitbucket.org/〇〇〇〇〇/リポジトリ
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:908)
    at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1123)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1159)
    at hudson.scm.SCM.checkout(SCM.java:505)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1206)

 (略)

stdout: 
stderr: git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

認証ができず、リポジトリを読むことができないというもの。Gitの設定が間違っている可能性があるため、上の「sshとGitの設定」を参考に再度確認してください。