DockerでJenkinsコンテナを作りGithubと連携する

何がしたいか

 

以下のようなことをしたいと思っていました。

  • Dockerコンテナ上で
  • Jenkinsを立ち上げ
  • Githubにpushされたときに
  • 自動でテストコードを走らせたい

Dockerというのは手軽に仮想化環境を構築できるツールのことです。
また、Jenkinsというのは、日本製の処理自動化ツールで、
ビルドやデプロイやテストなど、プロジェクトを開発しているときに頻繁に行うような大切だけど面倒な作業などを自動化してくれるものです。

 

多くのプラグインがあったり、他のサービスとの連携もでき、とても多機能なのですが、
多機能すぎて最初は大枠を理解するのが大変でした。

 

また、ある一つの作業をするにしてもいろいろな選択肢があるので、調べてみると
Aさん「おれは、こうしました!」
Bさん「私は、この方法でやりました!」
という感じで、この辺も大変でした。

 

プロジェクト全体のコードはここにあります。

 

大まかな手順

 

上に書いたことを一から実現する大まかな手順です。

  • DockerでJekins用のコンテナ作成
  • Jenkinsで「ジョブ」という自動化する処理の設定をする
  • Github上でJenkinsと連携するための設定をする
  • 実行

一からといっても以下のことを前提としています。

  • Dockerが入っている
  • GitHubのアカウントを持っている

 

環境構築

 

まずは環境構築をしていきます。

 

Dockerコンテナ作成

 

【参考】Docker を使って Jenkins サーバーをローカルに構築する (プラグイン導入済み) | Developers.IO

 

Dockerの導入については、前に書いた記事を参考にしてみてください。

 

こんな感じのDockerfileを用意して、ビルドしていきます。
ここで同じディレクトリ内にあるplugin.txt内に列挙されたプラグインを最初に入れるようにも設定できます。
$ docker build -t test-project:1.0 .というふうに実行します。

 

DockerImageを確認します。
$ docker images

 

上述のようにして作ったときにうまくタグが表示されなかったのですが、以下のようにするとタグを付すことができました。
$ docker tag jenkins-test:1.0

 

ビルドしたDockerイメージをもとにDockerコンテナを起動する。
$ docker run -it -p 8080:8080 ImageId

 

以下のコマンドでコンテナが起動しているかどうかを確認することができます。
$ docker ps

 

ここでhttp://localhost:8080にアクセスするとjenkinsが表示されているかと思います。

 

 

以下のコマンドを実行することでdockerコンテナ内にアクセスすることができますので、この中で設定を行います。
$ docker exec -it bash

 

ここで、パスワードを入力する画面が表示されますが、
$ sudo cat /Users/Shared/Jenkins/Home/secrets/initialAdminPasswordなどを実行すると表示されます。

 

あとは普通にアカウント登録をします。

 

リポジトリとコードとテストコードの用意

 

push時にテストコードが実行されるかどうかをテストしたいので、それ用のリポジトリを作成しておきましょう。
今回は、足し算するだけの関数を定義して実行するmain.pyと、
それをpythonの標準モジュールのunittestを用いてテストするtest.pyというコードを用意しました。

 

Github上の設定

 

この記事が大変参考になりました。
とても詳しいのでこれを読めば設定できるかと思います。

 

少しだけ補足しておきます。

 

上述しましたが、以下のコマンドコンテナ内にアクセスすることができます。
$ docker exec -it bash

 

後で使うので、vimが入っていない場合はここでvimをインストールしておきます。
$ apt-get install vim

 

また、一番最初の
$ sudo su -s /bin/bash jenkinsを実行すると「sudoがないよ」と言われるので、
代わりに、$ su -s -s /bin/bash jenkinsとすることですすめられました。

 

では、以下のサイトを参考にして最後の「シェルの実行」のところまですすめてください。

 

【参考】JenkinsでGitにPush時に自動ビルドさせる – Simple IT Life

 

上のサイトではシェルの中で、Hello Worldを出力するように設定していますが、
今回はテストコードを走らせたいので、
「シェルスクリプト」の中には、python test.pyと書いておきます。

 

実行してみる

 

では、実際にmain.pyになにか適当に追記したりしてみて pushしてみます。
すると、約1分後にビルドが自動的に実行されます。

 

コードの内容がミスっているとき

 

コードの内容がミスっていると、テストコードが仕事をしてくれてビルドが失敗します。

 

2回目以降の起動方法

 

2回目以降の起動の手順を簡単にメモしておきます。

 

  1. $ docker ps -aでコンテナを確認
  2. $ docker startで起動
  3. localhost:8080にアクセス
  4. 画面右上からログイン

 

微妙な点と応用できそうな点

 

上記の方法以外にもっぽい方法はいろんなブログで紹介されていたのですが、なぜかうまくいきませんでした。
今回の方法の微妙な点を挙げるとするならば、

  • ディレクトリ構成を変えるとテストコードが実行できなくなるかもしれない

他にも応用できそうな点は、

  • push時だけでなく、PR時にも実行できる

 

余談(うまく行か無かったパターン)

 

他にもいろいろためしてみたのですが、うまくいきませんでした。
誰の役に立つのかはわかりませんが、一応メモっておきます。

 

pytestを用いたもの

 

【参考】Jenkinsさんにお世話になるPython開発 – ユニットテスト編 – Qiita

 

これってpython3以上じゃないと動かないのでしょうか。

  • python3.6の導入ができなかった→OS的にむり?
  • ptyhon3は入れたつもりだが、シェルの実行でpytestを走らせても
  • py.test command not foundなどを出力された
  • このサイトを参考にpython3.6入りのjenkinsのコンテナを作成してみたが入ってないっぽかった(?)

 

参考メモ

 

最終的には使わなかったけど、途中うまく行かなかった方法を試しているときに、
githubのsettingでwebhookを利用することがあって、でもURLがlocalhostなので、どうしようってときに
以下のサイトを見つけて良い感じでした。
【参考】localhostでGithubなどからのWebhookを受ける – Qiita

 

プラグインまとめてたサイト

 

今回はややこしくなるのでプラグインは入れませんでしたが、
今後は便利そうなプラグインを適宜入れていくことになると思いますが、
そのときに参考になりそうなサイトがいくつかあったのでここにメモしておきます。

 

【参考】

コメントを残す