Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@unknown_ds

ConcourseCIをWindows環境(Docker)で試してみる

More than 1 year has passed since last update.

概要

パイプラインベースのCI/CD(継続的インテグレーション/デリバリー)ツール Concourse CI を試してみた時の備忘録です。
https://concourse-ci.org/

Windows環境でDockerを使って起動します。一部ハマった箇所があったのでそのメモも含みます。
更にwindows-workerの起動も試してみます。

環境

Windows10 pro 64bit
Docker Desktop Community ver.2.0.0.3(31259)
git for windows ver.2.21.0
Concourse ver.5.1.0

実装

作業ディレクトリの準備

作業ディレクトリを作成します、以下はその作業ディレクトリで行います。

sshキーの生成

[keys]ディレクトリを作成し、その下に[web]と[worker]を作成します。
sshキーを作成&コピーを行います。

mkdir keys\web keys\worker

ssh-keygen -t rsa -f .\keys\web\tsa_host_key -N ""
ssh-keygen -t rsa -f .\keys\web\session_signing_key -N ""
ssh-keygen -t rsa -f .\keys\worker\worker_key -N ""

copy .\keys\worker\worker_key.pub .\keys\web\authorized_worker_keys
copy .\keys\web\tsa_host_key.pub .\keys\worker

以下の様なツリーになります。

└─[workdir/]
  └─keys/
    ├─web/
    │ ├─authorized_worker_keys
    │ ├─session_signing_key
    │ ├─session_signing_key.pub
    │ ├─tsa_host_key
    │ └─tsa_host_key.pub
    └─worker/
      ├─tsa_host_key.pub
      ├─worker_key
      └─worker_key.pub

docker-compose.ymlの用意

https://github.com/concourse/concourse-docker
から入手する。
(ID/パスワード等は実際の運用時には変更する。)
以下のような感じ。サービス名やバージョンは少し変更しています。

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

docker-composeで起動

docker-compose up -d で起動させる。

web画面の確認

http://localhost:8080/ にアクセスすると以下のような画面になります。

SnapCrab_Dashboard - Concourse ‎- Microsoft Edge_2019-4-22_14-0-15_No-00.png

web画面が表示されなかった時のメモ

CONCOURSE_ADD_LOCAL_USERCONCOURSE_MAIN_TEAM_LOCAL_USER がないとweb画面へアクセスできないようです。
参考にしたdocker-compose.ymlには上記の設定がなくアクセスできませんでした。Concourseのバージョン違いによるものかもしれません。(未検証)

また、CONCOURSE_EXTERNAL_URL を環境変数にして http://localhost:8080 ではなく、ローカルIPで設定する説明がありましたが、上記でも特に問題なく動きました。

各コンテナへのログイン

3つのコンテナが立ち上がっているので各コンテナへログインするためのdockerコマンドメモ。

docker exec -u root -it concourse-docker_concourse-web_1 /bin/bash
docker exec -u root -it concourse-docker_concourse-worker_1 /bin/bash
docker exec -u postgres -it concourse-docker_concourse-db_1 /bin/bash

Command Line Interface(fly)のインストール

表示されたweb画面のアイコンがそれぞれ mac, windows, linux用のCLI(fly)のダウンロードリンクになっているので、環境にあったものをダウンロードする。

バージョン確認

>fly -v
5.1.0

実行テスト

fly でターゲットの確認

>fly targets
name   url                   team  expiry
sample http://localhost:8080 main  (省略)

ログイン

>fly -t sample login

で表示されたURLにブラウザでアクセスしてログインする。

テスト用サンプルジョブymlを用意

dokcerイメージを取得して dateコマンドを実行するだけのサンプルです。

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

flyでジョブを登録設定

flyでジョブを登録します、-tが対象ターゲット指定、spset-pipelineのエイリアスのようです。

> fly -t sample sp -p build_sample -c build_sample.yml

target saved
jobs:
  job job-sample has been added:
+ 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

apply configuration? [yN]:

変更があれば差分を表示してくれる。
問題なければ[Y]を押下する。

webページにbuild_sampleが追加される。
SnapCrab_NoName_2019-4-22_17-27-46_No-00.png

追加された状態ではステータスが[pause]になっているので、動作させるには再生ボタンを押下する。

buid_sample_pending.png

まだ何もしていないため、ステータスは[pending]になります。

ジョブ起動

build_sample_job.png

ジョブの中にはいって右上の[+] Trigger Build を押下する。
開始すると以下のような画面に。

build_sample_job_start.png

成功すると以下のような画面になる。
build_sample_job_success.png

Windows-Workerの設定

windows環境下でのビルド等を行うためのwindowsワーカーの設定方法です。

workerの確認

ワーカーは現在はlinuxのみになっています。(Dockerで立ち上げているため)

>fly -t sample workers
name          containers  platform  tags  team  state    version
7105cfd27737  2           linux     none  none  running  2.1

準備

  1. windowsPCにてワーカー用ディレクトリを用意します。
  2. サブディレクトリにワークディレクトリを作成します。
  3. https://concourse-ci.org/ の[download]から concourse-5.1.0-windows-amd64.zip をDLし、concourse.exeをワークディレクトリに置きます。
  4. 次に、TSAホストの公開鍵tsa_host_key.pub と ワーカーの秘密鍵worker_key も一緒におきます。

以下のような構成になります。

└─[workerdir]
  └─work/
    └─concourse.exe
      ├─tsa_host_key.pub
      └─worker_key

起動

ワーカー用ディレクトリにて以下を実行します。

> concourse worker /work-dir .\work /tsa-host localhost:2222 /tsa-public-key .\tsa_host_key.pub /tsa-worker-private-key .\worker_key

起動に成功すると以下のコマンドで確認ができます。
<win-worker> はwindows-workerになったPC名が入ります。

> fly -t sample workers
name          containers  platform  tags  team  state    version
7105cfd27737  2           linux     none  none  running  2.1
<win-worker>  0           windows   none  none  running  2.1

確認

確認用に最低限の.NETコンソールアプリケーション("Hello World"を出すだけ)をビルドします。MSBuildを使用しますのでパスを通す必要があります。

build_datdotnet.yml
resources:
  - name: code
    type: git
    source:
      uri: https://github.com/unknown-ds/DatDotNet.git
      branch: master
jobs:
  - name: build
    plan:
    - aggregate:
      - get: code
        trigger: true
    - task: compile
      privileged: true
      file: code/Pipeline/compile.yml

上記ymlファイルをジョブに設定します。

> fly -t sample sp -p build_datdotnet -c build_datdotnet.yml

結果は以下の様になりました。色が微妙です。結果がワーニングになってしまいました。
win_worker_build.png

exeファイルは concourse.exe のワークディレクトリ以下から
\containers\<?????>\tmp\build\<?????>\code\DatDotNet\bin\Debug\DatDotNet.exe
にありました。(<?????>は毎回変わる)
動作も問題ないようですので、ビルドは成功しているようです。

エラー対処例

実行時に
failed to create hardlink for bind mount: symlink (省略) A required privilege is not held by the client.
というエラーが出る場合は、concourse.exeを管理者権限で起動すると良いです。

まとめ

とりあえず動かすだけができたが、windowsワーカーについてはまだ検証不足です。
制御は fly コマンドで行うようになっているようで、ここら辺をもう少し調べていかないとならないが日本語情報が少ない。。:expressionless:

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
unknown_ds
都内在住。 UnrealEngine5 ってどうなっているのでしたっけ?

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?