개요
기본적으로 GitHub Actions은(는) 동일한 워크플로 내에서 여러 작업을 허용하고, 여러 워크플로는 동일한 리포지토리 내에서 실행되고, 여러 워크플로는 리포지토리 소유자의 계정에서 동시에 실행됩니다. 즉, 여러 워크플로 실행, 작업 또는 단계를 동시에 실행할 수 있습니다.
GitHub Actions을(를) 사용하면 워크플로 실행의 동시성을 제어할 수 있으므로 특정 컨텍스트에서 한 번에 하나의 실행, 하나의 작업 또는 한 단계만 실행할 수 있습니다. 여러 워크플로, 작업 또는 단계를 동시에 실행하면 충돌이 발생하거나 예상보다 더 많은 Actions 시간(분) 및 스토리지를 사용할 수 있는 상황에서 계정 또는 조직의 리소스를 제어하는 데 유용할 수 있습니다.
예를 들어 워크플로를 동시에 실행할 수 있다는 것은 여러 커밋이 빠르게 연속으로 리포지토리에 푸시되는 경우 각 푸시가 별도의 워크플로 실행을 트리거할 수 있으며 이러한 실행이 동시에 실행된다는 것을 의미합니다.
다양한 시나리오에서 동시성 사용
jobs.<job_id>.concurrency
를 사용하여 동일한 동시성 그룹을 사용하는 단일 작업 또는 워크플로만 한 번에 실행되도록 할 수 있습니다. 동시성 그룹은 모든 문자열 또는 식일 수 있습니다. 허용되는 언어 식 컨텍스트: github
, inputs
, vars
, needs
, strategy
, matrix
. 식에 대한 자세한 내용은 “워크플로 및 작업에서 식 평가”을 참조하세요.
워크플로 수준에서 concurrency
를 지정할 수도 있습니다. 자세한 내용은 concurrency
를 참조하세요.
다시 말해 동시성 그룹 하나에는 한 번에 실행 중인 작업 최대 한 개, 보류 중인 작업 최대 한 개만 있을 수 있습니다. 동시 작업 또는 워크플로가 큐에 대기 중인 경우 리포지토리의 동일한 동시성 그룹을 사용하는 다른 작업 또는 워크플로가 진행 중이면 대기 중인 작업 또는 워크플로는 pending
상태가 됩니다. 동일한 동시성 그룹에 있는 모든 기존 pending
작업 또는 워크플로가 있는 경우 취소되고 대기 중인 새 작업 또는 워크플로가 대신 수행됩니다.
동일한 동시성 그룹에서 현재 실행 중인 작업 또는 워크플로도 취소하려면 cancel-in-progress: true
를 지정합니다. 동일한 동시성 그룹에서 현재 실행 중인 작업이나 워크플로를 조건부 취소하려면, 허용된 모든 식 컨텍스트에서 cancel-in-progress
을(를) 식으로 지정하면 됩니다.
Note
- 동시성 그룹 이름은 대/소문자를 구분하지 않습니다. 예를 들어
prod
및Prod
는 동일한 동시성 그룹으로 처리됩니다. - 동시성 그룹을 사용하는 작업 또는 워크플로 실행에 대해서는 순서가 보장되지 않습니다. 동일한 동시성 그룹에서 작업 또는 워크플로 실행은 임의의 순서로 처리됩니다.
예: 동시성 및 기본 동작 사용
GitHub Actions의 기본 동작은 여러 작업 또는 워크플로 실행이 동시에 실행되도록 하는 것입니다. concurrency
키워드를 사용하면 워크플로 실행의 동시성을 제어할 수 있습니다.
예를 들어 트리거 조건이 정의된 직후에 concurrency
키워드를 사용하면 특정 분기에 대한 전체 워크플로 실행의 동시성을 제한할 수 있습니다.
on:
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
작업 수준에서 concurrency
키워드를 사용하여 워크플로 내에서 작업의 동시성을 제한할 수도 있습니다.
on:
push:
branches:
- main
jobs:
job-1:
runs-on: ubuntu-latest
concurrency:
group: example-group
cancel-in-progress: true
예: 동시성 그룹
동시성 그룹은 워크플로 실행 또는 동일한 동시성 키를 공유하는 작업의 실행을 관리하고 제한하는 방법을 제시합니다.
이 concurrency
키는 워크플로 또는 작업을 함께 동시성 그룹으로 그룹화하는 데 사용됩니다. concurrency
키를 정의할 때 GitHub Actions은(는) 지정된 시간에 해당 키를 가진 하나의 워크플로 또는 작업만 실행되도록 합니다. 새 워크플로가 실행되거나 작업이 동일한 concurrency
키로 시작하는 경우 GitHub Actions은(는) 해당 키로 이미 실행 중인 워크플로 또는 작업을 취소합니다. concurrency
키는 하드 코딩된 문자열이거나 컨텍스트 변수를 포함하는 동적 식일 수 있습니다.
워크플로 또는 작업이 동시성 그룹의 일부가 되도록 워크플로에서 동시성 조건을 정의할 수 있습니다.
즉, 워크플로 실행 또는 작업이 시작되면 GitHub는 동일한 동시성 그룹에서 이미 진행 중인 워크플로 실행 또는 작업을 취소합니다. 이는 충돌을 일으키거나 필요한 것보다 더 많은 리소스를 사용할 수 있는 작업을 방지하기 위해 스테이징 환경에 배포하는 데 사용되는 것과 같은 특정 워크플로 또는 작업 집합에 대한 병렬 실행을 방지하려는 시나리오에서 유용합니다.
이 예제에서 job-1
은 이름이 staging_environment
인 동시성 그룹의 일부입니다. 즉, 새로 실행된 job-1
이 트리거되면 staging_environment
동시성 그룹에서 이미 진행 중인 동일한 작업의 실행이 취소됩니다.
jobs:
job-1:
runs-on: ubuntu-latest
concurrency:
group: staging_environment
cancel-in-progress: true
또는 워크플로에서 동적 식(예: concurrency: ci-${{ github.ref }}
)을 사용하면 워크플로 또는 작업이 워크플로를 트리거한 분기 또는 태그의 참조 앞에 이름이 ci-
인 동시성 그룹의 일부가 됩니다. 이 예제에서는 이전 실행이 진행 중인 동안 새 커밋이 기본 분기에 푸시되면 이전 실행이 취소되고 새 커밋이 시작됩니다.
on:
push:
branches:
- main
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
예: 동시성을 사용하여 진행 중인 작업 또는 실행 취소
동시성을 사용하여 GitHub Actions에서 진행 중인 작업 또는 실행을 취소하려면 true
로 설정된 cancel-in-progress
옵션을 통해 concurrency
키를 사용할 수 있습니다.
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
이 예제에서는 특정 동시성 그룹을 정의하지 않고 GitHub Actions은(는) 진행 중인 모든 작업 또는 워크플로 실행을 취소합니다.
예: 대체 값 사용
특정 이벤트에 대해서만 정의되는 속성으로 그룹 이름을 빌드하는 경우 대체 값을 사용할 수 있습니다. 예를 들어 github.head_ref
는 pull_request
이벤트에서만 정의됩니다. 워크플로가 pull_request
이벤트 외에 다른 이벤트에도 응답하는 경우 구문 오류를 방지하기 위해 대체를 제공해야 합니다. 다음 동시성 그룹은 pull_request
이벤트에서만 진행 중인 작업 또는 실행을 취소합니다. github.head_ref
가 정의되지 않은 경우 동시성 그룹은 실행에 고유하고 정의된 실행 ID로 대체됩니다.
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
예: 현재 워크플로에 대해서만 진행 중인 작업 또는 실행 취소
동일한 리포지토리에 여러 워크플로가 있는 경우 다른 워크플로에서 진행 중인 작업 또는 실행이 취소되지 않도록 워크플로 전체에서 동시성 그룹 이름이 고유해야 합니다. 그렇지 않으면 워크플로에 관계없이 이전에 진행 중이거나 보류 중인 작업이 취소됩니다.
동일한 워크플로의 진행 중인 실행만 취소하기 위해 github.workflow
속성을 사용하여 동시성 그룹을 빌드할 수 있습니다.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
예: 특정 분기에서 진행 중인 작업만 취소
특정 분기에서 진행 중인 작업만 취소하고 나머지는 취소하지 않고자 하는 경우, cancel-in-progress
을(를) 포함한 조건식을 사용하면 됩니다. 예를 들어 개발 분기에서만 진행 중인 작업을 취소하고 릴리스 분기에서는 취소하지 않으려면 이렇게 하면 됩니다.
릴리스 분기에서 실행 중이 아닌 경우 같은 워크플로의 진행 중인 실행만 취소하려면, 다음과 비슷한 식에 대하여 cancel-in-progress
을(를) 설정하면 됩니다.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'release/')}}
이 예시에서는 release/1.2.3
분기에 대한 여러 푸시를 실행해도 진행 중인 실행을 취소하지 않습니다. main
과(와) 같은 다른 분기로 푸시하면 진행 중인 실행이 취소됩니다.
조직 또는 엔터프라이즈에서 현재 작업 모니터링
동시성 또는 큐가 있는 제약 조건을 식별하려면 조직 또는 엔터프라이즈에서 GitHub 호스팅 실행기에서 현재 처리 중인 작업 수를 확인합니다. 자세한 내용은 "현재 작업 모니터링"을(를) 참조하세요.