Open31

Gitlab-aws-ci

296u296u

GitlabにはShared Runnerがあり、こちらを利用すれば手間なくCIを回せる。
実際に使ってみて以下の点が不便だった。

  • 自分のJobの実行を待つことがある
  • ジョブが遅い
  • 無料枠(400分/月)を使い切る

▼無料枠の記載

296u296u

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

296u296u

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

296u296u

Cloud Buildとは

サーバーレスCI/CDプラットフォームで、ビルド、テスト、デプロイする。

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

https://cloud.google.com/build?hl=ja

296u296u

Cloud Buildの概要

Cloud Buildは、Google Cloud Platformのインフラストラクチャでビルドを行うサービスである。

Cloud Buildは、さまざまなリポジトリやクラウドストレージスペースからソースコードをインポートし、仕様に合わせてビルドを実行し、DockerコンテナやJavaアーカイブなどのアーティファクトを生成できる。
https://cloud.google.com/build/docs/overview?hl=ja

296u296u

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

296u296u

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

296u296u

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

296u296u

次にセキュリティグループを作成する。わかりやすく言えばインスタンス専用のファイアウォール。
後で開けるかもしれないけど、一旦最小限の権限でセキュリティグループを設定する。

VPCのところはデフォルトとなっているものを選択する(右のバツボタン押すと選択項目でる)

インバウンド(外部からインスタンスへ)のルールに自分のIPからしか入れないようにしておく。
アウトバウンドルールはそのまま

296u296u

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

296u296u

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

296u296u

https://docs.gitlab.com/runner/install/linux-repository.html
gitlab runnerをインストールする。
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

296u296u

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

296u296u


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

296u296u

だめでした。CentOSの手順ではうまくいかず、調べたところAmazon公式に回避方法があるので試す。
その前に、先ほど作業していた影響でdocker-ceのリポジトリアクセスができなくて後続の作業ができないので、
/etc/yumrepos.d以下にあるdocker-re.repoを削除しておく

以下の手順に従って進める
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

$sudo yum update -y
$sudo amazon-linux-extras install docker

dockerサービス起動
$sudo systemctl start docker.service

ついでに自動起動設定しておく
$sudo systemctl enable docker.service

296u296u

https://docs.gitlab.com/runner/configuration/runner_autoscale_aws/
オートスケールするように設定ファイルを編集する

$sudo cat /etc/gitlab-runner/config.toml

いじる箇所は
concurrentを1から10へ変更
runners のところへlimit = 20を追加
runners.docker のところへprivileged = trueに変更、 disable_cache=trueに変更

runners.cacheセクションも変更したいけど、S3の設定が必要そうなので、一旦無視

296u296u

色々と設定が続くけど、わかんなくなったので
過去の設定ファイルをここに転記しておく

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"
296u296u

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

296u296u

IAMで適切なロールを持ったユーザーを作成する必要があること、S3にキャッシュ用のバケットを用意する必要がある。

一旦ここでは、過去に作成したものをそのまま流用するとして進行する。

296u296u

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

296u296u

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