MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Jenkinsで個人コードの自動テスト環境を作る方法

目次

はじめに

以前、

C++とPythonのテストコードの書き方の概要を紹介しましたが、

myenigma.hatenablog.com

myenigma.hatenablog.com

ちゃんと定期的にテストを実行しないと、

結局、気づいた時には通らないテストだらけになり、

放置された状態になってしまいます。

 

そこでやはり利用したいのが、

自動テストシステム(CI)ですが、

GitHub上で公開していないコードに関しては、

Travis CIやCircle CIなどの外部サーバのシステムはすこし使いづらいです。

 

そこで、オンプレにインストールできる

Continuous Integration(CI)ソフトとして有名な

Jenkinsを自分の環境に入れて、

自動テストするように設定しました。

 

その時の設定方法をメモとして残しておきます。

Jenkinsとは?

Java製のオープンソースのCIシステムです。

jenkins.io

github.com

 

gitなどのCVSと連携して、

コミット時やプッシュ時に任意のスクリプトを起動して、

自動的にテストやビルドを実施させることができます。

そして、失敗したらメールを飛ばしたり、

別のスクリプトを呼んで、Slackやskypeに通知できます。

 

Java製なので、マルチプラットフォームに対応しており、

Windows, Mac, Linux上で運用することができます。

 

Jenkinsのインストール

各プラットフォームにおけるインストールの仕方です。

Mac

Homebrewで一発でした

$ brew install jenkins

 

また、上記のコマンドでjenkinsをインストールした場合は、

下記のコマンドで設定ファイルをコピーしておいたほうが良いようです。

$ cp -p /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents

 

ポート番号は下記のファイルの設定箇所を、

適宜変更すればOKです。

$ vim ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

(デフォルトでは8080のようです)

  

Macの立ち上げ時にJenkinsを自動起動したい場合は、

下記のコマンドを実行しておきます。

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

 

またMac上で、Jenkinsの再起動などをしたい場合は

下記のコマンドを利用します。

$ launchctl stop homebrew.mxcl.jenkins

$ launchctl start homebrew.mxcl.jenkins

 

Docker

Docker上でJenkinsを起動する場合は、下記のコマンドでOKです。

$sudo docker run -d -p 8080:8080 -p 50000:50000 --restart=always -v ~/jenkins:/var/jenkins_home jenkins/jenkins

~/jenkinsの下に、jenkinsのデータが保存されるようになります。

 

ホストOS関係なく、Docker上でJenkinsを動かし、

そのJenkinsでDockerを使ってテストするときには、

Volumeのマウントがうまく機能しない場合があります。

 

下記を元に設定すると、

docker上にJenkinsを立てて、

そのJenkinsの上でDockerでテストを実施できます。

qiita.com

 

同じPC上のソフトの自動テスト環境の作り方

自分のMacでコードを書き、

そのコードを自動テストするための設定方法です。

1. Jenkins上で新規ジョブを登録する

Jenkinsのページ上から、

新規ジョブを登録します。

 

設定した内容としては、下記の通りです。

古いビルドを破棄する

データがたまりすぎると、

Jekinsが上手く動かなくなるらしいので、

ビルドの結果などを適宜削除するように設定します。

gitリポジトリの設定

ローカルのgitリポジトリを指定する場合は、

下記のようにfile:///の下にローカルgitリポジトリのパスを指定します。

file:///Users/path/to/git/repository

これにより、テストの時にこのgitのデータをcloneして

テストしてくれます。

SCMのポーリングをオン

後述の方法で、gitコミット時にテストを実行するために、

ビルド・トリガのSCMをオンします。

スケジュールは何も記入しないでおきます。

テストスクリプトの設定

テスト実行するためのスクリプトを

gitリポジトリに置いておき、

そのスクリプトを起動するように、

下記のようにビルドのシェルを実行の部分に

コマンドを入力しておきます。

f:id:meison_amsl:20161227111530p:plain

E-Mail通知の設定

テストが失敗したら、メールが飛んでくるように、

メールアドレスを設定しておきます。

 

2. gitのhookで下記のjenkinsのURLを叩くようにする

.git/hooks/commit-msgというファイルを作り、

下記のようにgitコミット時に

テストを実行するようにcurlのコマンドを記述します。

(file://の後は、先程のgitの設定と同じパスを指定しておきます。

curl http://localhost:8001/git/notifyCommit?url=file:///Users/path_to_dir/

上記の設定で、

コミット時に自動でJenkinsに通知が行き、テストを実施してくれます。

 

Pythonでテスト環境を作る時の注意点

ライブラリへのパスが通らない時

JenkinsでPythonのテストスクリプトの実行を

実行しようとした時に、

ライブラリのインポートが出来ない時があります。

これはJenkinsのPYTHON_PATHに、

通常のユーザのPythonのパスが含まれていないためです。

そんな時は、Jenkinsのシェルスクリプトの部分で、

$ export PYTHONPATH=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/:$PYTHONPATH

のようにパスを追加してあげると、

pipなどでインストールされたライブラリを使うことができます。

 

複数のPython Versionを使う

Jenkinsのテストでは複数のバージョンのPythonを使ってテストをしたい場合は、

まず初めに、システムに複数のバージョンのPythonをインストールした後、

ShiningPandaというプラグインを使うと便利です。

 

まず初めに、Jenkinsの管理->Global Tool Configurationで

下記のように追加したPythonのバージョン名とパスを設定します。

f:id:meison_amsl:20170704070218p:plain

 

続いて、各ジョブのビルドのタブで

virtualenv builderを選んで、

その中で使用したいPythonのバージョンを選択して、

commandの中で必要なライブラリをpipでインストールしたり、

テストスクリプトを起動すればOKです。

 

Jenkins pipelineによる設定

Travis CIでは、travix.ymlというファイルにCIの設定を書き、

テストやデプロイを記述することができます。

 

JenkinsでもJenkins pipelineという機能で、

jenkinsfileというファイルにCIやCDの設定を書くことで、

JenkinsのGUI上での設定を最小限にすることが可能です。

 

Jenkinsfileに関しては、下記を参照ください。

qiita.com

qiita.com

 

JenkinsFileで、sshを使う

下記の記事通りに設定することで、

Jenkins fileから、sshで他のOSに接続することができます。

neos21.hatenablog.com

 

ちなみに、dockerでJenkinsを起動している場合、

ホストのIPは、ホスト上で下記のコマンドを実行することで実施できます。

$ "HOST_IP=ip r | grep 'docker0' | awk '{print $9}'"

 

Jenkinsからメールを送る設定

下記の記事の通りに、

Jenkins用にgmailのアカウントを作り、

メールを送信できるように設定しました。

 

また、送られてきたメールの送信者名が、

"まだアドレスが設定されていません。"となっている場合は、

下記の記事の通りに設定します。

 

Jenkinsにログイン出来なくなった時

下記の記事を元に、一度セキュリティの設定をオフにして、

Jenkinsを再起動する。

qiita.com

 

Jenkinsでsudoを使いたい場合の対処法

ライブラリのインストールなど、

ソフトウェアのスクリプトをsudoで実行したい場合、

下記の記事の通り、

sudo vim /usr/sbin/visudo

として、visudoファイルに、

Defaults:jenkins !requiretty # ユーザjenkinsはtty無しでsudo可能 jenkins ALL=(ALL) NOPASSWD:ALL # ユーザjenkinsはパスワード無しでsudo可能

を追加すると、sudoをjenkinsのスクリプトの中で利用できるようになります。

 

細かいTips

cmakeが使えない時のgtest

C++のテストではgtestを使っているのですが、

myenigma.hatenablog.com

gtestのコンパイルをJenkinsにやらせようとした所、

cmakeが無かったり、色々面倒だったので、

自分でビルドしたgtestを .jenkins/workspaceの下辺りにおいて、

そこにパスを通すようにしています。

 

新しいコンピュータにJenkinsサーバを移動する場合

基本的には、

前述の方法でJenkinsをインストールし、

ホームディレクトリ直下の

.jenkinsというフォルダを新しいコンピュータにコピーすれば、

jenkinsサーバのテストの設定などを移管できます。

 

加えて、Dropboxなどで.jenkinsを管理している場合は、

Macの場合、ディレクトリのハードリンクの設定が

デフォルトではできないので、下記のソフトをHomebrewでインストールして、

Dropbox内のファイルを.jenkinsにハードリンクすると便利です。

 

JenkinsとGitbucketの連携

GitBucket上にある

myenigma.hatenablog.com

Gitリポジトリのpushに応じて、Jenkinsのジョブを動かすには、

下記の通りやればOKです。

qiita.com

 

Jenkinsのログに色をつける

下記の記事の通りに、

AnsiColorプラグインを使えば、ログに色をつけることができます。

qiita.com

 

Jenkinsでビルド結果のバイナリや、実行ファイル、dockerイメージなどを作成する

下記の通り、ビルド成果物を設定することで、

ビルドの成果物をJenkinsで作成・登録し、ダウンロードできるようになります。

flame-blaze.net

 

ビルドのあとにGit操作する

Git Publisherを使います。

qiita.com

 

コンソールアウトプットへのショートカット

ビルド中の青いバーをクリックすると、

コンソールアウトプットを開くことができます。

 

Jenkinsの表示言語を変更したい

ブラウザの言語設定を変更すると、Jenkinsの言語も変更されます。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com