はじめに
前回は品質を保ちながらコードを改善していくコツや技術的負債の賢い返済方法について説明しました。今回は、修正したコードが本番環境で動かない状況を避けるにはどうしたらよいかをお話しします。
修正したコードが本番環境で動かない状況を避けるには、「継続的インテグレーション(Continuous Integration、以下CI)」ツールによる自動化が有効な手段の1つです。今や開発現場になくてはならない存在となったCIですが、みなさんの環境では導入されているでしょうか。そもそも何のためにCIが必要なのか、まずはおさらいしたいと思います。
CIとは、ソフトウェア開発過程において、ビルドやテストを頻繁に繰り返し行うことにより問題を早期に発見する開発手法です。ソフトウェアの不具合は早い段階で発見するほうが、あとの工程で発見されるより対策にかかるコストが抑えられるため、頻繁にビルドを行うのが好ましく、ビルド結果が正しいことを検証するためにテストを行います。
しかし、ビルドやテストを頻繁に毎回手動で行うのは手間がかかります。そこで、特定のタイミングで自動的にビルドやテストを実行し、完了後にその結果を通知する「CIツール」が広く利用されています。CIツールによる自動化のメリットは多く、単純作業から開発者を解放し、設計や実装などの知的な作業に集中できるようになります。
従来の開発では、「私の環境ではビルドできるが他人の環境だとビルドできない」「ビルドはアノ人にお願いしないとできない」「ビルド手順を間違えてうまくソフトウェアが動かない」といった場面がたびたびありました。作業を自動化して暗黙知の作業や属人性を排除することで、作業のミスがなくなり、誰でも実行可能なソフトウェアを作成できるようになります。
本稿では、数あるCIツールの中から、Atlassian社が提供するCIツール「Bamboo(バンブー)」をベースにCIの方法を説明します。
Bambooについて
Bambooでは、ビルド用のプロジェクトとデプロイ用のプロジェクトを作成できるようになっています。
ビルド用のプロジェクトでは、プランという単位でビルドのシナリオを定義します。ビルドのシナリオには、「ステージ」という概念と「ジョブ」という概念があります。ジョブでは、一連のビルドタスクを構成していきます。たとえば、ソースコードをチェックアウトして、ビルドツールでビルドを行い、テストを実施する、といったタスクを組みます。
図1は、「Build Stage」というステージに「Build Job」というジョブがあり、そのジョブが「Source Code Checkout」「Maven 3.X」「Script」という3つのタスクを持っている構造を示しています。これらのタスクは、あらかじめ用意されているものを利用できます。そのためスクリプトをゴリゴリ書くことは必要最低限で済みます(図2)。
デプロイ用のプロジェクトでは、どのビルドの成果物をどの環境にデプロイするか、タスク、実行タイミングをどうするか、などをデプロイ対象の環境ごとに定義します(図3)。デプロイもビルドと同様に、あらかじめ用意されているタスクから選択してデプロイを構成します。
実行タイミングは、ビルドが成功したら即時にデプロイするとか、1日1回決まった時間にデプロイする、などの設定ができます。もちろん手動でデプロイすることもできます。手動でのデプロイは数クリックで簡単に実行できます。
ほかにもBambooは次のような機能を持っています。
ブランチの自動検出
GitやMercurial、Subversionのリポジトリを使用している場合に限りますが、リポジトリでブランチが作成された際に、Bambooが自動でブランチを検出し、プランを自動で作成します。そのため、開発者はブランチを作成し、作成したブランチにコードをコミットするだけで、Bambooが自動的にブランチを検出してビルドやテストを行ってくれます。
通知設定
ビルドやデプロイの実行時に特定の条件で通知ができるようになっています。ビルド完了時に必ず通知する設定は言うまでもなく、最新のビルドが成功から失敗に変化した場合といった条件で通知を設定することもできます。連続でビルドに失敗した場合という条件も指定できるので、たとえば5回ビルドに失敗した場合はプロジェクトの管理者に通知してエスカレーションするといった使い方も考えられます。
通知はEメール、Atlassianが提供しているチャットアプリであるHipChat、その他にもXMPPプロトコルを使用してIMアプリへ送ることも可能なので、ビルドやデプロイの状況をリアルタイムに把握できます。
リモートエージェント
ほかのサーバにビルドを分散させるリモートエージェント機能を利用できます。ビルドやテストは多くの場合、メモリやCPUを大量に必要とするので、複数サーバによる分散ビルドを行うことで負荷を分散させることができます。リモートエージェント機能は負荷分散以外にも有効で、BambooがインストールされているOS以外のプラットフォームでビルドやテストを行いたい場合にも利用できます。
以上、継続的インテグレーションを行う理由と、そのツールの1つであるBambooについてざっと説明しました。後編では、Bambooを使った開発の流れを見てみましょう。
日本だけでなく、アジア圏でもアトラシアン製品販売のトップエキスパートであるリックソフトのWebサイトでは、各アトラシアン製品の体験版を提供しているほか、アトラシアン製品専用のコミュニティも運営しています。まずはアクセスしてみては!
- リックソフトJIRAデモ環境
- https://www.ricksoft.jp/demo/
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識
- 第2特集
「知りたい」「使いたい」「発信したい」をかなえる
OSSソースコードリーディングのススメ
- 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画]Red Hat Enterprise Linux 9最新ガイド
- 短期連載
今さら聞けないSSH
[前編]リモートログインとコマンドの実行
- 短期連載
MySQLで学ぶ文字コード
[最終回]文字コードのハマりどころTips集
- 短期連載
新生「Ansible」徹底解説
[4]Playbookの実行環境(基礎編)