CI/CDとは?
開発や保守の途中でもソフトウエアが稼働するように、ビルドやテスト、デプロイを継続的に実行するものです。開発したソフトウエアが稼働するかどうかの確認作業を高い頻度で行うことにより、不具合を発見した際にその原因を見つけることは容易になります。一方で開発が済んだ後に確認し、不具合を見つけた場合、調査対象が全ソースコードになります。そのため、原因発見に多くの時間と膨大な作業が必要となります。
例えば、家計簿を4月1日からつけ始め、翌年の3月30日まで毎月の収支が銀行手帳上のお金の動きと合っているかどうか確認していない、加えて3月31日に家計簿の収支と手帳の収支を照合した際、合っていないことが確認された場合、4月1日から3月30日までのお金の動きを一つ一つ確認する必要が出てきます。しかし、4月30日時点で家計簿と手帳の収支を照合し、合っていなかった場合、1ヶ月間のお金の動きを追うだけで済みます。
同じように、CI/CDを使用し、ソフトウエアが期待通りに動くかを短い間隔で確認することで、負担が重い作業の発生を避けることができます。
バージョン管理システムとの連携
バージョン管理システムは、ソースコードの変更差分を管理する為に使用されています。Git(#1)やSVN(#2)が代表例に挙げられます。ソースコードの変更があった際、即座に確認することが可能になります。
#1 分散型バージョン管理システム。成果物を管理する場所がローカルとリモート2つある。
#2 集中型バージョン管理システム。成果物を管理する場所がローカルのみ。
成果物の管理
CI/CDでは様々なパッケージを組み合わせて、ソフトウエアや環境を構築します。ビルド時に関連パッケージをダウンロードし、インストールします。適切な組み合わせのパッケージを矛盾なくインストールする為にパッケージ管理ツール(#3)が使用されています。代表例として、Apache Maven(#4)やyum(#5)が挙がります。例えば、Mavenを使用することで、ローカルとリモートリポジトリ(#6)の差を感じることなく、ビルドに必要なjavaファイルを自動的に収集できます。しかし、あるきっかけでMaven等のリポジトリにアクセスできなくなってしまうことがあります。そこでCI/CD環境に自前の成果物管理リポジトリを準備することがあります。代表例として、NexusやMaven Archiva 、Artifactoryが挙ります。
例えば、JA等と契約を結んでおくことで、自動的に欲しい食材が手元に届きます。しかし、自然災害により、届かなくなるということが考えられます。そういったケースを防ぐために自前で野菜を育てるという感じです。
#3 OSへのソフトウェアの導入と削除、依存関係の整理などを行うツール
#4 Javaのライブラリ管理
#5 Linuxディストリビューションのパッケージ管理
#6 ファイルを管理する場所
ログの管理
CI/CD環境では、様々なマシンが動き、その上でosやアプリケーションがログを出します。CI/CD環境で実施したテストに異常があった場合やツール事態に異常があった場合にはログを参照し、異常の解明を行います。ログを管理するツールとして、syslogがあります。マシンからログをsyslogサーバに集積し、ログ調査の際にはsyslogのファイルを確認します。
代表的なCI/CDサービス
- Jenkins
- Travis CI
- Circle CI
- Github Actions
- GitLab CI/CD
参考資料
https://qiita.com/HITOSUKE/items/ae2fed680ca2b2ae6eae
https://wa3.i-3-i.info/word15664.html
https://qiita.com/sh-ogawa/items/26bd4edb2eff5787ca75
土台からしっかり学ぶーーソフトウェアテストのセオリー