ããã«ã¡ã¯ãSRE ã® @int128 ã§ãã
Quipper ã§ã¯ GitHub Actions Self-hosted Runner ãä¸é¨ã®ã¸ã§ãã§å°å ¥ãã¦ãã¾ããæ¬ç¨¿ã§ã¯ãã®ç®çã¨å ·ä½ä¾ãç´¹ä»ãã¾ãã
èæ¯ã¨è§£æ±ºããã課é¡
Quipper ã§ã¯ä»¥ä¸ã® CI ãµã¼ãã¹ãç¨éã«åããã¦å©ç¨ãã¦ãã¾ãã
- CircleCIï¼ãã¹ãããããã¤ãªã©ï¼
- GitHub Actionsï¼ãã¹ãããããã¤ãªã©ï¼
- AWS CodeBuildï¼ä¸»ã« Terraform ãªã© AWS ãªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããå ´åï¼
- Google Cloud Buildï¼ä¸»ã« Google Cloud ã®ãªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããå ´åï¼
- Jenkinsï¼å®æå®è¡ãæåå®è¡ã«ç¹åããã¸ã§ãï¼
ãã®ãã¡ GitHub Actions ã¯ä»¥ä¸ã®ç¹ãåªãã¦ããã¨æãã¦ãã¾ãã
- monorepo æ§æã®å ´åã«ãã¤ã¯ããµã¼ãã¹ãã¨ã«ç¬ç«ã㦠Workflow ãå®ç¾©ã§ãã
- å ¬é Action ã®ã¨ã³ã·ã¹ãã ãçºéãã¦ãã
- Workflow ã®å®æå®è¡ããã©ã¡ã¼ã¿ä»ãæåå®è¡ã«ã対å¿ãã¦ãã
䏿¹ã§ãã¯ã©ã¦ãã«çµ±åããã¦ãã CI ãµã¼ãã¹ã¨æ¯è¼ããã¨ãGitHub Actions ã«ã¯ä»¥ä¸ã®èª²é¡ãããã¾ãã
- Organization ãããã®ã¸ã§ãã®åæå®è¡æ°ãå¶éããã¦ããï¼æ£ç¢ºãªæ å ±ã¯ããã¥ã¡ã³ããåç §ãã¦ãã ããï¼
- å®è¡ç°å¢ããã¯ã©ã¦ããªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ã¯ã¬ãã³ã·ã£ã«ï¼ä¾ãã° AWS ã§ã¯ IAM access keyï¼ã渡ãå¿ è¦ãããããæ¼æ´©ãªã¹ã¯ããã¼ãã¼ã·ã§ã³ç®¡çè² è·ãèããã¨é¿ããã
- å®è¡ç°å¢ã®æéå価ãè¥å¹²é«ãã«è¨å®ããã¦ãã
GitHub Actions ã«ã¯ Self-hosted Runner ã¨ããä»çµã¿ããããèªåã§ç¨æããç°å¢ã§ã¸ã§ããå®è¡ãããã¨ãå¯è½ã§ãã Self-hosted Runner ãå©ç¨ããã¨ãããã®èª²é¡ã解決ã§ããã®ã§ã¯ãªããã¨èãã¾ããã
Self-hosted Runner ã®å®ç¾æ¹å¼
Self-hosted Runner ã®å°å ¥æ¹æ³ã¯ããã¥ã¡ã³ãã§ä¸å¯§ã«èª¬æããã¦ããã誰ã§ãç°¡åã«ä½¿ãå§ãããã¾ãã 䏿¹ã§ããã¼ã éçºã§ã¯ CI ã®å®å®æ§ãã¨ã¦ãéè¦ãªã®ã§ãå®å®éç¨ã®ããã«ããããã¨èããå¿ è¦ãããã¾ãã
å®è¡ç°å¢ã®é ç½®ã¨ç®¡ç
ã¾ã㯠Self-hosted Runner ãã©ããªç°å¢ã§å®è¡ããããèãã¾ããQuipper ã®ãµã¼ãã¹ã®å¤§é¨å㯠AWS ã§éç¨ãã¦ããããã以ä¸ã®é¸æè¢ãããã¾ãã
- EC2 ã¤ã³ã¹ã¿ã³ã¹ã§ Self-hosted Runner ãéç¨ãã
- Kubernetes ã¯ã©ã¹ã¿ã§ Self-hosted Runner ãéç¨ãã
ã¾ããSelf-hosted Runner ãå®è¡ããã¤ã³ã¹ã¿ã³ã¹ãã³ã³ããã管çããæ¹æ³ãèããå¿ è¦ãããã¾ãã GitHub ã®ããã¥ã¡ã³ãã§ã¯ OS ã«æä½æ¥ã§ Self-hosted Runner ãã¤ã³ã¹ãã¼ã«ããæ¹æ³ã説æããã¦ãã¾ããããã®æ¹æ³ã§ã¯ãã¼ã¸ã§ã³ã¢ãããå°æ°è¿½å ãªã©ã®æ¥å¸¸éç¨ã«èããããªãã¨èãããã¾ãã
ããã§ Self-hosted Runner ã宣è¨çã«ç®¡çã§ãã OSS ã調æ»ããæçµçã«ä»¥ä¸ã®é¸æè¢ã«çµãè¾¼ã¿ã¾ããã
- https://github.com/philips-labs/terraform-aws-github-runner
- https://github.com/summerwind/actions-runner-controller
(1) 㯠Self-hosted Runner ã® EC2 ã¤ã³ã¹ã¿ã³ã¹ã管çãã¦ããã Terraform Module ã§ãã Terraform ã§ Runner ãå®ç¾©ããã¨ãTypeScript ã§æ¸ããã Lambda ã Runner ã管çãã¦ãããã®ãç¹å¾´çã§ãã
(2) 㯠Kubernetes ã¯ã©ã¹ã¿ä¸ã§ Self-hosted Runner ã® Pod ã管çãã¦ããã Custom Controller ã§ãã ã«ã¹ã¿ã ãªã½ã¼ã¹ã§ Runner ãå®ç¾©ããã¨ãGo ã§æ¸ããã Controller ã Runner ã管çãã¦ãããã®ãç¹å¾´çã§ãã
Quipper ã«ã¯ã¨ã¦ãå¿«é©ãª Terraform ã® CI/CD ã®ä»çµã¿ãããã¾ãã 䏿¹ã§ãKubernetes ã¯ã©ã¹ã¿ã®ã·ã¹ãã ã³ã³ãã¼ãã³ã㯠Argo CD ã§æ§æç®¡çãè¡ã£ã¦ãã¾ãã å°æ¥çã«å¤ãã® Runner ã管çããå¿ è¦ãçããã¨ãã¦ããã©ã¡ãã®æ¹å¼ã§ã管çãã¦ãããã¨èãã¾ããã
ãã®ã³ã°ãã¢ãã¿ãªã³ã°ã«ã¤ãã¦ã¯ (1) (2) ã¨ãã«ååã«ããªãã¦ãã¾ãã Quipper ã®ãµã¼ãã¹ã®å¤§é¨å㯠Kubernetes ã§éç¨ãã¦ãããããä½ãåé¡ãèµ·ããæã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ã§ã¯ (2) ã®æ¹ãæã ã¨è¦ªåæ§ãé«ãã¨è¨ããããããã¾ããã
æçµçã«ã¯ä»¥ä¸ã®ç¹ã§ (2) ãæ¡ç¨ãã¾ããã
- Quipper ã®æè¡é¡§åã§ãã @mumoshu ãããæ´»çºã«éçºã«åå ãã¦ãã
- ã«ã¹ã¿ã ãªã½ã¼ã¹ã¨ Controller ã®ãªã¼ãã¼ã·ãããæç¢ºã«ãªã£ã¦ãããDeveloper ãèªåèªèº«ã§å¿ è¦ãªã«ã¹ã¿ã ãªã½ã¼ã¹ã管çããSRE ã Controller ã管çããä¸çãç®æãã
以ä¸ã(2) ã actions-runner-controller ã¨è¡¨è¨ãã¾ãã
Autoscaling
Quipper ã§ã¯å¤ãã®ãã¹ãã並åå®è¡ãã¦ãããç¬éçã«å¤ãã® Runner ãå¿ è¦ã«ãªãã¾ãã å ·ä½çã«ã¯ãæãå¤ãå ´åã§ 60ã70 ä»¶ã®ã¸ã§ããåæã«å®è¡ããããã¨ãããã¾ãã 䏿¹ã§ãå¤éã¯ã»ã¨ãã©ã®äººãå¯ã¦ããã®ã§ãã¼ã¯ã¿ã¤ã ã«åãã㦠Runner ãç¨æããã¨ã³ã¹ããç¡é§ã«ãªãã¾ãã ãã®ãããRunner ã® Autoscaling ã¯å¿ é ã¨èãã¾ããã
actions-runner-controller ã§ã¯ä»¥ä¸ã® Autoscaling æ¹å¼ã«å¯¾å¿ãã¦ãã¾ãã
- å®è¡ä¸ã®ã¸ã§ãæ°ããå¿ è¦ãª Runner æ°ãç®åºãã (TotalNumberOfQueuedAndInProgressWorkflowRuns)
- Busy Runner ã®å²åãå ã« Runner ã®è¿½å ãåé¤ãè¡ã (PercentageRunnersBusy)
- GitHub ããã® Webhook ã奿©ã« Runner ã追å ãã (ScaleUpTrigger)
æ¤è¨¼ãå§ãã2021å¹´1ææç¹ã§ã¯ (1) (2) ã®ã¿ãå©ç¨å¯è½ã§ããã ãã¹ãã並åå®è¡ããã¨ãã以ä¸ã®èª²é¡ãè¦ã¤ããã¾ããã
- 宿çã« GitHub API ã§ã¡ããªã¯ã¹ãåå¾ãããããåå¾ééãçããã㨠Rate Limit ã使ãåã£ã¦ãã¾ã
- Runner æ°ãå¢å ããã¨ãRunner ã®ç»é²ãæ´æ°ã§ Rate Limit ã使ãåã£ã¦ãã¾ã
- æ¹å¼ (2) ã§ã¯ Runner æ°ãååã«å¢å ããã¾ã§æéãããããããããå®ç¨çã§ãªããåé ã® Rate Limit ã®åé¡ãçºçãã¦ãã¾ã
- Rate Limit ã Autoscaling ã«é¢ããã¡ããªã¯ã¹ããªããããåé¡ã®åãåããé£ãã
ãããã®èª²é¡ã @mumoshu ããã«ç¸è«ããã¨ãããæ¹å¼ (3) ãå§åçé度ã§å®ç¾ãã¦ããã ãã¾ããã Webhook Autoscaling ã®ä»çµã¿ãä¸å³ã«ç¤ºãã¾ã*1ã
GitHub ã§ã¸ã§ããå®è¡ãããã¨ãactions-runner-controller ã Webhook ãåä¿¡ãã¦å¿ è¦ãª Runner ã追å ããããã«ãªã£ã¦ãã¾ãã å®éã«ã¯å¾è¿°ããã«ã¹ã¿ã ãªã½ã¼ã¹ãçµã¿åãããéåæå¦çã§ Autoscaling ãå®ç¾ãã¦ãããããåé¡ã®åãåãã対å¦ã¯ãªããªãã®é£æåº¦ã§ããã @mumoshu ããã¨ååããªãããã°ã®ä¿®æ£ãå®å®æ§ã®æ¹åãé²ãã¾ããã
Webhook Autoscaling ã®ä»çµã¿ãå®éã«éç¨ãã¦ã¿ãã¨ä»¥ä¸ã®èª²é¡ãããã¾ããã
- ç¾ç¶ã® GitHub API 仿§ã§ã¯ GitHub-hosted runner 㨠Self-hosted runner ãåºå¥ããæ¹æ³ããªãããã両è ãæ··å¨ããå ´åã« Runner ãç¡é§ã«å¢ãã¦ãã¾ã
- Runner ãæ¥æ¿ã«å¢å ããã¨ä¸å®å®ã«ãªã
èª²é¡ (1) ã«ã¤ãã¦ã¯ãWebhook ãåä¿¡ããå¾ã« Runner ãçæéã ãå¢ãããã¨ã§ãã³ã¹ãã大ããå¢ããªãããã«ãã¦ãã¾ã*2ã ã¾ãã宿çã«å®è¡ãããã¸ã§ããã¹ã±ã¼ã«ã¢ã¦ãã®å¯¾è±¡ããé¤å¤ãããã¨ã§ãå¤éã¯ç¢ºå®ã«ãã¼ãæ°ãæ¸ãããã«å¯¾çãã¦ãã¾ãã
èª²é¡ (2) ã«ã¤ãã¦ã¯ãRunner ã«å¯¾ãã CPU ãã¡ã¢ãªã®å²ãå½ã¦ãè¦ç´ããECR Public Gallary ã«ããã¤ã¡ã¼ã¸ãå©ç¨ãããã¨ãã£ãæ½çã試ãã¦ãã¾ãã
Monitoring
åé ã§è¿°ã¹ãããã« actions-runner-controller ã§ã¯ Rate Limit ã Autoscaling ã«é¢ããã¡ããªã¯ã¹ãåå¾ã§ããªãã£ããããæ©è½è¿½å ã® Pull Request ãéãã¾ããã Datadog ã§ã¡ããªã¯ã¹ã確èªã§ããããã«ãªã£ãããããã©ãã«ã·ã¥ã¼ãã§å½¹ã«ç«ã£ã¦ãã¾ãã
ä¸å³ã®ããã«ãæ¥ä¸å¸¯ã¯ã¸ã§ãã®å®è¡æ°ãå¤ããå¤éã¯ã»ã¨ãã©ãªããã¨ãåããã¾ãã
ã¾ããGitHub API Rate Limit ã¯ã¾ã ä½è£ãããã®ã§ãããããè¦æ¨¡ã大ãããªã£ã¦ãå½é¢ã¯å¤§ä¸å¤«ããã§ãã
Self-hosted Runner ã®ä½¿ãæ¹ã¨å®éã®éç¨
GitHub Actions ã®ã¸ã§ãã以ä¸ã«è©²å½ããå ´å㯠Self-hosted Runner ãæ¨å¥¨ãã¦ãã¾ãã
- å®è¡æéãé·ã
- 䏦忰ã大ãã
- AWS ãªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããï¼IAM Roles for Service Accounts ãå©ç¨ï¼
以ä¸ã®çç±ã§ãªãã¸ããªåä½ã« Runner ã管çãã¦ãã¾ããä»ã®ã¨ãã Organization åä½ã® Runner ã¯ä½¿ã£ã¦ãã¾ããã
- Runner ã®ãªã¼ãã¼ã·ãããæç¢ºã«ãªãï¼å ±éåã§èª°ãã¡ã³ããã³ã¹ããªããªãã®ãé²ãï¼
- Quipper ã§ã¯ monorepo ãæ¡ç¨ãã¦ãããããRunner ãè¨å®ããå¿ è¦ã®ãããªãã¸ããªãå°ãªã
- ãªãã¸ããªãã¨ã«å¿ è¦ãª CPU ãã¡ã¢ãªã®ãªã½ã¼ã¹ãç°ãªã
- ãªãã¸ããªãã¨ã«å¿ è¦æå°éã® IAM 権éãå²ãå½ã¦ãã
Runner ã®æ§æç®¡ç
actions-runner-controller ã§ã¯ä»¥ä¸ã®ã«ã¹ã¿ã ãªã½ã¼ã¹ã§æ§æã管çãã¾ãã
- Runner Deploymentï¼Runner ã«é¢ããè¨å®ï¼
- Horizontal Runner Autoscalerï¼Autoscaling ã«é¢ããè¨å®ï¼
Runner Deployment ãªã½ã¼ã¹ã®ä¾ã以ä¸ã«ç¤ºãã¾ããRunner ãé¢é£ã¥ãããªãã¸ããªã Runner ã«å²ãå½ã¦ããªã½ã¼ã¹ãæå®ãã¾ãã
apiVersion: actions.summerwind.dev/v1alpha1 kind: RunnerDeployment metadata: name: REPOSITORY_NAME spec: template: spec: repository: quipper/REPOSITORY_NAME labels: - REPOSITORY_NAME-repository-runner resources: limits: memory: 1000Mi requests: cpu: 500m memory: 1000Mi
Horizontal Runner Autoscaler ãªã½ã¼ã¹ã®ä¾ã以ä¸ã«ç¤ºãã¾ããããã§ã¯ GitHub ãã check_run
ã¤ãã³ããåä¿¡ãã㨠Runner ã1å°å¢å ããã¦ãã¾ãã
apiVersion: actions.summerwind.dev/v1alpha1 kind: HorizontalRunnerAutoscaler metadata: name: REPOSITORY_NAME spec: minReplicas: 1 maxReplicas: 30 scaleTargetRef: name: REPOSITORY_NAME scaleUpTriggers: - githubEvent: checkRun: types: - created status: queued duration: 45s amount: 1
actions-runner-controller ã¯ãããã®ã«ã¹ã¿ã ãªã½ã¼ã¹ããå¿ è¦ãª Pod ã使ããGitHub Actions ã®ã¸ã§ããå®è¡ããç°å¢ãæ´ãã¾ãã
GitOps ã«ããæ§æç®¡ç
Runner ã®ã«ã¹ã¿ã ãªã½ã¼ã¹ã¯ Git ãªãã¸ããªã§ç®¡çãã¦ãã¾ãã å ·ä½çã«ã¯ä»¥ä¸ã®ãããªãã£ã¬ã¯ããªæ§æã§ç®¡çãã¦ãã¾ãã
. âââ system-components âââ overlays âââ CLUSTER_NAME âââ github-actions-repository-runners âââ horizontalrunnerautoscaler | âââ REPOSITORY_NAME.yaml âââ runnerdeployment | âââ REPOSITORY_NAME.yaml âââ serviceaccount âââ REPOSITORY_NAME.yaml
Runner ã®è¿½å ã夿´ã¯ä»¥ä¸ã®æé ã§è¡ã£ã¦ãã¾ãã
- ãããã§ã¹ãã夿´ããï¼ä¾ãã° CPU ãã¡ã¢ãªã®å²ãå½ã¦ã夿´ï¼
- Pull Request ã®ã¬ãã¥ã¼ãªã¯ã¨ã¹ããåºã
- Pull Request ããã¼ã¸ãã
- Argo CD ã«ãã£ã¦ã¯ã©ã¹ã¿ã«å¤æ´ãé©ç¨ããã
Self-hosted Runner ã®å ·ä½ä¾
ç¾å¨ã以ä¸ã®ç¨éã§ Self-hosted Runner ãå°å ¥ãã¦ãã¾ãã
- Kubernetes System Components ã管çãããªãã¸ããªï¼SRE ãæ¥å¸¸çã«ä½¿ããªãã¸ããªã«å è¡å°å ¥ãããã¨ã§åé¡ã«æ©ãæ°ã¥ããããã«ãã¦ãã¾ãï¼
- 䏦忰ã®å¤§ãã RSpec ãã¹ã
- React Storybook ãããã¥ã¡ã³ããªã©ã S3 Bucket ã«é ç½®ããã¸ã§ã
- EC2 ãªã©ã宿çã«ã¡ã³ããã³ã¹ããã¸ã§ã
- BuildKit ãã£ãã·ã¥ãå©ç¨ãããã«ãã®æ¤è¨¼
GitHub-hosted ãã Self-hosted ã¸ã®ç§»è¡ã«ããã£ã¦ã¯ãDeveloper 㨠SRE ãååããªããæ®µéçã«ç§»è¡ãé²ãã¦ãã¾ãã ç¹ã« RSpec ã®ãã¹ãã«ã¤ãã¦ã¯ Web Developer ã® @mtsmfm ããããå¤ãã®ãã£ã¼ãããã¯ãããããã®ã§ãåé¡ã®çºè¦ã¨å¯¾å¦ã確å®ã«é²ãããã¨ãã§ãã¾ããã
Self-hosted Runner 㯠EKS ã¯ã©ã¹ã¿ã§å®è¡ãã¦ãããããEKS ã¯ã©ã¹ã¿ã忢ãã¦ããæã¯å©ç¨ã§ãã¾ããã ãã®ãããAWS ãªã½ã¼ã¹ã管çãã Terraform ãªã©ã¯ Self-hosted Runner ã§ã¯ãªã AWS CodeBuild ã®ãããªããã¼ã¸ããµã¼ãã¹ãé©ãã¦ãã¾ãã ãã®ããã«é©æé©æã§ CI ãµã¼ãã¹ãå©ç¨ãããã¨ãéè¦ã¨èãã¦ãã¾ãã
ã¾ã¨ã
GitHub Actions (GitHub-hosted Runner) ã«ã¯ä»¥ä¸ã®èª²é¡ããããã¨ãåé ã§èª¬æãã¾ããã
- Organization ãããã®ã¸ã§ãã®åæå®è¡æ°ãå¶éããã¦ãã
- å®è¡ç°å¢ããã¯ã©ã¦ããªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ã¯ã¬ãã³ã·ã£ã«ã渡ãå¿ è¦ãããããæ¼æ´©ãªã¹ã¯ããã¼ãã¼ã·ã§ã³ç®¡çè² è·ãèããã¨é¿ããã
- å®è¡ç°å¢ã®æéå価ãè¥å¹²é«ãã«è¨å®ããã¦ãã
Self-hosted Runner ã®å°å ¥ã«ããã以ä¸ã®ããã«èª²é¡ã解決ã§ããã¨èãã¦ãã¾ãã
- åæå®è¡æ°ã®å¶éããªããªã£ã
- IAM Roles for Service Accounts ãå©ç¨ãããã¨ã§ãã¯ã¬ãã³ã·ã£ã«ã使ããã«æ¨©éãå²ãå½ã¦ãããï¼ã»ãã¥ãªãã£ã®æ¹åï¼
- EC2 Spot Instances ãå©ç¨ãããã¨ã§ãã¤ã³ã¹ã¿ã³ã¹ã®æéå価ãæããããï¼ã³ã¹ãã®æ¹åï¼
Self-hosted Runner ã®å°å ¥ã¯ã¾ã å§ã¾ã£ãã°ããã§ãæ¥æ¿ã«ã¸ã§ãæ°ãå¢å ããå ´åã®å®å®æ§ãå®éã«å°å ¥ããéã®çè§£ã®é£ããã¯ã¾ã ã¾ã æ¹åãå¿ è¦ã§ãã ã¾ããã¸ã§ãã®å¾ ã¡æéãã³ã¹ããªã©ã®æ¹åãå®éçã«åæãã¦ããå¿ è¦ãããã¾ãã ãã² Quipper ã«å ¥ç¤¾ãã¦ä¸ç·ã«ãã£ã¬ã³ã¸ãã¦ã¿ã¾ãããï¼
Quipper ã§ã¯ä¸çã®æã¦ã¾ã§å¦ã³ãå±ããã仲éãåéãã¦ãã¾ãã
*1:æ£ç¢ºã«ã¯ãGitHub ãã Webhook ãåãåã£ã¦ã«ã¹ã¿ã ãªã½ã¼ã¹ãæä½ãã HTTP ãµã¼ãã¨ãã«ã¹ã¿ã ãªã½ã¼ã¹ã«ãããã£ã¦ Runner Pod ãæä½ãã Custom Controller ã§æ§æããã¾ãã
*2:å ·ä½çã«ã¯ãScaleUpTrigger ã®æå¹æéã45ç§ã«è¨å®ãã¦ãã¾ããGitHub-hosted ã®ã¸ã§ãã®å ´åãå®éã«ã¯ Runner ã§ã¸ã§ããå®è¡ãããªããããWebhook ã§å°æ°ãå¢ãã¦ã45ç§å¾ã«ã¯æ»ãã¾ãããã¾ãã«ãæå¹æéãçã㨠Runner Pod ãèµ·åããåã«å°æ°ãæ»ã£ã¦ãã¾ãå¯è½æ§ããããããã²ã¨ã¾ã45ç§ã§éç¨ãã¦ãã¾ãã