Ubuntu16.04にConcourseCIをインストールする方法
序章
Concourse CI は、構成可能な宣言型構文を使用してパイプラインのテストを自動化するように設計された、最新のスケーラブルな継続的インテグレーションシステムです。 Concourseは、以前のCIシステムの成功を基に、パイプライン管理を簡素化し、「スノーフレーク」サーバーを排除して、テストサーバーが処理するコードと同様に規制されるようにすることを目的としています。
このチュートリアルでは、Ubuntu16.04サーバーにConcourseCIをインストールする方法を示します。 バックエンドとして使用するPostgreSQLデータベースを構成し、Concourseバイナリをダウンロードしてインストールしてから、継続的インテグレーションパイプラインを構築して実行できるようにするWebプロセスとワーカープロセスを構成します。
前提条件
このガイドを完了するには、少なくとも1GBのRAMを備えたUbuntu16.04サーバーが必要です。 続行する前に、 Ubuntu 16.04初期サーバーセットアップガイドの説明に従って、非ルートsudo
ユーザーとファイアウォールを構成します。
PostgreSQLのインストールと構成
Concourse CIバイナリをダウンロードする前に、サーバーにPostgreSQLインスタンスを設定する必要があります。 Concourseは、PostgreSQLデータベースを使用してパイプラインデータを保存します。
まず、ローカルパッケージインデックスを更新して、使用可能なファイルのローカルビューを更新します。 その後、Ubuntuのデフォルトリポジトリからpostgresql
およびpostgresql-contrib
パッケージをインストールします。
- sudo apt-get update
- sudo apt-get install postgresql postgresql-contrib
データベースソフトウェアがインストールされたら、concourse
という名前の専用PostgreSQLユーザーを作成して、データベースシステム内のConcourseアセットを管理します。 このユーザーを作成するには、sudo
を使用して、データベースシステムへの管理者アクセス権を持つpostgres
システムユーザーとして機能します。
- sudo -u postgres createuser concourse
デフォルトでは、Concourseはatc
というデータベースへの接続を試みます。 Concourseは、メインのWebおよびAPIハブを「ATC」と呼びます。これは「航空交通管制」の略です。 このデータベースを作成し、concourse
データベースユーザーに所有権を割り当てて、適切なアクセスを提供できます。
- sudo -u postgres createdb --owner=concourse atc
データベースが整ったので、ConcourseCIバイナリをダウンロードしてインストールする準備が整いました。
ConcourseCI実行可能ファイルをダウンロードしてインストールします
Concourseは、WebサイトとGitHubの両方で、Linuxプラットフォーム用にコンパイルされた実行可能ファイルへのリンクを提供します。
それらを見つける最も簡単な場所は、ConcourseCIダウンロードページです。 ダウンロードセクションのコンコースバイナリセクションで、右クリックしてLinuxプラットフォームダウンロードのリンクの場所をコピーします。 このページはすぐに戻ってきますので、開いたままにしてください。
サーバーで、/tmp
ディレクトリに切り替え、curl
を使用して、コピーしたリンクをダウンロードします。
- cd /tmp
- curl -LO copied_URL_for_concourse_binary
次に、最新のfly
コマンドラインクライアントをダウンロードします。 Concourse CIダウンロードページに戻り、DownloadsセクションのFlyBinaries セクションで、右クリックしてのリンク位置をコピーします。 Linuxプラットフォームのダウンロード。
サーバーで、コピーしたリンクを/tmp
にcurl
で再度ダウンロードします。
- cd /tmp
- curl -LO copied_URL_for_fly_binary
ダウンロードリクエストでエラーが発生した場合、ファイルにはバイナリプログラムではなくHTTPエラーメッセージが含まれます。 次のように入力して、ファイルが実際にバイナリ実行可能ファイルであることを確認します。
- file *linux_amd64 | grep executable
Outputconcourse_linux_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3f24eae5da950594d8d1aaea7631bc20883afba3, not stripped
fly_linux_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
上記の出力は、ファイルが実行可能ファイルであることを示しています。 ファイルに実行可能アクセス許可を追加し、_linux_amd64
サフィックスを削除して、次のように入力して/usr/local/bin
ディレクトリに移動できます。
- chmod +x concourse* fly*
- sudo mv concourse* /usr/local/bin/concourse
- sudo mv fly* /usr/local/bin/fly
各プログラムのバージョンを尋ねることは、すべてが正しく動作していることを確認するための小さなチェックとして役立ちます。
- cd ~
- concourse --version
- fly --version
Output3.0.1
3.0.1
バイナリが配置されたので、Concourseの構成を開始できます。
コンコースCI構成アセットを作成する
次に、Concourseが起動に使用する構成とキーの組み立てを開始できます。
始める前に、関連するすべてのファイルを保持できる構成ディレクトリを作成します。
- sudo mkdir /etc/concourse
これで、暗号化キーを生成し、Concourse構成を定義するファイルを作成できます。
キーファイルの作成
Concourseは、相互に安全に通信できる必要があるいくつかの関連コンポーネントで構成されています。
ATC は、WebおよびAPIリクエストを処理し、パイプラインを調整するメインハブです。 Workers は、パイプラインで定義されたCI/CDタスクを実行するためのコンテナーを管理します。 TSA は、ワーカーをATCに安全に登録するカスタムSSHサーバーです。
これらすべてのコンポーネントを単一のサーバーで実行しますが、ワーカーとTSAは安全に通信することを期待しています。 この期待に応えるために、次の3つのキーセットを作成します。
- TSAコンポーネントのキーペア
- 労働者のためのキーペア
- ユーザーセッションおよびTSAからATCへの通信用のトークンに署名するために使用されるセッション署名キーペア
これらは各コンポーネントの起動時に自動的に使用されるため、パスワードなしでこれらのキーを作成する必要があります。 次のように入力すると、/etc/concourse
ディレクトリにこれらの各キーペアを作成できます。
- sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/tsa_host_key
- sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/worker_key
- sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/session_signing_key
コンコースディレクトリをチェックインすると、3つの公開キーと3つの秘密キーが使用可能になっていることがわかります。
- ls -l /etc/concourse
Outputtotal 24
-rw------- 1 root root 1679 May 11 17:19 session_signing_key
-rw-r--r-- 1 root root 394 May 11 17:19 session_signing_key.pub
-rw------- 1 root root 1679 May 11 17:19 tsa_host_key
-rw-r--r-- 1 root root 394 May 11 17:19 tsa_host_key.pub
-rw------- 1 root root 1675 May 11 17:19 worker_key
-rw-r--r-- 1 root root 394 May 11 17:19 worker_key.pub
TSAは、許可されたキーファイルをチェックすることにより、システムへの接続を許可されているワーカーを決定します。 正常に接続できるように、許可されたキーファイルに生成したワーカーの公開キーを事前に入力する必要があります。
これが私たちの唯一のワーカーなので、ファイルをコピーするだけです。
- sudo cp /etc/concourse/worker_key.pub /etc/concourse/authorized_worker_keys
これで、許可されたワーカーのキーファイルと初期ファイルができたので、Concourse構成を定義するファイルを作成できます。
環境構成ファイルの作成
Concourseバイナリは、構成ファイルからネイティブに読み取りません。 ただし、プロセスの開始時に渡された環境変数から構成値を取得できます。
すぐに、Concourseサービスを定義および管理するためのsystemd
ユニットファイルを作成します。 ユニットファイルは、ファイルから環境変数を読み取り、プロセスの開始時にそれらをプロセスに渡すことができます。 ATCおよびTSAコンポーネントを開始するConcourseweb
プロセスの変数を定義するファイルと、Concourseworker
プロセスの別のファイルを作成します。
次のように入力して、web
プロセスのファイルを作成して開きます。
- sudo nano /etc/concourse/web_environment
内部では、ATCおよびTSAコンポーネントに必要な環境変数を定義します。 各変数はCONCOURSE_
で始まります。
まず、変更する必要のない静的な値をいくつか定義します。 これらの変数は、秘密TSAとセッションキーの場所、許可されたワーカーを定義するファイル、およびPostgreSQLソケットの場所を定義します。
# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql
次に、環境に合わせて変更する必要のあるいくつかの変数を設定します。 CONCOURSE_EXTERNAL_URL
は、サービスがバインドするIPアドレスとポートを定義します。 これをサーバーのパブリックIPアドレスとポート8080に設定します。
また、コンコース管理グループとして機能するmain
チームのユーザー名とパスワードを設定します。 ここで、任意のユーザー名とパスワードを選択できます。 これらの値を変更してサービスを再起動することにより、いつでも管理者の資格情報を変更できます。
# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql
# Change these values to match your environment
CONCOURSE_BASIC_AUTH_USERNAME=sammy
CONCOURSE_BASIC_AUTH_PASSWORD=theshark
CONCOURSE_EXTERNAL_URL=http://servers_public_IP:8080
終了したら、ファイルを保存して閉じます。
次に、worker
プロセスの環境ファイルを作成します。
- sudo nano /etc/concourse/worker_environment
内部では、ワーカーの秘密鍵、TSAの公開鍵、およびワーカーがファイルを保存するディレクトリの場所を定義します。 また、TSAに到達できるアドレス(この場合はローカルホスト)を設定します。 以下の値を変更せずに使用できます。
# These values can be used as-is
CONCOURSE_WORK_DIR=/var/lib/concourse
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/etc/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/etc/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1:2222
終了したら、ファイルを保存して閉じます。
専用システムユーザーの作成と権限の調整
先に進む前に、Concourseweb
プロセスを実行するための専用のLinuxユーザーを作成する必要があります。 これにより、制限された権限でWeb向けサービスを開始できるようになります。
PostgreSQLがデフォルトで認証を処理する方法のため、ユーザー名が前に作成したPostgreSQLユーザー名と一致することが重要です。 次のように入力して、concourse
というシステムユーザーとグループを作成します。
- sudo adduser --system --group concourse
次のように入力することで、/etc/concourse
ディレクトリとその内容に対する所有権を新しいユーザーに与えることができます。
- sudo chown -R concourse:concourse /etc/concourse
環境ファイルには、CIサーバーの管理ユーザー名やパスワードなどの機密データが含まれています。 通常のユーザーがこれらのファイルの値を読み取ったり変更したりできないように、環境ファイルのアクセス許可を調整します。
- sudo chmod 600 /etc/concourse/*_environment
現在、構成資産はconcourse
システムユーザーによって所有されており、他のユーザーに対する特権は制限されています。
Webおよびワーカープロセス用のSystemdユニットファイルを作成する
これで、アプリケーションプロセスを開始および管理するConcourseCIユニットファイルを定義する準備が整いました。 TSAおよびATCコンポーネントを処理するweb
プロセス用に1つのファイルを作成し、パイプラインタスクのコンテナーを処理するworker
プロセス用に1つのファイルを作成します。
コンコースWebユニットファイルの作成
/etc/systemd/system
ファイル内にconcourse-web.service
ファイルを作成することから始めます。
- sudo nano /etc/systemd/system/concourse-web.service
中に、次の内容を貼り付けます。
[Unit]
Description=Concourse CI web process (ATC and TSA)
After=postgresql.service
[Service]
User=concourse
Restart=on-failure
EnvironmentFile=/etc/concourse/web_environment
ExecStart=/usr/local/bin/concourse web
[Install]
WantedBy=multi-user.target
ファイルの最初のセクションは、web
プロセスのユニットの説明を設定し、注文を決定するときにこのユニットをPostgreSQLユニットの後に開始する必要があることを示しています。
[Service]
セクションは、サービスの実行方法を定義します。 以前に構成したconcourse
ユーザーとしてサービスを実行し、失敗した場合はサービスを自動的に再起動するようにsystemdに指示します。これは、プロセスがメモリの制約や同様の問題で停止した場合に役立ちます。 前に定義したweb_environment
ファイルをロードして環境を確立し、concourse web
を呼び出して実際のプロセスを開始します。
[Install]
セクションは、起動時に開始するようにサービスを構成する場合に、ユニットをシステムの開始順序に関連付ける方法をsystemdに指示します。
終了したら、ファイルを保存して閉じます。
コンコースワーカーユニットファイルの作成
次に、同様のファイルを開いてworker
プロセスを定義します。
- sudo nano /etc/systemd/system/concourse-worker.service
中に、次の内容を貼り付けます。
[Unit]
Description=Concourse CI worker process
After=concourse-web.service
[Service]
User=root
Restart=on-failure
EnvironmentFile=/etc/concourse/worker_environment
ExecStart=/usr/local/bin/concourse worker
[Install]
WantedBy=multi-user.target
このユニットは、concourse-web
ユニットと同様に機能します。 今回は、コンコースweb
プロセスが開始された後、worker
プロセスを開始するようにシステムに指示します。 worker
プロセスは、コンテナ管理に管理者権限が必要なため、concourse
ではなくroot
ユーザーとして実行されます。 worker_environment
ファイルをロードし、concourse worker
コマンドを使用してプロセスを開始します。
終了したら、ファイルを保存して閉じます。
ファイアウォールを調整してサービスを開始する
ユニットファイルが配置されたら、ファイアウォールを介したアクセスを許可してサービスを開始できます。
web
プロセスはポート8080で接続をリッスンするため、ufw
ファイアウォールでそのポートへのアクセスを開く必要があります。
- sudo ufw allow 8080
worker
プロセスで使用されるコンテナーは、インターネットに正しく到達してDNSクエリを解決できるように、転送アクセスが必要です。 これを有効にするには、次のように入力します。
- sudo ufw default allow routed
これで、次のように入力してサービスを開始できます。
- sudo systemctl start concourse-web concourse-worker
次のように入力すると、両方のサービスが正しく開始されたことを確認できます。
- sudo systemctl status concourse-web concourse-worker
Output● concourse-web.service - Concourse CI web process (ATC and TSA)
Loaded: loaded (/etc/systemd/system/concourse-web.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 40s ago
Main PID: 9954 (concourse)
Tasks: 7
Memory: 100.0M
CPU: 2.058s
CGroup: /system.slice/concourse-web.service
└─9954 /usr/local/bin/concourse web
May 11 20:19:51 testatc concourse[9954]: {"timestamp":"1494533991.818562269","source":"tsa","message":"tsa.connection.keepalive","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1","type":"keepalive"}}
. . .
● concourse-worker.service - Concourse CI worker process
Loaded: loaded (/etc/systemd/system/concourse-worker.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 39s ago
Main PID: 9960 (concourse)
Tasks: 9
Memory: 619.6M
CPU: 20.353s
CGroup: /system.slice/concourse-worker.service
└─9960 /usr/local/bin/concourse worker
May 11 20:19:12 testatc concourse[9960]: {"timestamp":"1494533952.909682751","source":"tsa","message":"tsa.connection.channel.forward-worker.heartbeat.start","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1.1.1.7","worker-address":"127.0.0.1:38993","worker-platform":"linux","worker-tags":""}}
. . .
両方のサービスが「アクティブ(実行中)」と表示されていること、およびログ行に明らかなエラーが含まれていないことを確認してください。 web
サービスに特に注意して、ログ行がデータベースへの接続の問題を示していないことを確認してください。
サービスが正常に開始された場合は、サーバーが起動するたびにサービスが開始されるようにサービスを有効にします。
- sudo systemctl enable concourse-web concourse-worker
コマンドラインおよびWebインターフェイスを介したアクセスを確認します
Concourseサービスが実行されているので、アクセスできることを確認する必要があります。
コマンドラインでのアクセスの確認
まず、fly
コマンドラインクライアントを使用してConcourseサービスにアクセスできることを確認しましょう。
login
サブコマンドを使用して/etc/concourse/web_environment
ファイルで構成した管理ユーザー名とパスワードを使用してログインする必要があります。 単一のfly
バイナリを使用して、複数のConcourseサーバーに接続および管理できるため、このコマンドは、さまざまなサーバーのエイリアスとして「ターゲット」と呼ばれる概念を使用します。 ターゲットを「ローカル」と呼び、ローカルのConcourseサーバーにログインします。
- fly -t local login -c http://127.0.0.1:8080
web_environments
ファイルで設定したmain
チームのユーザー名とパスワードの入力を求められます。 クレデンシャルを入力すると、「ターゲットが保存されました」と表示されます。
Outputlogging in to team 'main'
username: sammy
password:
target saved
これは、正常にログインできたことを示しています。 ここにいる間に、次のように入力して、ワーカープロセスがTSAコンポーネントに正常に登録できたことを確認しましょう。
- fly -t local workers
Outputname containers platform tags team state version
concourse-server 0 linux none none running 1.0
fly
コマンドは、パイプラインを構成し、ConcourseCIサービスを管理するために使用されます。 fly help
コマンドは、追加のコマンドに関する情報を提供します。
Webインターフェイスを介したアクセスの確認
次に、サーバーのIPアドレスにアクセスし、続いてWebブラウザで:8080
にアクセスして、Webアクセスを確認します。
http://servers_public_IP:8080
最初のConcourseCIページにアクセスできるはずです。
ここから、オプションで、プラットフォームに対応する画像をクリックして、fly
コマンドをコマンドラインクライアントとしてローカルコンピューターにダウンロードできます。 これにより、サーバーにログインせずにCI環境を管理できます。 fly
で初めてログインするときは、127.0.0.1
ではなくサーバーのパブリックIPアドレスを指定することを忘れないでください(リモートでログインする前に、以下の暗号化に関する警告をお読みください)。
右上隅にあるloginリンクをクリックすると、Webインターフェイスにログインできます。 まず、チームを選択するように求められます。 管理グループであるmainチームは、デフォルトで使用可能な唯一の選択です。
次のページで、クレデンシャルを入力するように求められます。
警告:Concourse CIによって提供されるWebインターフェイスとAPIゲートウェイはデフォルトで暗号化されていないため、ユーザー名とパスワードはプレーンテキストとしてサーバーに送信されます。 このインストールを評価目的以外の目的で使用することを計画している場合は、ログインする前にWebインターフェイスをSSLで保護してください。 Concourse CI 用のSSL保護されたNginxリバースプロキシのセットアップに関する指示に従って、安全なアクセスを構成します。
web_environment
ファイル内で構成した資格情報を入力すると、ログインしてデフォルトのプレースホルダーインターフェイスに戻ります。
fly
を使用してパイプライン構成をサーバーに送信すると、この画面は、パイプラインアクティビティを監視できるインターフェイスに置き換えられます。
結論
このガイドでは、PostgreSQLとConcourseバイナリをインストールし、暗号化キーを設定し、Concourseとネットワークアクセスを構成しました。 サービスを開始した後、fly
コマンドを使用してローカルにログインし、Webインターフェイスにアクセスして機能を確認しました。
前述のように、実際の作業にConcourseを使用する前に、SSLを使用してWebおよびAPIゲートウェイを保護することが重要です。 サーバーとリモートで対話する前に、 Nginxを使用したConcourseCIのSSLリバースプロキシのセットアップに関するガイドに従って、サーバーへの安全なアクセスを構成します。
fly
を使用してパイプラインをConcourseサーバーに追加する方法については、Concourseドキュメントの「helloworld」の例を確認してください。