가이드: 동일한 러너에서 Git 워크플로 실행

Bash, Python

공유 실행기에서 GitHub 워크플로 조정

GitHub Actions에서 여러 워크플로를 관리하는 것은 어려울 수 있으며, 특히 동일한 자체 호스팅 실행기에서 실행해야 하는 경우 더욱 그렇습니다. codeql.yml 및 snyk-zap.yml과 같이 다양한 워크플로에 대한 별도의 YAML 파일이 있는 시나리오에서는 특정 그룹의 동일한 실행기에서 실행되도록 하는 것이 까다로울 수 있습니다.

목표는 실행기의 이름을 명시적으로 지정하지 않고 두 워크플로에 동일한 실행기를 활용하여 다른 워크플로와의 충돌을 방지하는 것입니다. 이 가이드에서는 별도의 YAML 파일에서 워크플로를 유지하면서 효율적으로 동기화를 달성할 수 있는 가능한 솔루션을 살펴보겠습니다.

명령 설명
jq Bash 스크립트에서 JSON 출력을 구문 분석하는 데 사용되는 가볍고 유연한 명령줄 JSON 프로세서입니다.
head -n 1 사용 가능한 첫 번째 러너 ID를 선택하는 데 사용되는 결과의 첫 번째 줄을 출력합니다.
curl Bash 스크립트에서 GitHub의 API와 상호 작용하는 데 사용되는 URL을 통해 데이터를 전송하기 위한 명령줄 도구입니다.
os.getenv() GitHub 토큰 및 저장소 이름을 가져오는 데 사용되는 Python에서 환경 변수를 검색합니다.
requests.get() Python 스크립트의 GitHub API에서 사용 가능한 실행기를 가져오는 데 사용되는 지정된 URL로 GET 요청을 보냅니다.
os.path.exists() 실행기 ID 파일이 Python 스크립트에 이미 있는지 확인하는 데 사용되는 지정된 경로가 있는지 확인합니다.
with open() Python의 파일 작업을 위한 컨텍스트 관리자로, 실행기 ID를 파일에 읽고 쓰는 데 사용됩니다.

공유 실행기를 사용하여 워크플로 조정

제공된 스크립트는 GitHub 워크플로에 대한 실행기 할당을 관리합니다. Bash 스크립트는 실행기 ID가 이미 임시 파일에 저장되어 있는지 확인하는 것으로 시작됩니다. 그렇지 않은 경우 다음을 사용합니다. 사용 가능한 실행기에 대해 GitHub의 API를 쿼리하고 JSON 응답을 구문 분석하고 첫 번째 유휴 실행기를 선택하고 해당 ID를 저장합니다. Python 스크립트는 다음을 활용하여 유사한 기능을 달성합니다. GitHub의 API에서 실행기 정보를 가져오는 방법입니다. 그런 다음 스크립트는 다음을 사용하여 실행자 ID가 이미 저장되어 있는지 확인합니다. 그렇지 않은 경우 저장합니다.

두 스크립트 모두 실행기가 할당되면 저장된 실행기 ID를 참조하여 후속 작업에 재사용되도록 보장합니다. Python 스크립트에서는 GitHub 토큰 및 저장소에 대한 환경 변수를 검색합니다. 파일 작업을 안전하게 처리하는 데 사용됩니다. 이러한 스크립트는 여러 워크플로를 조정하는 데 도움이 되므로 실행자 이름을 하드코딩하지 않고도 동일한 실행기에서 실행되도록 하여 워크플로 실행을 유연하고 효율적으로 관리할 수 있습니다.

GitHub Actions를 위한 공유 러너 전략 구현

Bash 스크립팅 및 GitHub Actions를 사용하여 워크플로가 동일한 실행기에서 실행되도록 보장

# A script to manage runner assignment
#!/bin/bash

# Check if a runner is already assigned
RUNNER_ID=$(cat /tmp/runner_id)

if [ -z "$RUNNER_ID" ]; then
  # No runner assigned yet, pick one and save its ID
  RUNNER_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
               https://api.github.com/repos/$GITHUB_REPOSITORY/actions/runners |
               jq -r '.runners[] | select(.status=="online" and .busy==false) | .id' | head -n 1)
  echo $RUNNER_ID > /tmp/runner_id
fi

echo "Using runner $RUNNER_ID"

# Proceed with the workflow using the assigned runner

별도의 YAML 파일에서 일관된 실행기 사용 보장

조정된 워크플로 실행을 위해 Python 및 GitHub Actions 사용

import requests
import os

# GitHub API token and repository
GITHUB_TOKEN = os.getenv('GITHUB_TOKEN')
REPO = os.getenv('GITHUB_REPOSITORY')

# Function to get an available runner
def get_runner():
    url = f"https://api.github.com/repos/{REPO}/actions/runners"
    headers = {'Authorization': f'token {GITHUB_TOKEN}'}
    response = requests.get(url, headers=headers)
    runners = response.json()['runners']
    for runner in runners:
        if runner['status'] == 'online' and not runner['busy']:
            return runner['id']
    return None

# Check if a runner is already assigned
if not os.path.exists('/tmp/runner_id'):
    runner_id = get_runner()
    with open('/tmp/runner_id', 'w') as f:
        f.write(str(runner_id))
else:
    with open('/tmp/runner_id', 'r') as f:
        runner_id = f.read()

print(f"Using runner {runner_id}")

GitHub Actions의 효율적인 러너 관리

워크플로가 동일한 자체 호스팅 실행기에서 실행되어야 하는 시나리오에서 주요 고려 사항은 실행기 가용성을 보장하고 충돌을 최소화하는 것입니다. 이전 스크립트에서 볼 수 있듯이 공유 러너 전략을 사용하면 러너가 작업에 할당되면 후속 작업에서 동일한 러너를 사용하게 됩니다. 이는 상태를 유지하거나 캐시된 리소스를 활용하는 것이 중요한 복잡한 CI/CD 파이프라인에 특히 유용할 수 있습니다.

고려해야 할 또 다른 측면은 러너 활용도를 최적화하는 것입니다. 가용성에 따라 실행자를 동적으로 선택하고 할당함으로써 조직은 리소스를 더 잘 관리할 수 있습니다. 이러한 전략을 구현하면 효율성이 향상될 뿐만 아니라 워크플로가 사용 가능한 실행자를 기다리면서 대기열에서 소비하는 시간도 줄어듭니다. 이 접근 방식은 다른 CI/CD 도구 및 플랫폼으로 확장될 수 있으므로 다양한 자동화 요구 사항을 충족하는 다목적 솔루션이 됩니다.

  1. 특정 러너가 항상 사용되도록 하려면 어떻게 해야 합니까?
  2. 사용 실행기 그룹이나 정확한 실행기 이름을 지정하려면 YAML 파일에 키를 입력하세요.
  3. 워크플로우에 러너를 동적으로 할당할 수 있습니까?
  4. 예. 스크립트를 사용하여 사용 가능한 실행자를 쿼리하고 동적으로 할당하면 됩니다.
  5. 바쁜 환경에서 러너 충돌을 어떻게 처리합니까?
  6. 큐잉 메커니즘을 구현하거나 워크플로의 우선순위를 지정하여 러너 할당을 효과적으로 관리하세요.
  7. 주자가 없으면 어떻게 되나요?
  8. 실행자를 사용할 수 있을 때까지 워크플로가 대기열에 추가됩니다. 러너 사용을 최적화하여 대기 시간을 최소화하세요.
  9. 다른 CI/CD 플랫폼에서 이 스크립트를 사용할 수 있습니까?
  10. 예, 러너 관리에 대한 API 액세스를 통해 다른 플랫폼에 로직을 적용할 수 있습니다.
  11. 워크플로 간 상태를 어떻게 유지합니까?
  12. 관련 작업에 동일한 실행기가 사용되는지 확인하고 가능한 경우 캐싱 메커니즘을 활용하세요.
  13. 이 스크립트에는 어떤 권한이 필요합니까?
  14. GitHub 토큰에 다음과 같은 필수 범위가 있는지 확인하세요. 그리고 .
  15. 동일한 실행기에서 여러 워크플로를 동시에 실행할 수 있나요?
  16. 일반적으로 그렇지 않습니다. 각 실행기는 한 번에 하나의 작업을 실행합니다. 동시성을 위해 여러 실행기를 사용합니다.
  17. 러너 사용 및 성능을 어떻게 모니터링합니까?
  18. GitHub에 내장된 모니터링 도구나 외부 서비스를 사용하여 러너 활동과 성능을 추적하세요.

결론:

동일한 자체 호스팅 실행기에서 실행되도록 GitHub 워크플로를 관리하는 것은 효율성과 일관성을 위해 매우 중요합니다. 논의된 Bash 및 Python 스크립트는 실행기를 동적으로 할당하고 후속 작업에서 동일한 실행기를 사용하도록 보장함으로써 강력한 솔루션을 제공합니다. 이 접근 방식은 충돌을 최소화하고 리소스 활용도를 최적화하므로 복잡한 CI/CD 파이프라인에 효과적인 전략이 됩니다. 이러한 방법을 구현함으로써 조직은 워크플로 실행을 간소화하고 대기 시간을 줄여 궁극적으로 생산성을 향상하고 원활한 개발 프로세스를 유지할 수 있습니다.