공부/Git

[Github Runner/Python] Offline 상태의 러너들 일괄 삭제

haejang 2024. 8. 4. 21:54
728x90
728x90

 

 

 

한번씩.. 러너 실행기 버전이 deprecate되었다던가 할 때, 러너들이 몇백개씩 새로 생성되며

실행 실패(?)된 러너들이 삭제되지도 않고 오프라인 상태로 남아있었다.

물론 시간이 더 지나면 알아서 없어지는것같긴 하다. 근데 난 성격이 급하니까 일괄로 지우는 스크립트 돌렸다.

 

import requests
import time

max_retries = 3
retry_delay = 5

# GitHub Organization과 Personal Access Token 설정
organization_name = 'suminhong'
token = '' # admin:org 권한이 있는 Classic Token 필요

# GitHub API 엔드포인트
api_url = f'https://api.github.com/orgs/{organization_name}/actions/runners'

# GitHub API 요청 헤더 설정
headers = {
    'Authorization': f'token {token}',
    'Accept': 'application/vnd.github.v3+json'
}

# 모든 페이지에 대해 Self-hosted runners 가져오기
page = 1
per_page = 100  # 예제에서는 페이지당 100개의 결과를 가져옴

while True:
    # GitHub API로 Organization 내 Self-hosted runners 가져오기
    response = requests.get(api_url, headers=headers, params={'page': page, 'per_page': per_page})
    runners = response.json()

    if not runners:  # 더 이상 결과가 없으면 종료
        print('더 이상 Offline인 러너가 없습니다.')
        break

    # 각 runner를 상태를 확인하고 오프라인이면 제거
    for runner in runners['runners']:
        runner_id = runner['id']
        runner_status = runner['status']

        if runner_status == 'offline':
            remove_url = f'{api_url}/{runner_id}'

            # 오프라인인 Self-hosted runner 제거 요청
            for retry in range(max_retries):
                try:
                    remove_response = requests.delete(remove_url, headers=headers, timeout=30)
                    if remove_response.status_code == 204:
                        print(f'Successfully removed offline runner {runner["name"]}')
                        break  # 성공적으로 제거되었으면 루프를 종료
                except requests.exceptions.ReadTimeout:
                    print(f'Timeout occurred. Retrying ({retry + 1}/{max_retries})...')
                    time.sleep(retry_delay)
    
    page += 1

 

 

특정 러너 이름을 골라 삭제하려면 이렇게.

import requests

# GitHub Organization과 Personal Access Token 설정
organization_name = 'suminhong'
token = '' # admin:org 권한이 있는 Classic Token 필요
# 특정 runner_name를 찾아서 제거
target_runner_name = 'k8s-runner-cache-krlg6-0'

# GitHub API 엔드포인트
api_url = f'https://api.github.com/orgs/{organization_name}/actions/runners'

# GitHub API 요청 헤더 설정
headers = {
    'Authorization': f'token {token}',
    'Accept': 'application/vnd.github.v3+json'
}

# GitHub API로 Organization 내 Self-hosted runners 가져오기
response = requests.get(api_url, headers=headers)
runners = response.json()

for runner in runners['runners']:
    if runner['name'] == target_runner_name:
        runner_id = runner['id']
        remove_url = f'{api_url}/{runner_id}'

        # Self-hosted runner 제거 요청
        remove_response = requests.delete(remove_url, headers=headers)

        if remove_response.status_code == 204:
            print(f'Successfully removed runner {target_runner_name}')
        else:
            print(f'Failed to remove runner {target_runner_name}. Status code: {remove_response.status_code}')

 

 

끝~

 

 

728x90
728x90