GitHub Actions라고 하는 것은 구체적으로 어떤 것일까?
GitHub Actions는 GitHub에서 코드와 함께 실행되는 기본 CI/CD 툴입니다. 실제로 GitHub 저장소(힌트: GitHub Actions가 있는 곳)에 "Actions"라고 표시된 탭이 있습니다.
[출처] GitHub의 CI/CD 및 자동화 초보자 가이드 제1장|작성자 단군소프트
Github 한국 총판인 단군소프트에서는 위와 같이 Github Actions에 대해서 설명을 시작하고 있습니다.
Microservice-based SaaS Product
GitHub Cloud(또는 GitHub.com)는 Git-Server-Engine를 Public SaaS 로 제공되는 서비스입니다.
Git repository와 organization, user 등 다양한 도메인에 대한 Microservice로 구성되어 있습니다.
Product Type & Version
- Microsoft 인수 이후, 고가용성/내결함성을 위하여 Azure Cloud 위에서 동작합니다.
- GitHub Enterprise 는 Business 계약을 통해서 적용되는 Enterprise 전용 Cloud 서비스입니다. 내부망 에서 사설 도메인 사용으로 관리하기 위한 설치형 GitHub Enterprise Server 도 선택 가능합니다.
- (더 자세한 GitHub Product Type과 Pricing Plan 관계는 이 문서를 참조하세요)
Repository part
아래 Git Repo를 위한 의존 서비스에서 발생한 Event를 Webhooks 이나 Workflows 등으로 전달합니다.
- 개발팀이 소스코드에 대한 형상을 관리하는 Repository는 Git Operation 서비스에 의존합니다.
- 개별 브랜치를 하나의 브랜치로 합치는 Pull Request는 Pull Requests 서비스에 의존합니다.
Actions part
빌드/패키지 등의 일련의 자동화된 과정을 ‘workflow’라 부르며 GitHub Actions 서비스에 의존합니다.
- Actions Dashboard: 각 Repository에 귀속된 workflows의 상태와 결과를 보여줍니다.
- Actions Queue: Event를 기준으로 workflow를 동작시키기 위해 workflow queue를 관리합니다.
- Actions Runner: job을 내려받고(polling) 수행(run)할 runner runtime을 의미합니다.
workflows 파일은 크게 다음과 같이 구성됩니다.
- 개별 Repository 에 .github/workflows 디렉토리 하위에 YAML 형식으로 보관됩니다.
- name: 단일 workflow를 Actions Dashboard 에 표시할 이름
- on: 단일 workflow를 실행하는 기준 (event trigger)
- jobs: 단일 workflow 안에서 실행할 일의 단위 (개별 job의 의존 관계 설정 가능)
- runs-on: 단일 job을 Polling하기 위해 Runner가 보유해야하는 Label 목록
- steps: 단일 job 안에서 순서대로 수행할 일의 단위 (복수의 Step을 단일 Step으로 모듈 설정가능)
- Reference.
GitHub-hosted Runners vs. Self-hosted Runners
Runner Runtime은 크게 Hosting 위치에 따라 2가지로 구분됩니다.
- GitHub-hosted Runner: Actions 버전과 함께 GitHub에서 호스팅 및 관리 (Runner SaaS)
- Self-hosted Runner: 사용자의 Compute machine에서 호스팅 및 사용자 측 관리
- Reference: GitHub Docs - Differences between GitHub-hosted and self-hosted runners
self-hosted Runner 채택시 장/단점
장점 | AWS Cloud Native 보안 적용 가능
- AWS 권한 관리 포인트 개선
- GitHub-hosted Runner에서 AWS 리소스를 접근하기 위해 AWS Credentials 발급이 불가피
- GitHub 측 Secrets으로 암호화되어 저장되지만, Cloud 외부로 노출된 Credentials에 대한 관리 포인트 발생
- Self-hosted Runner 를 채택할 경우 다음 방법으로 Credentials 보안 강화 및 운영 효율성을 추구할 수 있다.
- Runner에서 사용되는 스크립트의 Credentials 정보를 환경변수로 할당 → 클라우드 외부로 노출되는 문제점은 제거 (단, Workflow dashboard에서 노출되지 않도록 주의 필요)
- Credentials 관리포인트 제거 방식 (권장)
- Runner가 실행되는 EC2 Instance에 IAM Role을 부여
- Runner가 실행되는 EKS Pod에 IRSA로 Federated 된 Service Account 부여
- Private 운영 가능
- GitHub Actions에 대기중인 job을 Self-hosted runner가 받아오는 폴링(Polling) 방식으로 동작.
따라서 GitHub Actions와 연동되기 위해서는 Outbound Traffic만 필요. (Private subnet에서 동작)
- GitHub Actions에 대기중인 job을 Self-hosted runner가 받아오는 폴링(Polling) 방식으로 동작.
- 추가 비용 절감 고려 가능
- Runner가 소화해야하는 Workflow에 따라 Resource 배분에 대한 조절 가능
- Reserved Instance, Saving Plan를 통해서 비용 절감된 Computing과 최적화된 Instance 배치 가능
- Spot instance를 통한 비용 절감 극대화 가능
단점 | Runner Runtime version 관리 포인트 발생
GitHub-hosted Runner와 동일하게 Self-hosted Runner를 사용하려면 Runner의 상시 구동이 요구
구체적으로 다음과 같은 문제를 해결해야 하며, 이는 (GitHub-hosted 대비) 단점에 해당하게 된다.
- Runner version 관리
- GitHub Actions에 호환되는 Runner의 버전이 적용된 Self-hosted Runner 실행 및 상태/버전 관리 필요
- (Github-hosted Runner 와 같이) 상시 구동 가능하도록 라이프 사이클 관리 필요
- 개발 생산성 향상을 위하여 Self-hosted Runner를 다중 구성할 필요가 있음
- 언제든 Runner가 (필요시 증감) 실행/동작할 수 있도록 고가용성, 내결함성 적용된 환경 구성 필요
- 컴퓨팅 환경 구성 방식에 따라 관리 대상 범위 증가 (EC2, ECS, EKS, Fargate)
- 관리포인트 발생은 단점이나, 기업 보안 요구 사항 등을 위한 OS Image 커스터마이징 또한 가능
- 동일 Runner 반복 사용시 발생될 수 있는 캐싱 문제
- GitHub-hosted Runner는 단일 Job이 수행된 이후, 깨끗한 새 Runner가 할당됨
- Self-hosted Runner는 Host-Machine의 환경에서 동작하므로 완벽한 캐싱 관리가 어려움
비교 요약
GitHub Actions + GitHub-hosted Runner |
GitHub Actions + Self-hosted Runner(on EKS) |
AWS CodePipeline + AWS CodeBuild (비교군) |
|
장점
|
|
|
|
Runner 관리 범위 없음
(개발 생산성 향상만 집중) |
|
||
단점
|
Workflow 수행 이력 정보 최대 90일까지만 저장
|
|
|
상당히 비싼 Computing Power 단가로
조직 규모에 따라 관리 포인트와 비용 간 고려 필요 |
DevOps Engineer 관리 포인트로 Self-hosted Runner Chart 포함 (운영과 동일한 기술 스택) |
||
동작방식
|
|
|
(Serverless)
|
호스팅
관리 |
(관리 없음 - Serverless)
|
|
(관리 없음 - Serverless)
|
Runner
버전관리 |
(관리 없음 - 완전 관리형 Runner)
|
버전 최신 관리 및 자동화를 위한 별도 구성 필요 |
(기본값 관리없음 - Serverless)
|
호스팅
|
GitHub 측 내부망에서 상시 Idle
(필요시 외부 통신 가능) |
Private 망에서 NAT Gateway를 통한 Egress 통신 | |
컴퓨팅
|
Azure Cloud 상에서 완전관리
|
|
|
컴퓨팅 비용
|
GitHub EE 기준 매 월 50,000 mins 무료 초과시
|
|
|
스토리지
비용 |
GitHub EE 기준 매 월 50 GB 무료 및 100 GB 전송 초과시
|
Amazon S3, ECR 등 저렴한 대안 옵션 선택 가능
|
|
비용
관련 참조 |
|
AWS CodeBuild pricing | |
보안
|
GitHub Secret 혹은 Third Party에 권한을 가진 AWS Credential 등록 필요 (AWS 외부에 Credential 정보가 저장되어야 동작) |
EKS Node Role 또는 IRSA 를 적용하여 효율적인 최소 권한 관리 가능 (Credentials 발급 없이 AWS 내부에서 권한 제어) |
|
단점 극복 방안 | Self-hosted Runner Cluster as Modernized Builder Platform
GitHub 측에서는 Runner 고가용성을 위해 아래 2가지 방법으로 현대화된 빌더 플랫폼을 사용하도록 권장합니다.
- Amazon EC2 Instance 나 ECS cluster 같은 Instance/Container Runtime 환경인 경우:
- AutoScaling Group과 Launch Template를 이용해서 고가용성과 내결함성 확보
- 기민한 확장성을 위해서 바로 Runner 가 설치된 배포 단위를 관리 (AMI 혹은 Runner Container Image로 버전관리)
- PAT 기반으로 각 Runner들이 직접 받아가는 polling 방식만 지원하므로 Latency 소폭 발생 가능
- 위 시스템을 영속가능한 불변 구조(Immutable Architecture)를 모두 IaC 도구로 관리 (Terraform, etc)
- Amazon EKS cluster 와 같은 Kubernetes Runtime 환경인 경우:
- Kubernetes 환경에서 배포되는 Runner Pod를 이용하여 고가용성과 내결함성 확보
- ARC 도입 및 GitHub App 적용하여 기민함 확보
- GitHub Enterprise Server를 내부망에 존재하는 경우, 빌드/배포의 전 과정을 내부망에서 수행 가능
참고 사항
- Self-hosted runner Best Practice : YouTube & Recommended autoscaling solutions
- DinD runner support in Kubernetes 1.22
AWS 환경에서 Self-hosted Runner 운영시 선택 가능한 옵션
Runs on | EC2 Instance | ECS | EKS | ||
on EC2 Node
|
on Fargate
|
on Managed Nodegroup
|
on Fargate
|
||
관리 범위
|
Launch Template &
Auto Scaling Group |
Launch Template &
Auto Scaling Group |
(없음 - Serverless)
|
Launch Template &
Auto Scaling Group |
(없음 - Serverless)
|
OS Image
|
OS Image
|
OS Image
|
|||
Runner Process
|
Runner Container Image, ECR
|
ARC & Runner Chart, Runner Container Image, ECR
|
|||
자동화 방안
|
Amazon Linux 2 기반 AMI & LT 관리
|
(완전 관리형 - Serverless)
|
EKS Opt. Image 기반 LT 관리
|
(완전 관리형 - Serverless)
|
|
Auto Scaling Group 기반
EC2 Instance Provisioning |
Auto Scaling Group 기반
EC2 Nodes Provisioning |
Cluster Autoscaler
혹은 Kapenter 도입 |
|||
실행 후 User Data를 통한
Runner 자동 실행 |
Task 배포
|
Helm Chart 배포
|
Fargate Profile 관리
및 Helm Chart 배포 |
||
장점
|
Container Image 관리 불필요 |
|
|
|
|
단점
|
|
ECS 스택 문법 (task)을 익혀야 함
|
전용 Node 부팅 시간으로 기민성 소폭 저하
|
EKS 버전 업그레이드 시
CRD 검토 필수 |
전용 Node 부팅 시간으로 기민성 소폭 저하
|
'고기 대신 SW 한점 > DEVOPS' 카테고리의 다른 글
VS Code + AI CodeHelper, ChatGPT (0) | 2023.03.31 |
---|---|
GitHub Self-Hosted Runner에서 캐시를 구현하는 방법 (0) | 2023.03.15 |
[DevOps] CI (Continuous Integration) 완전 정복 (3) | 2022.12.07 |
[DevOps] CD, Routing 컨트롤을 통한 Rollout 방안 (0) | 2022.10.26 |
[Helm] k8s package manger - 낱낱이 알아보기 (0) | 2022.10.24 |