러너란 무엇인가요?
Semaphore UI 러너는 UI 없이 동작하는 독립형 Semaphore 인스턴스입니다. 메인 Semaphore 서버에 연결해 작업을 가져오고 실행합니다. 러너는 어떤 리전이나 네트워크에 있든 별도의 서버에 호스팅할 수 있으며, Semaphore UI 가 어디에 있든 완전히 독립적으로 운영할 수 있습니다.
어떤 문제를 해결하나요?
러너가 없으면 모든 자동화 작업이 하나의 서버에서 실행됩니다. 처음에는 괜찮지만, 팀 규모나 팀 수가 커질수록 보통 세 가지 문제가 나타납니다.
- 부하. 하나의 서버 자원을 두고 많은 작업이 경쟁하면 전체가 느려집니다.
- 격리. 여러 팀이 같은 실행 환경을 공유하면, 한 팀의 깨진 파이프라인이 다른 모든 팀에 영향을 줄 수 있습니다.
- 지리적 거리. Ansible 은 SSH 로 서버에 접속합니다. 인프라는 시드니에 있는데 Semaphore 인스턴스는 프랑크푸르트에 있다면, 모든 배포가 대륙 간 연결을 거치게 됩니다. 러너는 이 세 가지 문제를 모두 해결합니다.
글로벌 러너와 프로젝트 러너
Semaphore 는 두 가지 유형의 러너를 제공하며, Pro 플랜을 검토 중이라면 이 차이가 중요합니다.
| 기능 | 글로벌 러너 (OSS) | 프로젝트 러너 (Pro) |
|---|---|---|
| 제공 플랜 | OSS (무료) | Pro |
| 부하 분산 | ✅ | ✅ |
| 네트워크 격리 | ❌ | ✅ |
| 태그 기반 라우팅 | ❌ | ✅ |
| 프로젝트별 제어 | ❌ | ✅ |
글로벌 러너는 모든 프로젝트에 무작위로 할당됩니다. 부하를 분산하기에는 좋지만, 어떤 러너가 어떤 작업을 가져갈지는 제어할 수 없습니다. 프로젝트 러너를 사용하면 어떤 Template 이나 Inventory 에든 태그를 붙인 뒤, 특정 작업을 특정 러너로 보낼 수 있습니다. 이것이 바로 격리와 지역 기반 라우팅을 가능하게 합니다.
러너를 사용할 만한 실제 사례 3가지
-
여러 팀, 간섭은 없음 플랫폼 팀과 제품 팀이 모두 Semaphore 를 사용한다고 해봅시다. 서로 다른 프로젝트, 다른 서버, 다른 위험 허용 수준으로 독립적으로 일합니다. 프로젝트 러너를 사용하면 각 팀이 자기 전용 러너를 갖게 됩니다. 한 팀의 러너가 내려가도 다른 팀은 알아차리지 못합니다.
-
여러 리전에 걸친 분산 인프라 웹사이트는 뉴욕 데이터센터에서 동작하고, 백엔드 서비스는 호주에서 동작한다고 해봅시다. 유럽에 있는 중앙 러너 하나만 사용하면 모든 배포가 SSH 로 지구 반대편을 오가게 되어 느리고 불필요합니다.
뉴욕에 하나, 호주에 하나의 러너를 두고 Inventory 에 알맞은 태그를 붙이세요. 이제 각 작업은 같은 네트워크 안에서 로컬로 연결되어 최대 속도로 실행됩니다. 배포는 더 빨라지고, 공격 표면도 줄어드는 보너스까지 얻을 수 있습니다.
-
웹훅 + AWS Lambda 로 클라우드 비용 절감 이 부분은 조금 천천히 볼 가치가 있습니다. 실제로 의미 있는 비용 최적화이기 때문입니다. 러너는 작업 시작과 작업 종료라는 두 이벤트에 대해 웹훅을 지원합니다. 이를 이용하면 클라우드 리소스를 자동으로 켜고 끌 수 있습니다.
구성은 이렇습니다. 러너는 AWS EC2 인스턴스에서 실행됩니다. 실행 중일 때는 비용이 들고, 중지되어 있으면 비용이 들지 않습니다.
- 작업 시작 시 -> 웹훅이 Lambda 함수를 호출 -> Lambda 가 EC2 인스턴스를 시작 -> 러너가 온라인 상태가 되고 Semaphore 에 연결해 작업을 가져옴
- 작업 종료 시 -> 또 다른 웹훅이 다른 Lambda 를 호출 -> Lambda 가 EC2 인스턴스를 중지
러너는 실제로 일할 때만 실행됩니다. 작업이 드문 팀이라면 이것만으로도 Pro 플랜의 가치가 생길 수 있습니다.
프로젝트 러너 설정 방법
-
프로젝트 설정으로 이동한 뒤 Runners 탭을 엽니다. 여기에서 기존 러너 목록을 볼 수 있습니다.
-
New Runner 를 클릭합니다. 이름과 태그를 지정합니다. 예를 들어
new-york입니다. -
저장하면 Semaphore 가 두 가지 자격 증명을 생성합니다. 하나는 양쪽에 저장되어 식별에 사용되는 토큰이고, 다른 하나는 러너에만 저장되어 전송 중 데이터를 암호화하는 데 쓰이는 개인 키입니다. 다음 단계에서 필요하므로 개인 키를 다운로드하세요.
-
대상 서버에 러너를 배포합니다. 가장 쉬운 방법은 Docker 를 사용하는 것입니다.
docker run \ -e SEMAPHORE_WEB_ROOT=https://semaphore.example.com \ -e SEMAPHORE_RUNNER_TOKEN=/ADwjSWmWV8FZB4pwQaaEOWgqIdOR+oDOeOXe2a3JD0= \ -e SEMAPHORE_RUNNER_PRIVATE_KEY_FILE=/config.runner.key \ -v "/path/to/private/key:/config.runner.key" \ -d semaphoreui/runner:v2.17.28또는 대화형 설정 명령을 사용할 수도 있습니다.
semaphore runner setup -
Semaphore 로 돌아가 아무 Template 이나 Inventory 를 열고 러너 태그
new-york를 지정하세요. 그러면 그 작업은 항상 뉴욕 러너에서 실행됩니다.
Template 뿐 아니라 Inventory 에도 태그 달기
서버가 리전이나 네트워크별로 묶여 있다면 작업을 라우팅하는 더 똑똑한 방법이 있습니다. 각 Template 에 개별적으로 태그를 다는 대신, 러너 태그를 Inventory 에 직접 지정할 수 있습니다.
Semaphore 에서 Inventory 는 Ansible 이 서버에 접속할 때 사용하는 IP 주소 목록입니다. 특정 서버 그룹이 뉴욕에 있다는 것을 안다면, 그 Inventory 에 new-york 태그를 붙이세요. 그러면 그 Inventory 를 사용하는 모든 Template 이 자동으로 뉴욕 러너에서 실행되며, Template 별 설정은 필요하지 않습니다.
이 방식은 새로운 Template 을 추가할 때 특히 유용합니다. 올바른 Inventory 를 고르면 러너 라우팅이 자연스럽게 따라옵니다.
한 가지 더: 동시 실행 제한
동시 실행 수를 제한하고 싶다면 러너별 최대 병렬 작업 수를 설정하세요. 기본값은 무제한 (0) 입니다. 이를 5 로 설정했고 해당 러너가 이미 바쁘다면, Semaphore 는 같은 태그를 가진 다른 러너로 작업을 보냅니다.
써볼 준비가 되셨나요?
프로젝트 러너는 Semaphore Pro 플랜에서 사용할 수 있습니다. 위에서 말한 상황, 즉 늘어나는 작업 대기열, 여러 팀, 분산 인프라에 해당한다면 충분히 살펴볼 만합니다.