鴨川🦆べりで今日から始めるCircleCI

この記事は川見てる Advent Calendar 2021およびMoney Forward Engineering Advent Calendar 2021 17日の記事です。

はじめに

マネーフォワードでことし10月から京都や鴨川🦆の良さを社内にひたすら宣伝しながらGoやYAMLなどを書いているwalkureです。
入社時の部署自己紹介で「趣味は鴨川🦆です」と言ったりSlackの分報へ鴨川🦆の写真をひたすら貼り続けていたところ、カモグルイ*1とか呼ばれるようになりました。
殆どの仲間は東京にいるので、あづまの地に鴨川🦆の良さを広めるべくこれからも尽力してまいります。

朝の鴨川🦆


最近は天気がいいので朝起きたら鴨川🦆まで行ってラジオ体操してから就業するというドカタ時代のような生活。
現在*2は週一回出社しましょうということになっていて、勤務地が三条大橋西詰にあるので出社したときも気分転換に鴨川🦆しています。

昼下がりの三条大橋

人間的な生活はここにあった。

今日から始めるCircleCI

入社以来ひたすら鴨川🦆の宣伝GoやYAMLを書いています。東京ではひたすらC#を書いていたので、Goはまだまだ修行中。YAMLですがおもにCircleCIの設定やk8sのmanifestを書いています。

今日は、CircleCIを使ったことない*3わたしが「CircleCIの設定を書いて」って言われた際にいろいろ調べて戦ったメモを(ちょっとだけまともに書き直して)供養することにしました。CIの設定ってプロジェクト立ち上がるときには頑張るけど、走り出すと結構忘れてしまうので覚えているうちに書いておきましょう。

CircleCIってなに

  • JenkinsのようなCIをやってくれるクラウドサービス
  • github actionが出てきてちょっとどうなるかな?
    • 処理実行するVMコストなどのお話もあるので一概には

設定リファレンス

command → job → workflow

command
  • make buildなどの実行コマンドをまとめられる
    • 実行はsteps内にrunを書き連ねる
  • 実行単位でない
job
  • 実行単位
    • steps内でcommandをたたいたり、runをたたいたり
    • 実行するコンテナイメージ設定もできるぽい
      • 実行環境はexecutor(後述)で指定する
workflow

orb

CircleCI Orb とは、ジョブ、コマンド、Executor などの、パラメーター化および再利用が可能な構成要素をまとめた共有可能なオープン ソース パッケージです。
Orb の概要 - CircleCI

キャッシュ

設定はYAML

YAMLJSONに変換してみた例。

シェル芸がときどき必要

CircleCI は Bash を使用します
環境変数の使用>環境変数の使用オプション - CircleCI

  • runでshell起動する際の設定が色々ある

すべてのコマンドライン プログラムの呼び出しに使用します。
CircleCI を設定する > jobs.steps.run - CircleCI

パラメタとしての環境変数

  • あちこちで設定できる
  • 環境変数の使用 - CircleCI
    • プロジェクト単位での設定→context(後述)→システム定義済み→job定義→runでの定義→run command内 の順番に設定されてゆく

context

デバッグ

  • ローカル実行と実際にクラウドを叩くのふたつ
workflowやキャッシュについてはクラウドを叩く必要がある。
  • git commit --allow-empty -m "commit message"
    • クソコミット増やしたくないんだが。。。。
  • クラウドで試さないとわからないこともある。
  • キャッシュで劇的にステップの速度が上がることによって顕在化するrace condition
    • たとえば後述する複数コンテナ立ち上げる場合
  • backgroundを使う場合も何かが起きるかもしれない。

CIを動かす環境(executor)

CIは基本的にコンテナ上で動く

Docker executor

imageは複数指定できるが、最初に指定したimageでCIは動くので書く順番は大事

複数のイメージを指定して設定されたジョブでは、最初にリストしたイメージによって作成されるコンテナで、すべてのステップが実行されます。 すべてのコンテナは共通ネットワーク内で動作します。 また、公開されるポートはすべて、プライマリ コンテナから localhost で利用できます。
Executor タイプの選び方 - CircleCI > 複数の Docker イメージを使用する

2つ目以降のimageで指定したコンテナが起動完了するのを待ってはくれない
dockerコマンドをstep中でで使いたい場合はsetup_remote_dockerを呼ぶ

Using docker combined with setup_remote_docker provides a remote engine similar to the one created with docker-machine, but volume mounting and port forwarding do not work the same way in this setup.
Installing and Using docker-compose >Using docker compose with docker executor - CircleCI

Machine executorについて

Use of the machine key may require additional fees in a future pricing update.
Installing and Using docker-compose > Using docker compose with machine executor- CircleCI

MySQLコンテナについて

おわりに

corp.moneyforward.com
kyoto.moneyforward.com

それでは、鴨川🦆でお待ちしています。

三条大橋


*1:実際晴れた週末は結構な頻度で鴨川🦆河川敷に行って一日ひなたぼっこしてるので反論の余地が一切ない。

*2:緊急事態宣言がないとき。

*3:今まで触ったことあるCIツールはCloud Buildぐらい。