terraform-aws-github-runner を試してみる
terraform-aws-github-runner
がいい感じぽいので試してみる
以下試したリポジトリ
Setup GitHub App (part 1)
よしなに設定をする
Webhook は後で設定するので一旦 Disable にする
権限周りはこんな感じ
Setup terraform module
Download lambdas
https://github.com/philips-labs/terraform-aws-github-runner/releases から zip ファイルを3つ落としてくる
git submodule で毎回 build する方が筋良さそうな気がするけど...?
Service-linked role
スポットインスタンスを作成するには AWSServiceRoleForEC2Spot
ロールを AWS のアカウントに設定する必要があるらしい
この設定はアカウントごとにグローバルなやつなので、terraform で管理するか手動でやるか悩ましい
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#service-linked-roles-spot-instance-requests に従って awscli で許可する
AWS_PROFILE=root aws iam create-service-linked-role --aws-service-name spot.amazonaws.com
Terraform module
key_base64
は base64 self-hosted-runner-for-odan.2022-05-22.private-key.pem
の結果を貼る
とりあえず、https://github.com/philips-labs/terraform-aws-github-runner/blob/develop/examples/default/main.tf をコピペしてくる
locals {
version = "v1.2.0"
environment = "default"
aws_region = "ap-northeast-1"
}
provider "aws" {
region = "ap-northeast-1"
}
variable "github_app_key_base64" {}
variable "github_app_id" {}
resource "random_id" "random" {
byte_length = 20
}
data "aws_caller_identity" "current" {}
module "runners" {
source = "philips-labs/github-runner/aws"
version = "1.2.0"
create_service_linked_role_spot = true
aws_region = local.aws_region
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
prefix = local.environment
tags = {
Project = "ProjectX"
}
github_app = {
key_base64 = var.github_app_key_base64
id = var.github_app_id
webhook_secret = random_id.random.hex
}
webhook_lambda_zip = "webhook.zip"
runner_binaries_syncer_lambda_zip = "runner-binaries-syncer.zip"
runners_lambda_zip = "runners.zip"
enable_organization_runners = false
runner_extra_labels = "default,example"
# enable access to the runners via SSM
enable_ssm_on_runners = true
instance_types = ["t3.small"]
# override delay of events in seconds
delay_webhook_event = 5
runners_maximum_count = 1
# set up a fifo queue to remain order
fifo_build_queue = true
# override scaling down
scale_down_schedule_expression = "cron(* * * * ? *)"
}
apply すると webhook の URL とシークレットが払い出されるので、GitHub Apps の設定に入力する
先に GitHub Apps をインストールしていたためか
In the "Permissions & Events" section and then "Subscribe to Events" subsection, check either "Workflow Job" or "Check Run" (choose only 1 option!!!).
をやってもイベントが発火しなかった
GitHub Apps をリポジトリに uninstall => install したら動くようになった
動かしてみたけど Lambda で TypeError Cannot read property 'full_name' of undefined
というエラーが発生する
と、思ったけどその後の Webhook でいい感じに動いてた。なぞ
動いている
workflow ファイルはこんな感じ
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
build:
runs-on: [self-hosted, example]
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo Hello, world!
runner_extra_labels
に指定した値を runs-on
に指定する