러너란 무엇인가요?

Semaphore UI 러너는 UI 없이 동작하는 독립형 Semaphore 인스턴스입니다. 메인 Semaphore 서버에 연결해 작업을 가져오고 실행합니다. 러너는 어떤 리전이나 네트워크에 있든 별도의 서버에 호스팅할 수 있으며, Semaphore UI 가 어디에 있든 완전히 독립적으로 운영할 수 있습니다.

어떤 문제를 해결하나요?

러너가 없으면 모든 자동화 작업이 하나의 서버에서 실행됩니다. 처음에는 괜찮지만, 팀 규모나 팀 수가 커질수록 보통 세 가지 문제가 나타납니다.

  • 부하. 하나의 서버 자원을 두고 많은 작업이 경쟁하면 전체가 느려집니다.
  • 격리. 여러 팀이 같은 실행 환경을 공유하면, 한 팀의 깨진 파이프라인이 다른 모든 팀에 영향을 줄 수 있습니다.
  • 지리적 거리. Ansible 은 SSH 로 서버에 접속합니다. 인프라는 시드니에 있는데 Semaphore 인스턴스는 프랑크푸르트에 있다면, 모든 배포가 대륙 간 연결을 거치게 됩니다. 러너는 이 세 가지 문제를 모두 해결합니다.

글로벌 러너와 프로젝트 러너

Semaphore 는 두 가지 유형의 러너를 제공하며, Pro 플랜을 검토 중이라면 이 차이가 중요합니다.

기능 글로벌 러너 (OSS) 프로젝트 러너 (Pro)
제공 플랜 OSS (무료) Pro
부하 분산
네트워크 격리
태그 기반 라우팅
프로젝트별 제어

글로벌 러너는 모든 프로젝트에 무작위로 할당됩니다. 부하를 분산하기에는 좋지만, 어떤 러너가 어떤 작업을 가져갈지는 제어할 수 없습니다. 프로젝트 러너를 사용하면 어떤 Template 이나 Inventory 에든 태그를 붙인 뒤, 특정 작업을 특정 러너로 보낼 수 있습니다. 이것이 바로 격리와 지역 기반 라우팅을 가능하게 합니다.

러너를 사용할 만한 실제 사례 3가지

  1. 여러 팀, 간섭은 없음 플랫폼 팀과 제품 팀이 모두 Semaphore 를 사용한다고 해봅시다. 서로 다른 프로젝트, 다른 서버, 다른 위험 허용 수준으로 독립적으로 일합니다. 프로젝트 러너를 사용하면 각 팀이 자기 전용 러너를 갖게 됩니다. 한 팀의 러너가 내려가도 다른 팀은 알아차리지 못합니다.

  2. 여러 리전에 걸친 분산 인프라 웹사이트는 뉴욕 데이터센터에서 동작하고, 백엔드 서비스는 호주에서 동작한다고 해봅시다. 유럽에 있는 중앙 러너 하나만 사용하면 모든 배포가 SSH 로 지구 반대편을 오가게 되어 느리고 불필요합니다.

    뉴욕에 하나, 호주에 하나의 러너를 두고 Inventory 에 알맞은 태그를 붙이세요. 이제 각 작업은 같은 네트워크 안에서 로컬로 연결되어 최대 속도로 실행됩니다. 배포는 더 빨라지고, 공격 표면도 줄어드는 보너스까지 얻을 수 있습니다.

  3. 웹훅 + AWS Lambda 로 클라우드 비용 절감 이 부분은 조금 천천히 볼 가치가 있습니다. 실제로 의미 있는 비용 최적화이기 때문입니다. 러너는 작업 시작과 작업 종료라는 두 이벤트에 대해 웹훅을 지원합니다. 이를 이용하면 클라우드 리소스를 자동으로 켜고 끌 수 있습니다.

    구성은 이렇습니다. 러너는 AWS EC2 인스턴스에서 실행됩니다. 실행 중일 때는 비용이 들고, 중지되어 있으면 비용이 들지 않습니다.

    • 작업 시작 시 -> 웹훅이 Lambda 함수를 호출 -> Lambda 가 EC2 인스턴스를 시작 -> 러너가 온라인 상태가 되고 Semaphore 에 연결해 작업을 가져옴
    • 작업 종료 시 -> 또 다른 웹훅이 다른 Lambda 를 호출 -> Lambda 가 EC2 인스턴스를 중지

    러너는 실제로 일할 때만 실행됩니다. 작업이 드문 팀이라면 이것만으로도 Pro 플랜의 가치가 생길 수 있습니다.

프로젝트 러너 설정 방법

  1. 프로젝트 설정으로 이동한 뒤 Runners 탭을 엽니다. 여기에서 기존 러너 목록을 볼 수 있습니다.

  2. New Runner 를 클릭합니다. 이름과 태그를 지정합니다. 예를 들어 new-york 입니다.

  3. 저장하면 Semaphore 가 두 가지 자격 증명을 생성합니다. 하나는 양쪽에 저장되어 식별에 사용되는 토큰이고, 다른 하나는 러너에만 저장되어 전송 중 데이터를 암호화하는 데 쓰이는 개인 키입니다. 다음 단계에서 필요하므로 개인 키를 다운로드하세요.

  4. 대상 서버에 러너를 배포합니다. 가장 쉬운 방법은 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
    
  5. 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 플랜에서 사용할 수 있습니다. 위에서 말한 상황, 즉 늘어나는 작업 대기열, 여러 팀, 분산 인프라에 해당한다면 충분히 살펴볼 만합니다.