GitHubとCircleCIでCI/CDをはじめよう
日本仮想化技術株式会社の水野です。
現在のITシステムの開発現場では、激しく変化する要求に対し、柔軟かつ高速に対応することが求められています。DevOpsはそのためのアプローチのひとつですが、DevOpsライフサイクルを高速に回すためには、なによりテスト、ビルド、デプロイを自動化するCI/CDが欠かせません。
そこで本エントリーでは、GitHubとCircleCIを用いて、実際にCI/CDワークフローを動かす手順を紹介します。
なぜCircleCIなのか
CI/CDを実現するツールは数多く存在します。まず大きくオンプレミスで運用するか、クラウドサービスを使うかで分けることができますが、運用コスト面から見ても、特別な理由がない限りクラウドサービスの利用を第一に検討するべきでしょう。もちろんこれは、CI/CDツールだけに限った話ではありません。
現在ソースコードホスティングサービスとして、第一候補に挙げられるのはやはりGitHubでしょう。となると、CI/CDツールにおけるGitHubとの親和性というのは見逃せないポイントです。そしてコスト(*1)、使い勝手、GitHub連携という点から総合的に判断すると、CircleCIが最有力ではないかというのが筆者の考えです。CI/CDのSaaSとしては、Travis CIという対抗馬も存在します。もちろんTravis CIでも同様にCI/CDは行えるのですが、プライベートリポジトリの扱いや、ビルド手順の煩雑さ、マシンスペックの選択肢といった理由から、全体的にCircleCIの方が使い勝手がよいのでは? と筆者は感じています。
「GitHubと親和性の高いCI/CDなら、GitHub Actionsがあるじゃないか」
もちろんその通りです。現在ではGitHub Actionsも有力な選択肢のひとつでしょう。ただ筆者がCI/CDを実践し始めた頃は、まだGitHub Actionsは存在しなかったことや、Insightsなどの機能が充実しているという点で、CircleCIの方が好みではあります。
GitHubにリポジトリを作成する
GitHub上に、テスト用の新しいリポジトリを作成しましょう。今回はci-testという名前で、プライベートリポジトリを作成しました。
このリポジトリにコードと、CircleCIのワークフローの設定を追加していきます。今回は例として、簡単なシェルスクリプトの文法をチェックします。script.shという名前で、以下のコードをコミットしました。文字列を表示するだけのhelloというシェル関数を定義し、実行するだけのシンプルなシェルスクリプトです。
続いてリポジトリに.circleciというディレクトリを作成し、その中にconfig.ymlというファイルを以下の内容で作成します。
本エントリーでは詳細は解説しませんが、チェックアウトしたリポジトリ内の*.shというファイルに対してshellcheckで文法チェックを行うワークフローを定義しています。YAMLファイルに定義を列挙しているだけなので、なんとなく意味はわかるのではないでしょうか。
ここまでができたらファイルをコミットし、GitHubへpushしましょう。
CircleCIにプロジェクトを設定する
circleci.comから、GitHubのアカウントでCircleCIにログインしましょう。それだけで、CircleCIがGitHub上のリポジトリにアクセスできるようになります。
CircleCIでは、リポジトリを「プロジェクト」という単位で管理します。まずはダッシュボードからAdd a projectをクリックします。
GitHub上にある自分のリポジトリ一覧が表示されますので、先ほど作成したci-testのSet Up Projectをクリックしましょう。
するとCircleCIは自動的に、リポジトリ内にあるワークフローの設定(先ほどコミットした.circleci/config.yml)を検索してくれます。
これをそのまま利用しますので、Use the .circleci/config.yml in my repoを選択してSet Up Projectをクリックします。これで自動的にCIが起動します。しかしCIパイプラインの画面に遷移してみると、どうやらテストに失敗しているようです。
テスト結果をもとにコードを修正する
ジョブの詳細を確認すると、以下のログが表示されていました。
スクリプトの3行目にあるfunctionがよくないようですね。実はfunctionはBashやkshで使える非標準な構文のため、POSIX shでは「関数名()」と記述する必要があります。ではコードを修正してpushし直してみましょう。修正したコードは以下になります。
修正したコードをpushすると、自動的にワークフローが再実行されます。
というわけで、無事にテストをパスすることができました。
おわりに
新規追加したコードの品質を担保し、また既存の機能にリグレッションを発生させないためにも、リリースブランチへのマージ前のテストは必須です。とはいえ、人間は面倒くさい作業はサボってしまうものです。ですのでこうした作業はツールにオフロードし、意識せずとも自動的に実行されるのが理想でしょう。今回は文法チェックを行いましたが、CIにはセキュリティチェックや静的コード解析などを組込むことも可能です。
※1:最近CircleCIでは無料プランが大幅に強化され、無料でも月あたり6000分のビルド、30件までのジョブ並列実行などが可能になっています。
本記事は日本仮想化技術が提供するDevOps技術情報メディアの記事を再編集した上で掲載しています。
関連リンク
この記事の著者:水野源
普段はクラウドを利用したDevOps案件に携わることが多いインフラ寄りのエンジニア。最近の著書に『そろそろ常識? マンガでわかる「Linuxコマンド」』(C&R研究所)、『いちばんやさしい新しいサーバーの教本』(インプレス)、『Linuxをマスターしたい人のための実践Ubuntu』(秀和システム)などがある。
- 関連キーワード:
- CI/CD
- CircleCI
- GitHub Enterprise
- コラム
DevOps Hubのアカウントをフォローして
更新情報を受け取る
-
Like on Facebook
-
Like on Feedly