シンプルなCI/CDツール Concourse CIを使ってみた
こんにちは、SHIFTで自動化エンジニアとして活動している山本です。
私は今回はじめての投稿になりますが、お客様先で使用しているConcourse CIというCI/CDツールについて、お話しさせていただきたいと思います。
Concourse CIの特徴
Concourse CIを実際にお使いになっている方は少ないと思いますが、このツールのいちばんの特徴としては、パイプラインをコード(YAML形式)で管理できるという点です。作成したパイプラインをGit等にPushしておくことで、チームメンバーの誰でもパイプラインを構築・編集することができます。
もうひとつの特徴としては、Concourse CIのGUI画面です。
以下にあるように、パイプラインが可視化されており、パイプラインの進行状況や失敗箇所を特定するのに非常に分かりやすいWebUIとなっています。(見た目もかっこいい)
その他の特徴として、
・すべてがコンテナベースで実行されるので、どこで実行しても同じ結果になる。
・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のインストールは完了です。
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でログインすると、サンプルのパイプラインが表示されていますので、パイプラインをクリックします。
(2) ジョブ名が表示されるので、「job-sample」をクリックします。
(3) 右上の「+」ボタンをクリックすると、ビルドが始まりジョブ名のところが黄色に変わります。
(4) ジョブが正常に完了すると緑になります。画面にはコンソール出力が表示されています。
パイプライン作成時に必要な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等あれば、またご紹介させていただきたいと思います。
__________________________________
お問合せはお気軽に
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/