PaaS/CI CD

Github Actions) 나의 Github 계정에서 수행된 Actions History를 모두 수집해보자

armyost 2024. 3. 3. 22:21
728x90

본 과제는 Github Actions 사용 추이 통계를 작성하는 과정에서 필요한 데이터를 얻기 위해 추진한 내용이다. 

 

Github API에서는 특정 Repository에 대한 Github Actions 이력을 보여준다.

예시로 https://api.github.com/repos/armyost/testPagePy/actions/runs 와 같이 조회하게 되면 아래와 같은 JSON 데이터 가 나온다.

{
    "total_count": 106,
    "workflow_runs": [
        {
            "id": 8049570541,
            "name": "Python application",
            "node_id": "WFR_kwLOFs44Vs8AAAAB38qy7Q",
            "head_branch": "master",
            "head_sha": "3120f519ed69e1a05f9e448d8b902ab247e81ae4",
            "path": ".github/workflows/python-app.yml",
            "display_title": "Python application",
            "run_number": 106,
            "event": "workflow_dispatch",
            "status": "completed",
            "conclusion": "success",
            "workflow_id": 75286667,
           ...
        },
        {
            "id": 8049553171,
            "name": "Python application",
            "node_id": "WFR_kwLOFs44Vs8AAAAB38pvEw",
            "head_branch": "master",
            "head_sha": "3120f519ed69e1a05f9e448d8b902ab247e81ae4",
            "path": ".github/workflows/python-app.yml",
            "display_title": "Python application",
            "run_number": 105,
            "event": "workflow_dispatch",
            "status": "completed",
            "conclusion": "success",
            "workflow_id": 75286667,

 

하나의 Repo에 대한 자료라면 수작업으로 충분히 가능하겠지만, 특정 User 또는 Organization에 대한 이력을 모두 출력하기 위해서는 별도의 개발이 필요하다. 그래서 개발하게 되었다.

 

본 개발 Github 주소https://github.com/armyost/billingArc

 

 

 

RestAPI 를 반복적으로 호출하면서 특정 계정/조직 내 모든 Repo의 Actions History를 수집하는 모듈이다.

for repo in listRepos:
        elapsedTimePerRepo = 0
        actionsUrl = baseUrl+repo+'/actions/runs'

 

 

위 JSON 응답에서 created_at과 updated_at의 차분이 해당 Workflow가 돌아간 전체시간이다. 이는 Github에서 과금할때 사용하는 Back Data와도 일치함을 확인하였다.

for workflowData in actions['workflow_runs']:
                workflowCreateTime = datetime.strptime(workflowData['created_at'], '%Y-%m-%dT%H:%M:%SZ')
                workflowUpdateTime = datetime.strptime(workflowData['updated_at'], '%Y-%m-%dT%H:%M:%SZ')
                if workflowCreateTime >= beforeOneWeekGMT:
                    elapsedTime = workflowUpdateTime - workflowCreateTime

 

 

Github의 과금방식에서 사용하는 메커니즘에 맞추기 위해 각 Workflow History에서 초단위 절상을 하였다. 

int(elapsedTime.total_seconds()/60)+1

 

 

다만, 이 모듈로 수집한 데이터와 실제 Github의 과금결과는 다소 차이가 발생할 수 있는데, 한 Workflow가 여러 Job을 병렬수행하는 경우 때문에 그렇다. 이 Python 모듈은 해당 Workflow의 시작과 끝의 차분으로 Computing 시간을 측정하는데, 간혹 Jobs을 병렬수행하도록 구성된 Workflow는 Computing 또한 병렬발생한 것이므로 병렬처리하는 모든 Computing 시간을 취합해야 한다. 하지만 이 부분 까지 확인할 수 있는 API 데이터를 찾지를 못하였다.