どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

Jenkinsを使ってCI・CD入門してみる

CI・CDしない奴は人間じゃないみたいな雰囲気がにじみ出ている今日この頃。 でも、私CI・CDなんてやったことありません。

はい、どうやら人間じゃなかったみたいです、わたし…

そんなところに、周りでもCIやらないとだめみたいなことになってきました。 ということで、人間として扱われるためにもCI・CDの勉強しようってことで、今回はJenkinsを勉強してみたのでそのメモです。 参考にしたのはこちら。

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

  • 作者: 佐藤聖規,和田貴久,新井雄介,米沢弘樹,山岸啓,岩成祐樹,川口耕介
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/05/24
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

CI is 何?

CIはContinuous Integrationの略ですね。

ソフトウェア開発で日々行われている作業の中にこんなものがあります。

  • ソースコードをビルド
  • バイナリファイルをパッケージング
  • テストを実行
  • インスペクションツールを使用
  • パッケージングしたファイルをデプロイ

これら一連の作業は、手作業で実施するには複雑でミスが出やすく、スクリプトで実行しても環境に依存したり、結果が一致しなかったりします。

継続的インテグレーション(CI)とは、1日に何度もビルドを実行し、ソフトウェあをインテグレーションしたときに発生する問題を早期検出し、フィードバックサイクルを短くしてソフトウェア開発の品質と生産性を向上させる仕組みです。

CIのメリットとして下記の5点が挙げられていました。

  • 手戻りの削減・品質の維持
  • 誰でも実行可能なソフトウェアが作成可能
  • 作業コストの削減
  • 機械による作業の正確さ・暗黙知の形式知化
  • 品質・生産性を継続的に分析・カイゼン

正直この辺はやっていかないと実感わかないです。

CD is 何?

CDはContinuous Deliveryの略です。

通常、CIではテストまでを対象としている一方、CDではその先のステージングやデプロイまでを対象としています。 要するに、

CD = CI + Staging + Deploy

のイメージですかね。

Jenkins is 何?

CIを構成する概念的な構成は次のようなものになります。

f:id:nogawanogawa:20190926082046j:plain:w500

jenkins(+git)のいちづけはこんな感じになります。

f:id:nogawanogawa:20190926082049j:plain:w500

CIやら、CDやらを実現するためのツールってのが世の中には結構出回っているんですが、 セキュリティポリシーなんかの関係でクラウドサービスを使えないような状況では、意外と選択肢が少ないです。

そんな、オンプレミス環境で使用できるCI・CDツールのうちの代表例がJenkinsといっていいでしょう。

インストール

Jenkinsは諸事情により、ローカルにインストールしたいと思います。

こちらの記事を参考にダウンロードすれば行けました。

qiita.com

Dockerで使っていこうかと思う方はこちら。

docker run -p 8080:8080 -p 50000:50000 --restart=always -v /your/dir:/var/jenkins_home jenkins/jenkins:lts

docker-composeとか使うならこんな感じでしょうか。

これで、

http://localhost:8080/

にアクセスすればこんな感じに使えるはずです。

f:id:nogawanogawa:20190926173141p:plain:w500

コンソールに

jenkins   | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins   | Please use the following password to proceed to installation:
jenkins   | 
jenkins   | ********************************

みたいなのが出てくるので、***の部分を入力すれば先に進みます。

あとは流れで←適当

※この本のコマンドの通りやると安定版じゃないのが入ってきて、プラグインのインストールでエラーになったので、安定版を使用することをおすすめします。

どうやって使うんじゃい?

さて本題です。コンパイル言語を使用しているときはビルドとかも考えますが、個人的に最近はスクリプト言語しか触ってないので、ビルドに関しては対象外にします。

テスト管理

Dockerコンテナ上のjenkinsからローカルのリポジトリにアクセスするときは、こちらを参考にさせていただきました。

qiita.com

jenkinsの挙動として、

リポジトリの更新をfetch

テスト

という流れになります。

pytestを使用したテストの実行はこちらを参考にしました。

qiita.com

qiita.com

早い話、テストがある状態なら、

jenkins > [プロジェクト] > 設定 > ビルド > シェルの実行

で大体のことはできそうです。

※リモートリポジトリを使用する場合には色々ガチャガチャイジる必要がありそうですが。

感想

意外と簡単ですね。 特に、これまでテストコードはコンソール実行して眺めていたので、そのへんをレポーティングしてくれるのは規模が大きくなると確かにありがたいかもしれません。

私の周りでCIをめんどくさいって毛嫌いする方もいるのですが、多分めんどくさいのはCIツールの使用ではなくて、テストコード書くことなんでしょう。

その他、静的コード解析(インスペクション)やビルド、デプロイなど、いろいろできるようなので、使いながらガチャガチャいじりたいと思います。

というわけで、CI/CDやりましょって話。