こんにちは、テクマトリックスの長久保です。
2023年10月16日弊社で実施した【コンテナ、Git、CI/CDを活用したソフトウェア開発のメリットとは?(オンラインセミナー)】の内容を元に、内容を加筆して作成したものになります。
開発環境構築にあたり、CI環境とDockerの有用性を感じていただければ幸いです。
目次
Dockerの有用性
乱立する開発環境
組み込み系の開発の場合、長い保守期間、製品ごとの個別対応、クロスコンパイラーでの対応、仕向け対応など、様々な要因でWeb系の開発と比較して開発環境が複雑になる場合が多いです。それに応じてコンパイラーのバージョンや動作させるOSのバージョン、環境変数や実行時のプロパティ、ビルドコマンドなどが変化していく場合があります。
特定のバージョンのみを開発しているときは顕在化しませんが、例えば上図でV1.3の開発中にV1.1.1の開発・検証を行うとなった場合、すぐに開発環境を整備することができるでしょうか。おそらくコンパイラーのバージョンを確認し、プロパティファイルやビルドスクリプトを修正し、場合によってはローカルPCの環境変数の変更が必要になるかもしれません。
開発環境構築自体の手間
異なった開発バージョンの開発環境の準備をするのには時間がかかります。また、ローカル環境にインストールして構築するツールの場合、複数の開発バージョンを同時に開発することができない場合もあります。
また、「手順書通り環境を作ったはずなのにうまく環境が構築できない」「不具合報告された問題が、手元の環境では再現しない」といった経験をしたことがある方も多いでしょう。
- ライブラリーフォルダに最新バージョン開発では必要だが、過去バージョンでは不要なものが混在していた。
- コンパイラのバージョンは統一されているが、環境変数が異なっていた。
- ローカルに配置していたファイルが何か余計なことをしていた。
- プロパティファイルの書き換えが漏れており、ほかのバージョン用のプロパティファイルで実行していた。
- 他にインストールしていたツールが干渉していた。
このような原因によって開発環境を作る際に手間取ってしまうことはよくあります。特に様々な開発環境が存在する組み込み系開発の場合、発生のリスクは高まるでしょう。
Dockerでの開発環境の構築
こういった問題を解決するためにDockerが役に立ちます。
Dockerは環境をスクリプトで構築することができます。例えばDockerfileとして、環境に必要な情報を定義し、Dockerfileを元にDockerイメージを作成します。Dockerイメージを元に作成したDockerコンテナ上で処理を実行できます。
Dockerfileにはビルドに必要な環境変数やパラメータも設定することが可能なため、利用する開発者は意識せずにDockerコンテナを起動し、開発環境を整えることが可能です。
同一マシン上で異なるDockerコンテナを立てることができるので、不意に検証が必要になった場合でも、すぐに開発環境を整えることができます。
毎回同じ環境での開発
Dockerを用いて開発することで開発期間中も保守期間中も同じ環境で開発を行うことが可能です。
環境をDockerfileというスクリプトとして定義できるため、それぞれの開発バージョンごとにDockerfileを作成して、SCM上で管理ができます。そのため、例えば「V1.1」の開発を行う場合は、都度ローカルのPCにツールをインストールしたりプロパティを変更して開発環境を構築するのではなく、「Dockerfile_V1_1」を元にDockerコンテナを作成すれば開発ができるようになります。
Dockerコンテナに関わる情報はすべてDockerfileに記載されているため、開発期間であっても保守期間であっても同じ環境で作業を行うことができ、環境依存問題のトラブルを減少させることができます。
注意
組み込み系開発でよくみられるコンパイラーであるIAR Build Tools for Armであれば、IARがDocker上でIAR Build Toolsを動作させる方法について公開していますが、全てのツールでDockerを用いることができるわけではありません。ご利用中の開発環境によってはDockerで動作させること自体が困難なツールもあるかと思いますので、ツールベンダーに問い合わせていただければと思います。
DockerとCI(Jenkins)
CIとDockerを組み合わせることで、より高い効果を発揮します。その例を2つ紹介します。
本ブログではCIツールをJenkinsとして紹介します。
CIでの冪等性(べきとうせい)の担保
毎日何度も実行されるCIで冪等性の担保は大切です。冪等性とは「同じ操作を何度繰り返しても、同じ結果が得られる性質」のことを指します。
CIのジョブを実行した際に、「何もコードは変更していないのにエラーになる」といったことがあると問題です。ジョブの失敗の都度「本当にソースコードが原因でエラーになったのか」「前の実行結果が何か悪さしていて実行エラーになったのか」といったことを確認をしていてはCI環境の信頼性を損ねることになり、いずれはCI環境が使われなくなってしまうことも考えられます。
CI環境とDockerを組み合わせることでこの問題が解決できます。
Jenkinsでジョブを実行する環境をエージェントと呼びます。Dockerコンテナをエージェントとして指定してのジョブの実行が可能です。
実行が完了したDockerコンテナは破棄され、実行の都度Dockerコンテナが作成されます。そのため、毎回全く同じ環境でのビルドやテストの実行が可能になります。
エージェントを指定するためのDockerfileはスクリプトファイルのため、SCM上にソースコードと同じように保存しておくことが可能です。
このように開発に関わる情報をすべてSCM上で管理すれば、毎回同じ環境で、毎回同じビルドスクリプトで、冪等性が担保されやすい状況でCIを実行することができます。
並列実行
Dockerコンテナは1台のマシンに複数立てることが可能です。
開発者が多くなりコミット回数が増えた際に、エージェントが1つしかないためジョブのキューが溜まってしまう状況は好ましくありません。
業務上で会話させていただいたお客様の中にも、十分なエージェント数が確保できずコミットごとのパイプライン実行にしてしまうとキューがたまりすぎるため、夜間バッチのみにしているという方もいらっしゃいました。
エージェントにDockerコンテナを指定して実行することで、複数のビルド用のコンテナを起動しての並列実行が可能になります。起動したDockerコンテナは利用が終わると自動的に破棄されるため、マシンリソースの有効活用にもつながります。
まとめ
今回はDockerとCI環境を活用したメリットについて紹介しました。
Dockerイメージ作成にあたりライセンスの制約などもあるかと思いますが、とても便利な仕組みのため、検討されてはいかがでしょうか。
また、弊社ではこのような開発環境構築について、個別に要件を伺いベストプラクティスを用いての開発環境の構築も実施しております。お気軽にお問合せ下さい。