CircleCIを利用することで、お手軽にCIを開始できることは、過去のエントリーでも繰り返し紹介してきました。しかし機密保持等の事情から、クラウドサービスを利用できない環境もあるのではないでしょうか。
こうしたケース向けに、CircleCIではオンプレミス版であるCircleCI Serverを提供しています。CircleCI ServerはKubernetes上にデプロイするアプリケーションです。その構築手順はドキュメントにまとめられているのですが、このドキュメントはAWS/GCPの両環境を併記していたり、やや冗長な手順が混在する都合上、全体的に見通しが悪くなっています。また言葉が足らないせいで、初見では理解しづらい箇所もいくつか存在します。
そこで本ブログでは、AWSのEKSクラスター上にCIrcleCI Serverを構築するための最短手順*1を、Step by Stepでわかりやすく紹介します。なおインストールするバージョンは、CircleCI Server 3.4.1を対象としています。
必要なもの
事前に、以下のものを用意してください。Route53上のゾーンはCircleCI Serverに必須ではありませんが、ExternalDNSを使うといくらか楽ができるため、もしも他の権威サーバーを利用している場合は、サブドメインを作成して委任しておくのがお勧めです。
- AWSアカウント
- GitHubアカウント
- 独自ドメイン
- 上記ドメインのRoute53上のゾーン
- CircleCI Serverのライセンス
必要なツールのインストール
まず構築作業を行う環境を整えます。今回筆者は、AWS EC2上にUbuntu 20.04の作業用インスタンスを新規で用意しました。もちろん、既に手元のPC上にAWSやk8sを操作する環境が用意されている方は、それをそのまま使っても構いません。
作業環境には、以下に挙げるツールをインストールしてください。
AWSCLI
手順に従い、awsコマンドをインストールします。なおEC2の公式Ubuntuマシンイメージには、デフォルトでunzip
コマンドがインストールされていないため注意してください。
$ sudo apt update && sudo apt install -y unzip $ cd && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ unzip awscliv2.zip $ sudo ./aws/install $ rm -rf aws awscliv2.zip
今回はバージョン2.5.6を使います。
$ aws --version aws-cli/2.5.6 Python/3.9.11 Linux/5.13.0-1021-aws exe/x86_64.ubuntu.20 prompt/off
インストール後は、EKSクラスターやIAMユーザーの作成が可能なアカウント*2のプロファイルを設定しておいてください。今回はCircleCI Server構築作業専用の環境を用意していますので、以下のコマンドでデフォルトプロファイルを作成しました。
$ aws configure AWS Access Key ID [None]: (アクセスキーID) AWS Secret Access Key [None]: (シークレットアクセスキー) Default region name [None]: ap-northeast-1 Default output format [None]: json
eksctl
手順に従い、EKSクラスターの作成を簡単に行うラッパーコマンドであるeksctlをインストールします。
$ cd && curl -L "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz $ sudo install -o root -g root -m 755 eksctl /usr/local/bin/eksctl $ rm -f eksctl
今回はバージョン0.93.0を使います。
$ eksctl version 0.93.0
kubectl
$ cd && curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl $ rm -f kubectl
kubectlはバージョン1.19以上が必要です。今回はバージョン1.23を使います。
$ kubectl version --client Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
Helm
手順に従い、k8sのパッケージ管理システムであるHelmをインストールします。
$ curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Helmはバージョン3.4.0以上が必要です。今回はバージョン3.8.2を使います。
$ helm version version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b", GitTreeState:"clean", GoVersion:"go1.17.5"}
KOTS
Replicatedアプリケーションの管理を行う、kubectlのプラグインであるKOTSをインストールします。
$ curl -fsSL https://kots.io/install | bash
KOTSはバージョン1.65.0以上が必要です。KOTSとk8sクラスターとのバージョン互換性には注意してください。KOTS1.65.0以上が必須ということは、k8sも1.20以上が必須となります。なお今回はKOTSバージョン1.69.0、EKSバージョン1.21を使います。
$ kubectl kots version Replicated KOTS 1.69.0
Terraform
IaCツールであるTerraformをインストールします。TerraformはCircleCI Server本体ではなく、ジョブを実行するためのNomadクラスターの構築に利用します。なお公式の手順ではリポジトリ鍵の追加にapt-keyコマンドを使用していますが、apt-keyは既に廃止予定となっており、使用は推奨できないコマンドです。そこで以下の手順では、独立したGPGキーリングに変換した上で、APTラインと紐づける方法を採用しています。
$ cd && curl -fsSL -o terraform.key https://apt.releases.hashicorp.com/gpg $ sudo mkdir /usr/local/share/keyrings/ $ sudo gpg --no-default-keyring --keyring /usr/local/share/keyrings/terraform-keyring.gpg --import terraform.key $ echo "deb [arch=amd64 signed-by=/usr/local/share/keyrings/terraform-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/terraform.list $ sudo apt update && sudo apt install -y terraform $ rm -f terraform.key
Terraformはバージョン0.15.4以上が必要です。今回はバージョン1.1.8を使います。
$ terraform --version Terraform v1.1.8 on linux_amd64
これで必要なツール一式が揃いました。次回は実際にS3バケットやEKSクラスターなどを作成していきます。