Gitlab-aws-ci

GitlabにはShared Runnerがあり、こちらを利用すれば手間なくCIを回せる。
実際に使ってみて以下の点が不便だった。
- 自分のJobの実行を待つことがある
- ジョブが遅い
- 無料枠(400分/月)を使い切る
▼無料枠の記載

AWSに立てたECSを使ってCIを回していたが、
個人的なプロジェクトがFirebaseを利用しているため、請求書をまとめてしまいたい。
ついでにGKEを使ってみたい。

GKEでCI回すのは非推奨になっていたので、CodeBuildを使ってCIを回す方向で舵きり

Cloud Buildとは
サーバーレスCI/CDプラットフォームで、ビルド、テスト、デプロイする。
- Java、Go、Node.jsなど、全てのプログラミング言語でソフトウェアを迅速にビルドする。
- 15種類のマシンタイプから選択して、プールあたり数百の同時ビルドを実行できる
- VM、サーバーレス、Kubernetes、Firebaseなどの複数の環境でデプロイできる
- クラウドでホストされたフルマネージドのCI/CDワークフローにプライベートネットワークからアクセスする
- データ所在地を使用して、地理的なリージョンまたは特定のロケーション内にデータ保存をする

Cloud Buildの概要
Cloud Buildは、Google Cloud Platformのインフラストラクチャでビルドを行うサービスである。
Cloud Buildは、さまざまなリポジトリやクラウドストレージスペースからソースコードをインポートし、仕様に合わせてビルドを実行し、DockerコンテナやJavaアーカイブなどのアーティファクトを生成できる。

そもそも、AWSでどうやって立てたのかわからないので、そこからかいし

EC2 instanceにgitlab-runnerというインスタンがt2.microで立っている。
これがオートスケールして動作している様子
多分公式ドキュメントを読んで建てている

gitlab-runnerを待ち構えるEC2インスタンスを作成する。
以下の内容を参考
まず初めにキーペアを作成する。
これはインスタンスに安全にアクセスするために必要

キーを作成ボタンを押すと、プライベートキーがダウンロードされる。
これを~/.ssh
以下に保存しておく

$ chmod 400 gitlab_runner_instance_access_key_pair.pem
をして権限変更しておく。(これをしないと後で利用できない)

次にセキュリティグループを作成する。わかりやすく言えばインスタンス専用のファイアウォール。
後で開けるかもしれないけど、一旦最小限の権限でセキュリティグループを設定する。
VPCのところはデフォルトとなっているものを選択する(右のバツボタン押すと選択項目でる)
インバウンド(外部からインスタンスへ)のルールに自分のIPからしか入れないようにしておく。
アウトバウンドルールはそのまま

AMIは無料枠の中から選ぶと良い。特にこだわりなければAmazonLinux選択
インスタンスタイプ=性能はt2.microで問題ない
セキュリティグループは先ほど作成したセキュリティグループを選択する

起動ボタンを押すと、キーペアを聞かれるので、先ほど作成したキーペアを選択

この後、インスタンスが問題なく起動していることを確認する。
実行中となっていればOK

作成したインスタンスへSSHを利用して接続する。
作成したインスタンスを選択した上で、「接続」ボタンをクリックする
SSHクライアント タブに行くと、接続方法が書いてある。例に記載のものをコピーして、ターミナルで実行

Amazon LinuxはCentOSに近いので、そちらを参考に実施
公式のGitLabリポイジトリを追加
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
次にインストールする
sudo yum install gitlab-runner

GitLabランナーの登録をする。GitLabインスタンスをバインドする処理

登録処理中にexecutorを聞かれている。とりあえずdockerを選択したけど、他の選択肢について後ほど調べておきたい

node:12は利用するプロジェクトがnode:12を利用しているので、

登録が完了すると、Available specific runnersに登録したgitlab runnerが表示される

docker
ではなく、docker+machine
らしい。
再登録方法見つからないので、とりあえず設定ファイルを直接いじる
$sudo vim /etc/gitlab-runner/config.toml

dockerのインストールを開始
多分centOSの方法で問題ないはず
リポジトリ追加
$sudo yum install -y yum-utils
$sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
インストール
sudo yum install docker-ce docker-ce-cli containerd.io

だめでした。CentOSの手順ではうまくいかず、調べたところAmazon公式に回避方法があるので試す。
その前に、先ほど作業していた影響でdocker-ceのリポジトリアクセスができなくて後続の作業ができないので、
/etc/yumrepos.d
以下にあるdocker-re.repoを削除しておく
以下の手順に従って進める
$sudo yum update -y
$sudo amazon-linux-extras install docker
dockerサービス起動
$sudo systemctl start docker.service
ついでに自動起動設定しておく
$sudo systemctl enable docker.service

オートスケールするように設定ファイルを編集する
$sudo cat /etc/gitlab-runner/config.toml
いじる箇所は
concurrentを1から10へ変更
runners のところへlimit = 20を追加
runners.docker のところへprivileged = trueに変更、 disable_cache=trueに変更
runners.cacheセクションも変更したいけど、S3の設定が必要そうなので、一旦無視

色々と設定が続くけど、わかんなくなったので
過去の設定ファイルをここに転記しておく
concurrent = 10
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-ci-auto-scaling"
url = "https://gitlab.com/"
token = "__DELETED__"
executor = "docker+machine"
limit= 20
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "ubuntu"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = true
volumes = ["/cache"]
shm_size = 0
[runners.machine]
IdleCount = 0
MachineDriver = "amazonec2"
MachineName = "gitlab-ci-%s"
MachineOptions = ["amazonec2-access-key=__DELETED__", "amazonec2-secret-key=__DELETED__", "amazonec2-region=us-east-2", "amazonec2-root-size=30", "amazonec2-instance-type=m4.large", "amazonec2-vpc-id=vpc-2168d54a", "amazonec2-subnet-id=subnet-b5389dde"]
OffPeakTimezone = ""
OffPeakIdleCount = 0
OffPeakIdleTime = 0
[runners.cache]
Type = "s3"
Shared = false
[runners.cache.s3]
ServerAddress = "s3.amazonaws.com"
AccessKey = "__DELETED__"
SecretKey = "__DELETED__"
BucketName = "gitlab-runner-cache-s3-bucket"
BucketLocation = "us-east-2"

S3のキャッシュ使ってるけど、使われているのか不明

IAMで適切なロールを持ったユーザーを作成する必要があること、S3にキャッシュ用のバケットを用意する必要がある。
一旦ここでは、過去に作成したものをそのまま流用するとして進行する。

サブネットの設定があるんだけど、既存のものなのか、新しく作成したものなのか不明。
とりあえず
config.tomlの内容を前回作成していたものに完全に合わせて進行する。

MachineOptionsにスポットインスタンスを利用するように設定追加
"amazonec2-request-spot-instance=true",
"amazonec2-spot-price=0.03",
"amazonec2-block-duration-minutes=60"