4 minutes
[CI] concourseでUnityのビルドをCIしてみる – 導入編
お世話になっております。
しゃまとんです。
Unityで開発をしているとビルド作業が煩わしくなって自動化したい…なんて話になると思います。
それで導入となるとどのCI導入するのかという話になり、Jenkinsで環境構築をするのが主流なのかなと感じています。
(Travis CIやCircle CIとかあるけど、ローカルな環境で〜という話)
ただ、世の中では
「Jenkinsおじさん」
という問題が各所で発生しており、辛い現状があるのも事実なようです。
UnityにおいてはUnity Cloud Buildがありますが、Unityのサービスなので他のプロダクト(例えばサーバサイドのAPIサービス)とかには使えません。
できるなら、1つのCI環境で管理したいですよね。
私としては以下のような希望がありまして
- UnityのiOS / Androidビルドが行える
- Unity以外プロダクトにも使える(サーバサイドのテスト、ひいてはデプロイ)
- 属人化しないと嬉しい(Infrastructure as Codeのようなもの)
なにか他にいいしーあいないかなーと探してみたところconcourseと出会いました。 concourseは比較的新しいOSSによるCI/CDツールのようですが、ヤフー等の企業でも導入が進んでいるようです。
目立った特徴を見た感じだと
- dockerを使って、CI環境を構築できる
- workerはコンテナ、ネイティブどちらでも動作可能
- 操作はすべてCLI
- 結果をGUIで確認できる
(詳細はこちらにあります)
workerがどちらでも動作するので、MacでUnityのビルド走らせつつ、コンテナでサーバサイドのテストとかできそう。
ということで、要件を満たしてくれそうなのでやってみることにしました。
ここから導入になるのですが、先人の記事を参考にしてこの記事も書いているため、新しいバージョンでは動作しない恐れがあります。
この時、導入時にハマったところも含め記載するのですが、ご留意ください。
まず、docker/docker-composeの導入ができてない方は下記を参考にして、使えるようにしましょう。(他力本願)
次に作業用ディレクトリを作成して、動作に必要な鍵を作っておきます。ssh-keygenを使えばいいのですが、 生成時のオプション指定に注意する必要がありました。
github issue : panic: runtime error: invalid memory address or nil…
mkdir concourse_sample
cd concourse_sample
mkdir -p keys/web
ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N '' -m PEM
ssh-keygen -t rsa -f ./keys/web/session_signing_key -N '' -m PEM
mkdir -p keys/worker
ssh-keygen -t rsa -f ./keys/worker/worker_key -N '' -m PEM
ssh-keygen -t rsa -f ./keys/worker/darwin_worker_key -N '' -m PEM
cat ./keys/worker/worker_key.pub >> ./keys/web/authorized_worker_keys
cat ./keys/worker/darwin_worker_key.pub >> ./keys/web/authorized_worker_keys
cp ./keys/web/tsa_host_key.pub ./keys/worker
できたら、docker-compose用のconcourse構成を下記のようにして作成します。
environmentは環境変数から設定しても構いません。CONCOURSE_EXTERNAL_URLは他のPCをworkerとして使う場合はlocalhostではなく、 IPアドレスかホスト名を設定してください。
version: '3'
services:
concourse-db:
image: postgres
environment:
POSTGRES_DB: concourse
POSTGRES_USER: concourse_user
POSTGRES_PASSWORD: concourse_pass
PGDATA: /database
concourse-web:
image: concourse/concourse
command: web
restart: unless-stopped
depends_on: [concourse-db]
ports: ["8080:8080", "2222:2222"]
volumes: ["./keys/web:/concourse-keys"]
environment:
CONCOURSE_EXTERNAL_URL: http://localhost:8080
CONCOURSE_BASIC_AUTH_USERNAME: auth_user
CONCOURSE_BASIC_AUTH_PASSWORD: auth_pass
CONCOURSE_POSTGRES_HOST: concourse-db
CONCOURSE_POSTGRES_USER: concourse_user
CONCOURSE_POSTGRES_DATABASE: concourse
CONCOURSE_POSTGRES_PASSWORD: concourse_pass
CONCOURSE_ADD_LOCAL_USER: test:test
CONCOURSE_MAIN_TEAM_LOCAL_USER: test
concourse-worker:
image: concourse/concourse
privileged: true
depends_on: [concourse-web]
command: worker
volumes: ["./keys/worker:/concourse-keys"]
environment:
CONCOURSE_TSA_HOST: concourse-web:2222
用意できたら、docker-compose upしてみましょう。
はじめは正常に起動しているかログを確認したほうがよいでしょう。
failed や unreachable などのワードが見えたら、どこかしらがうまく行ってないと思います。
問題なければ、http://localhost:8080にアクセスすれば、welcome to concourseと表示されます。
test : testでログインできるかも確認してみましょう。
次にネイティブで動くworkerを動作させます。
動作させるには、concourseのCLIを使う必要があります。こちらから
から各OSに適したものを取得してください。今回はmacなのでconcourse-X.X.X-darwin-amd64.tgzを取得しました。
展開するとconcourse / flyコマンドがありますので、適宜パスを通すなどしましょう。
tar -xvzf concourse-X.X.X-darwin-amd64.tgz
cd concourse
tar -xvzf fly-assets/fly-darwin-amd64.tgz
# 下記のコマンドに適宜パスを通す
./bin/concourse
./fly-assets/fly
workerの起動はホストや鍵を設定して行います。working directoryは勝手に生成されます。
こちらも実行直後はログをみて、起動に失敗してないかチェックしてみましょう。
concourse worker --work-dir ./working_sample \
--tsa-host localhost:2222 \
--tsa-public-key ./keys/worker/tsa_host_key.pub \
--tsa-worker-private-key ./keys/worker/darwin_worker_key
worker.beacon-runner.beacon.registered等出ていれば良いと思います。
これで導入が終わりました。
次は、pipelineを作って実行していきます!
■ 参考