見出し画像

シンプルなCI/CDツール Concourse CIを使ってみた

こんにちは、SHIFTで自動化エンジニアとして活動している山本です。
私は今回はじめての投稿になりますが、お客様先で使用しているConcourse CIというCI/CDツールについて、お話しさせていただきたいと思います。


Concourse CIの特徴

Concourse CIを実際にお使いになっている方は少ないと思いますが、このツールのいちばんの特徴としては、パイプラインをコード(YAML形式)で管理できるという点です。作成したパイプラインをGit等にPushしておくことで、チームメンバーの誰でもパイプラインを構築・編集することができます。

もうひとつの特徴としては、Concourse CIのGUI画面です。
以下にあるように、パイプラインが可視化されており、パイプラインの進行状況や失敗箇所を特定するのに非常に分かりやすいWebUIとなっています。(見た目もかっこいい)

画像1

その他の特徴として、
・すべてがコンテナベースで実行されるので、どこで実行しても同じ結果になる。
・Go言語で作られているので実行時間が早い
などが挙げられます。

オープンソースで環境準備にもそれほど時間がかからないので、手早くCI/CD環境を構築したい方にとってはお勧めです。

本題ですが、今回はそのConcourse CIを導入してみましたので、そちらの手順についてご紹介させていただきたいと思います。

Concourse CIのインストール

Concourse CIをWSL2上のUbuntuに導入しましたので、そちらの手順をご紹介します。
使用した環境については以下となります。
・Ubuntu 20.04 LTS
・kernel 4.19.128
・docker 20.10.2 build 2291f61
・docker-compose 1.27.4 build 40524192
Windows10へのWSL2の導入や、docker、docker-compseのインストールについては割愛させていただきます。

Concourse CIをインストールするためには、kernelのバージョンはv3.19以上であることが必要です。以下のコマンドを実行してkernelのバージョンを確認してください。

$ uname -r

docker-composeが導入されていればインストールは非常に簡単です。
まず、以下のようなdocker-compose.ymlを準備してください。

version: '3'
services:
 concourse-db:
   image: postgres:9.5
   environment:
     POSTGRES_DB: concourse
     POSTGRES_USER: concourse
     POSTGRES_PASSWORD: changeme
     PGDATA: /database
 concourse-web:
   image: concourse/concourse
   links: [concourse-db]
   depends_on: [concourse-db]
   command: web
   privileged: true
   restart: unless-stopped
   ports: ["8080:8080", "2222:2222"]
   volumes: ["./keys/web:/concourse-keys"]
   environment:
     CONCOURSE_EXTERNAL_URL: http://localhost:8080
     CONCOURSE_POSTGRES_HOST: concourse-db
     CONCOURSE_POSTGRES_USER: concourse
     CONCOURSE_POSTGRES_DATABASE: concourse
     CONCOURSE_POSTGRES_PASSWORD: changeme
     CONCOURSE_ADD_LOCAL_USER: test:test
     CONCOURSE_MAIN_TEAM_LOCAL_USER: test


 concourse-worker:
   image: concourse/concourse
   privileged: true
   links: [concourse-web]
   depends_on: [concourse-web]
   command: worker
   volumes: ["./keys/worker:/concourse-keys"]
   environment:
     CONCOURSE_TSA_HOST: concourse-web:2222

次に、Consourceを構成するコンポーネントの認証情報を作成します。コマンドを1つ1つ実行するのもありですが、ConcourseのGitHubにコマンドが用意されているので、それを使用することで簡単に認証情報が作成できました。

以下にアクセスします。
https://github.com/concourse/concourse-docker

「keys」フォルダ配下を先述のdocker-compose.ymlがあるフォルダにダウンロードし、「keys」フォルダ配下にある「generate」というシェルスクリプトを実行します。以下のように実行結果が表示されれば認証情報の作成は成功です。

$ ./keys/generate
wrote private key to /keys/session_signing_key
wrote private key to /keys/tsa_host_key
wrote ssh public key to /keys/tsa_host_key.pub
wrote private key to /keys/worker_key
wrote ssh public key to /keys/worker_key.pub

ここまででConcourse CIのインストールの準備は完了です。
以下のコマンドを実行してConcourse CIをインストールします。

$ docker-compose up -d
Starting concourse-docker_db_1 ... done
Starting concourse-docker_web_1 ... done
Starting concourse-docker_worker_1 ... done

ブラウザでhttp://localhost:8080にアクセスすると以下のような画面が表示され、Concourse CIのインストールは完了です。

画像2


flyコマンドのインストール

Concourse CIをインストールした後は、コマンドラインインタフェースであるflyコマンドという専用のCLIをインストールします。Concourse CIは基本的にこのflyコマンドを使って操作します。WebUIでも操作できる機能はありますが、機能が限られているためflyコマンドでの操作をメインとした割り切った仕様になっています。

ホストOSがWindowsやMacの場合は、先ほどのインストール後の画面の右下から各OSのflyコマンドをインストールすることもできます。
※インストール先のパスを通すことと、実行権限を与えることを忘れないでください。

$ curl -L https://github.com/concourse/concourse/releases/download/v3.5.0/fly_linux_amd64 > /tmp/fly
$ sudo mv /tmp/fly /usr/local/bin/fly
$ sudo chmod 775 /usr/local/bin/fly


ログイン

インストールしたflyコマンドを使ってConcourse CIにログインします。
以下のコマンドを実行してください。

$ fly -t test login -c http://localhost:8080

上記の「test」という文字列はターゲット名という任意の文字列を指定します。ユーザー名、パスワードを聞かれたら、以下のようにコマンドを実行してください。

$ fly -t test login -c http://localhost:8080 -u user -p password

以下のコマンドを実行することでログイン状況を確認することができます。

$ fly targets
name  url                  team   expiry
test    http://localhost:8080  main  Thu, 28 Jan 2021 00:16:17 UTC


パイプラインの設定

では、Concourse CI上に実際にパイプラインを作成してみたいと思います。
まず、ローカルでYaml形式のパイプラインを作成します。以下はalpine linux上でシェルを実行するという簡単なサンプルです。

build_sample.yml

jobs:
 - name: job-sample
   plan:
     - task: task-sample
       config:
         platform: linux
         image_resource:
           type: docker-image
           source:
             repository: alpine
             tag: 3.5
         run: 
           path: /bin/sh
           args:
             - -c
             - -x
             - |
             date


作成したパイプラインをConcourse CIにセットするために、以下のコマンドを実行します。

fly -t test set-pipeline -c build_sample.yml -p build_sample
jobs:
 job job-sample has been added:
+ name: job-sample
+ plan:
+ - config:
+     image_resource:
+       source:
+         repository: alpine
+         tag: 3.5
+       type: docker-image
+     platform: linux
+     run:
+       args:
+       - -c
+       - -x
+       - |
+         date
+       path: /bin/sh
+   task: task-sample
apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://localhost:8080/teams/main/pipelines/build_sample
the pipeline is currently paused. to unpause, either:
 - run the unpause-pipeline command:
   fly -t test unpause-pipeline -p build_sample
 - click play next to the pipeline in the web ui


パイプラインの実行

前述のパイプラインを実行してみます。
Concourse CIは、flyコマンドからパイプラインを実行する場合と、WebUIから実行する場合の2通りあります。

① flyコマンドからパイプラインを実行する
flyコマンドから実行する場合ですが、前述のパイプラインは、パイプラインがbuild_sampleでジョブがjob-sampleとなりますので、-jオプションには「パイプライン名/ジョブ名」の形式で指定しています。またwatchオプションを指定するとWebUIで実行された場合と同じようにジョブの実行結果をコンソール上に表示します。
実行するコマンドと実行結果は以下となります。

fly -t test watch -j build_sample/job-sample
initializing
waiting for docker to come up...
Pulling alpine@sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8...
sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8: Pulling from library/alpine
8cae0e1ac61c: Pulling fs layer
8cae0e1ac61c: Verifying Checksum
8cae0e1ac61c: Download complete
8cae0e1ac61c: Pull complete
Digest: sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8
Status: Downloaded newer image for alpine@sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8
docker.io/library/alpine@sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8
Successfully pulled alpine@sha256:f7d2b5725685826823bc6b154c0de02832e5e6daf7dc25a00ab00f1158fabfc8.
selected worker: e874dcbc9813
running /bin/sh -c -x date
+ date
Sat Feb  6 15:37:47 UTC 2021
succeeded

尚、過去の実行結果は以下のコマンドで参照することができます。

$ fly -t test builds
id  pipeline/job             build  status     start                     end                       duration  team
2   build_sample/job-sample  2      succeeded  2021-02-08@20:27:11+0900  2021-02-08@20:27:21+0900  10s       main
1   build_sample/job-sample  1      succeeded  2021-02-07@00:37:01+0900  2021-02-07@00:37:47+0900  46s       main

また、hijackコマンドという実行中のジョブのコンテナの中に入ってデバッグ出来るという便利なコマンドもあります。docker execや、kubectl execと同じような感覚ですね。

② WebUIからパイプラインを実行する
WebUIからパイプラインを実行する場合は、以下のように操作します。

(1) Concourse CIにhttp://localhost:8080でログインすると、サンプルのパイプラインが表示されていますので、パイプラインをクリックします。

画像3


(2) ジョブ名が表示されるので、「job-sample」をクリックします。

画像4


(3) 右上の「+」ボタンをクリックすると、ビルドが始まりジョブ名のところが黄色に変わります。

画像5


(4) ジョブが正常に完了すると緑になります。画面にはコンソール出力が表示されています。

画像6


パイプライン作成時に必要なConcourse CIの基本概念

Concourse CIでパイプラインを作成するには、まずは以下の3つの概念を理解しておく必要があります。

1. Job
2. Resource
3. Task

1. Job
パイプライン中の一連のアクションを定義するもので、口述のTaskの集まりです。

2. Resource
GitリポジトリやDockerレジストリなどのリソースの配置場所を、Resourceという抽象的な単一の概念で扱うことができます。Jobで利用されるオブジェクトのような位置づけで、「プル(ダウンロード)」や「プッシュ(アップロード)」など振る舞いも抽象化されています。

3. Task
Resourceがオブジェクトとして振る舞いが抽象化されているオブジェクト指向型言語のようなイメージに対して、Taskは関数型プログラミングでいうところの関数のようなイメージで、INPUTに対して処理を記載し、必要であればOUTPUTとして処理結果を返すことができます。とりあえずConcourse CIを動かしたい場合は、このTaskを作ってみるのがお勧めです。


【まとめ】

今回ご紹介したConcourse CIですが、Dockerが使える環境であればどこでも環境を構築でき、コンテナベースなので常に同じ結果を得られるところが強みだと考えています。複雑なプラグインも必要なく概念や操作方法がシンプルなので、簡単にCI/CD環境を立ち上げるには有益な選択肢となると思います。

日本語のサイトはまだまだ少ないですが、以下の公式サイトとチュートリアルページがあります。

公式サイト(英語)
Concourse CI (concourse-ci.org)

チュートリアル(日本語)
まえがき - Concourse チュートリアル (by Stark & Wayne) (lkj.io)

今回はConcourse CIの基本操作の説明でしたが、実践的なTIPS等あれば、またご紹介させていただきたいと思います。

__________________________________

執筆者プロフィール 山本 正和
中堅SIerにてオフィス機器、医療、車載などのさまざまなソフトウェアの開発やテストを経験し、2019年7月にSHIFTに入社。
SHIFTでは、PMとして大手通信企業のIoTプラットフォームのテスト自動化案件を担当し、Seleniumを始めとするOSSを使用したテスト自動化基盤の開発・運用に携わっている。
最近は在宅勤務続きで鈍った身体の、効率的な運動不足の解消法を模索中。

公式noteお問合せ画像

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら 
https://recruit.shiftinc.jp/career/