공부/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