CI/CDとは何かのエントリーでは、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があるじゃないか」
もちろんその通りです。ですが筆者がCI/CDをやり始めた頃は、GitHub Actionsってまだ存在しなかったんですよ。だものでそのまま慣れた環境を使い続けている……というのもひとつの理由です。
GitHubにリポジトリを作成する
GitHub上に、テスト用の新しいリポジトリを作成しましょう。今回はci-test
という名前で、プライベートリポジトリを作成しました。
このリポジトリにコードと、CircleCIのワークフローの設定を追加していきます。今回は例として、簡単なシェルスクリプトの文法をチェックすることにしましょう。script.sh
という名前で、以下のコードをコミットしました。文字列を表示するだけのhello
というシェル関数を定義し、実行するだけのシンプルなシェルスクリプトです。
#!/bin/sh function hello { echo 'hello' } hello
続いてリポジトリに.circleci
というディレクトリを作成し、その中にconfig.yml
というファイルを以下の内容で作成します。
version: 2.1 orbs: shellcheck: circleci/shellcheck@2.2.4 workflows: my_workflow: jobs: - shellcheck/check: dir: ./ pattern: '*.sh'
本エントリーでは詳細は解説しませんが、チェックアウトしたリポジトリ内の*.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パイプラインの画面に遷移してみると、どうやらテストに失敗しているようです。
テスト結果をもとにコードを修正する
ジョブの詳細を確認すると、以下のログが表示されていました。
ShellCheck Errors Found In ./script.sh line 3: function hello { ^-- SC2113: 'function' keyword is non-standard. Use 'foo()' instead of 'function foo'. For more information: https://www.shellcheck.net/wiki/SC2113 -- 'function' keyword is non-standar...
スクリプトの3行目にあるfunction
がよくないようですね。実はfunction hello
はBashの構文のため、/bin/sh
ではhello()
と記述する必要があります。というわけでコードを修正してpushし直しましょう。修正したコードは以下になります。
#!/bin/sh hello() { echo 'hello' } hello
修正したコードをpushすると、自動的にワークフローが再実行されます。
というわけで、無事にテストをパスすることができました。
新規追加したコードの品質を担保し、また既存の機能にリグレッションを発生させないためにも、リリースブランチへのマージ前のテストは必須です。とはいえ、人間は面倒くさい作業はサボってしまうものです。ですのでこうした作業はツールにオフロードし、意識せずとも自動的に実行されるのが理想ですよね。今回は文法チェックを行いましたが、CIにはセキュリティチェックや静的コード解析などを組込むことも可能ですよ。
*1:最近CircleCIでは無料プランが大幅に強化され、無料でも月あたり6000分のビルド、30件までのジョブ並列実行などが可能になっています。