GitHub Actions 잠금 파일 적용법: 고정되는 코드와 빠지는 의존성

워크플로 파일은 그대로인데 @v3로 부른 액션이 어제와 다른 코드를 돌렸다. 잠금 파일 하나로 다른 저장소의 재사용 워크플로까지 묶어 둘 수 있을까?

GitHub Actions 잠금 파일 적용법: 고정되는 코드와 빠지는 의존성
세 줄 요약
  • GitHub Actions 잠금 파일은 태그가 가리키는 대상이 바뀌어도 기록한 커밋을 실행하게 한다.
  • 다른 저장소의 재사용 워크플로 호출과 컨테이너 이미지는 현재 CLI의 잠금 대상에서 빠진다.
  • Dependabot을 사용 중이면 액션 버전 변경 PR에서 해당 잠금 항목도 함께 갱신된다.

워크플로를 고치지 않았는데 실행 코드가 바뀌는 문제

uses: owner/action@v3처럼 태그로 액션을 부르면 실행 시점에 그 태그가 가리키는 코드가 사용된다. GitHub의 잠금 파일은 참조와 실행 커밋을 .github/workflows/actions.lock에 기록한다. 잠금 파일을 적용한 워크플로는 이 커밋을 사용한다. 저장소의 숫자 식별자도 함께 기록해, 액션 이름이 가리키는 저장소가 원래 저장소와 같은지 검사한다.

10월 14일 발표에 따르면 Free·Team·Enterprise Cloud와 데이터 레지던시 환경에서 공개 프리뷰를 제공한다. 워크플로에 @v3가 남아 있어도 잠금 파일에 기록한 커밋을 실행하므로, 게시자가 태그를 옮긴 것만으로 실행 코드가 바뀌지 않는다.

다른 저장소의 재사용 워크플로와 이미지는 잠그지 않는다

잠금 대상에는 지원되는 원격 액션과 그 액션이 다시 부르는 액션이 포함된다. 반면 job의 uses:로 다른 저장소의 재사용 워크플로를 호출하면 현재 CLI는 그 참조를 잠그지 않는다. 액션의 의존성은 고정돼도 외부 워크플로를 가리키는 태그는 바뀔 수 있다.

대상현재 잠금 지원
지원되는 원격 액션과 그 액션의 전이 의존성잠금 파일에 실행 커밋을 기록한다.
다른 저장소의 재사용 워크플로 호출현재 CLI의 잠금 대상이 아니다.
컨테이너 이미지잠금 대상이 아니다. 이미지는 별도의 digest로 고정한다.

개념 문서에는 재사용 워크플로도 포함한다는 설명이 있었지만, 저장소 관리자 nodeselector는 10월 20일 이를 문서 오류라고 밝혔다. CLI의 제한 사항에도 외부 재사용 워크플로가 잠금 대상에서 빠진다고 명시돼 있다.

GitHub CLI로 잠금 파일을 생성한다

인증된 GitHub CLI가 있는 저장소에서 확장을 설치하고, 먼저 워크플로 하나를 대상으로 적용할 수 있다. 아래는 공식 도입 절차의 명령이다.

gh extension install github/gh-actions-lock
gh actions-lock .github/workflows/ci.yml

실행 결과에는 actions.lock뿐 아니라 워크플로 파일의 변경도 들어갈 수 있다. 예를 들어 액션의 @v3 참조를 더 구체적인 버전 태그로 좁힌다. 커밋할 변경은 git diff -- .github/workflows/로 함께 볼 수 있다.

조직의 액션 허용 목록도 잠금 적용 후에는 기록된 커밋 SHA와 대조된다. 태그만 허용한 항목은 일치하지 않을 수 있다. 특정 커밋만 허용하려면 전체 SHA를, 더 넓은 참조를 허용하려면 해당 범위의 와일드카드를 정책에 지정한다.

Dependabot은 버전과 잠금 항목을 같은 PR에서 갱신한다

Dependabot 버전 업데이트를 사용 중이면 액션 버전 변경 PR에서 해당 잠금 항목도 함께 갱신된다. 잠금 파일이 적용된 워크플로에서 동작하며, 이 동기화를 위한 추가 설정은 없다. Dependabot을 사용하지 않던 저장소에는 먼저 버전 업데이트 설정이 필요하다.

잠금 파일 검증은 다음 명령으로 실행한다. --verify는 파일을 수정하지 않고 네트워크를 통해 출처까지 검사한다. --verify-local은 네트워크 없이 각 참조에 잠금 항목이 있는지만 검사한다.

gh actions-lock --verify
gh actions-lock --verify-local

자주 묻는 질문

GitHub Enterprise Server에서도 쓸 수 있는가?

현재 CLI는 github.com과 데이터 레지던시를 사용하는 Enterprise Cloud를 지원하며 Enterprise Server는 지원하지 않는다.