とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など

開催予定の勉強会

各種SNSのフォローもよろしくお願いいたします。

GitHubとCircleCIでCI/CDをはじめよう

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という名前で、プライベートリポジトリを作成しました。

f:id:h-mizuno:20220201125710p:plain

このリポジトリにコードと、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をクリックします。

f:id:h-mizuno:20220201125758p:plain

GitHub上にある自分のリポジトリ一覧が表示されますので、先ほど作成したci-testSet Up Projectをクリックしましょう。

f:id:h-mizuno:20220201125813p:plain

するとCircleCIは自動的に、リポジトリ内にあるワークフローの設定(先ほどコミットした.circleci/config.yml)を検索してくれます。

f:id:h-mizuno:20220201125845p:plain

これをそのまま利用しますので、Use the .circleci/config.yml in my repoを選択してSet Up Projectをクリックします。これで自動的にCIが起動します。しかしCIパイプラインの画面に遷移してみると、どうやらテストに失敗しているようです。

f:id:h-mizuno:20220201125904p:plain

テスト結果をもとにコードを修正する

ジョブの詳細を確認すると、以下のログが表示されていました。

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すると、自動的にワークフローが再実行されます。

f:id:h-mizuno:20220201125919p:plain

というわけで、無事にテストをパスすることができました。

新規追加したコードの品質を担保し、また既存の機能にリグレッションを発生させないためにも、リリースブランチへのマージ前のテストは必須です。とはいえ、人間は面倒くさい作業はサボってしまうものです。ですのでこうした作業はツールにオフロードし、意識せずとも自動的に実行されるのが理想ですよね。今回は文法チェックを行いましたが、CIにはセキュリティチェックや静的コード解析などを組込むことも可能ですよ。

*1:最近CircleCIでは無料プランが大幅に強化され、無料でも月あたり6000分のビルド、30件までのジョブ並列実行などが可能になっています。