前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Github対応のJenkinsコンテナの作成

JenkinsをDockerコンテナで構築しようと思い、GitHubのプライベートプロジェクトからチェックアウトしてくる過程でちょっと手こずったのでメモ。

環境

  1. ホストOS:Ubuntu 14.04

手順

  1. JenkinsのオフィシャルイメージをDocker Hubからpull
  2. コンテナにssh keyを生成して格納
  3. 2の処理を元にimageを作成
  4. 3で作成したimageからJenkinsを起動

Jenkinsイメージの取得

Docker Hubにオフィシャルのイメージがあるので今回はそれを使うことにする。
https://registry.hub.docker.com/_/jenkins/

$ sudo docker pull jenkins
...省略
$ sudo docker images
jenkins             latest              d89693226e95        2 weeks ago         670.8 MB

SSHキーの作成

GitHubに対してJenkinsからコードをチェックアウトするにはGitHubに対してSSHキーの登録が必要なので、https://help.github.com/articles/generating-ssh-keys を参考に作業を行う。

コンテナの起動
$ sudo docker run -t -i jenkins /bin/bash
SSHキーの作成
jenkins@0213dffe4304:/$ cd /var/lib/jenkins
jenkins@0213dffe4304:/var/lib/jenkins$ ssh-keygen -t rsa -C "your.address@hoge.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa): 
Created directory '/var/lib/jenkins/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
...省略
ssh-agent への秘密鍵の追加

ssh-addする時の秘密鍵のパスがGitHubのページのものとは異なるので注意。

$ eval "$(ssh-agent -s)"
$ ssh-add /var/lib/jenkins/.ssh/id_rsa
SSHキーをGitHubに登録

公開鍵の内容をGitHubに登録する。pbcopyコマンドが無いのでcatで標準出力したものをコピーしてGitHubに登録する。

$ cat /var/lib/jenkins/.ssh/id_rsa.pub
確認

最後に接続確認。成功したらexitして処理を抜ける。

$ ssh -T git@github.com

The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?

Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.

イメージの作成

SSHキーを登録したのでそのコンテナを元にイメージを作る。直前の操作状況をps -lで確認。hungry_hooverという名前のコンテナが作成されている。

sudo docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
0213dffe4304        jenkins:latest      "/bin/bash"         28 minutes ago      Exited (1) 16 seconds ago                       hungry_hoover    
$ sudo docker commit -m "Added ssh key" -a "Your Name" hungry_hoover yourname/jenkins
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yourname/jenkins    latest              536ba4d0ed1e        12 seconds ago      670.8 MB

Jenkins起動

コマンドの確認

作成したイメージを引数無しで起動するとJenkinsではなくbashが起動してしまうので、jenkinsコマンドを確認する。docker inspect でjenkinsがデフォルトで実行しようとしていたShellを確認。

$ sudo docker inspect -f "{{.ContainerConfig.Cmd}}" jenkins
[/bin/sh -c #(nop) CMD [/usr/local/bin/jenkins.sh]]
起動
sudo docker run --name home_jenkins -p 8080:8080 -d -v /var/jenkins_home yourname/jenkins /usr/local/bin/jenkins.sh

Jenkins設定

ここから先はJenkinsのお話なのでざっくりと。Git Pluginを入れてジョブにSSHの設定を追加すれば良い。

  1. ブラウザからJenkinsにアクセス
  2. Git Pluginをインストール
    1. 認証情報→グローバルドメイン→認証情報の追加
      1. 種類:「SSHユーザー名と秘密鍵
      2. ユーザー名:「jenkins」
      3. 秘密鍵:「Jenkinsマスター上のファイルから」
        /var/lib/jenkins/.ssh/id_rsa


残り

書式は以下でうまくいった。

git@github.com:github/git.git
  • Credentialsに先程作成した認証情報を選択

Jenkins側の説明がかなり雑だけど終了。DockerFile使ったらもっと楽にいけるのかもしれないが現時点ではこんなところで。