Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Actions에서 조직 수준의 필수 워크플로우를 관리할 수 있는 Required Workflows

GitHub에 조직 차원에서 필수 GitHub Actions 워크플로우를 관리할 수 있는 기능이 퍼블릭 베타로 공개되었다.

오픈 소스나 개인 프로젝트에서는 크게 필요하지 않지만, 회사에서는 전체 조직의 워크플로우를 관리하고 싶은 경우가 생기기 마련이다. 예를 들면 배포 나가기 전에 코드 정적 검사를 반드시 해야한다거나 보안 검사를 해야 하는 등 회사나 조직에서 정한 정책을 검사하는데 모든 프로젝트에 일일이 등록하게 하는 건 쉽지도 않지만 결국 관리도 안 되기 마련이다. 이런 부분에 고민이 좀 있었는데 마침, 이 기능이 나와서 살펴봤다.

Required Workflow

GitHub Actions에는 다양한 액션이 있는데 이번에 나온 기능은 Required Workflows라고 부른다. 이 기능은 특정 워크플로우를 만들어서 GitHub 조직 내 모든 저장소나 혹은 선택한 저장소에 필수 워크플로우로 등록할 수 있는 기능이고 문서에 따르면 다음과 같은 특징이 있다.

  • 조직에서 Required Workflow가 설정되어 있다면 저장소에서 GitHub Actions가 비활성화되어 있다고 하더라도 Required Workflow가 실행된다고 한다.
  • 저장소의 기본 브랜치가 반드시 조직의 기본 브랜치 설정과 일치해야 한다. 일치하지 않으면 Required Workflows가 실행은 되지만 머지 전 반드시 성공해야 하는 required check가 되진 않는다. 조직의 기본 브랜치 설정은 Settings -> Repository -> Repository defaults에서 할 수 있다. 이건 큰 조직일수록 맞추기는 쉽지 않을 거로 생각한다
  • Required Workflow가 실행되려면 pull request를 보내는 저장소(보통은 fork 받은 저장소)가 pull request가 올라가는 저장소와 같은 조직 안에 있어야 한다. 다시 말하면 개인 계정으로 fork해서 사용할 때는 사용할 수 없다는 의미이다. 난 주로 fork해서 사용하는 방식이 더 익숙했지만 이제는 GitHub Actions도 생겨서 워크플로우가 실행될 때 개인 계정으로 포크해서는 시크릿 값을 사용할 수 없으므로 이제는 같은 저장소에서 브랜치고 보통 Pull Reqeust를 보내고 있다. 또한 조직 내에서도 이제 fork를 받을 수 있게 되었으므로 큰 문제는 되지 않는다.
  • Required Workflow에서 사용하는 시크릿은 조직 시크릿이나 대상 저장소의 시크릿으로 저장되어 있어야 한다. 보통은 조직 시크릿을 사용할 거라고 생각된다.

그리고 Required Workflow가 가지는 몇 가지 제약사항도 있다.

  • Required Workflow는 꼭 .github/workflows 폴더가 아니라 저장소의 어떤 폴더에 저장해도 상관없다. Required Workflow가 Reusable Workflows을 호출한다면 Reusable Workflow는 반드시 .github/workflows 폴더에 저장되어 있어야 하고 Required Workflow에서 Reusable Workflow을 호출할 때는 {owner}/{repo}/.github/workflows/{filename}@{ref}처럼 전체 경로를 다 사용해야 한다.
  • Required Workflow가 프라이빗 저장소에 있다면 조직 내 다른 저장소에서 해당 저장소의 워크플로우에 접근할 수 있어야 한다. 이는 저장소에서 Settings -> Actions -> General에 가면 Actions permissions에서 설정할 수 있다.
  • 조직 내 공개 저장소에 저장된 Required Workflows는 조직 내 모든 저장소에 설정할 수 있고 비공개 저장소에 저장된 Required Workflow는 조직 내 비공개 저장소에만 설정할 수 있다.
  • CodeQL은 저장소 수준에서 구성이 필수이므로 Required Workflows에서 CodeQL은 지원하지 않는다. CodeQL이 안 되는 건 좀 아쉽게 생각한다.
  • Required Workflow가 구성된 저장소에는 Required Workflow를 설정할 수 없으므로 Required Workflow를 위한 별도의 저장소가 필요하다.
  • 조직 설정에서 GitHub Actions가 비활성화된 저장소에서는 Required Workflow가 실행되지 않는다.

그럼, Required Workflow를 어떻게 사용하는지 살펴보자.

Required Workflow 작성

동작 확인을 위해 조직 내에 required-actions라는 저장소를 만들고 프로젝트 루트에 compliance.yaml파일을 다음 내용으로 만들었다. 워크플로우의 내용 자체는 중요하지 않으므로 간단하게 문구만 출력했다.

name: Check Org Compliance

on: [pull_request]

jobs:
  required_workflow_job1:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Check Compilance"

Required Workflow는 Pull Reqeust에서만 동작하는데 머지 전 필수 검사를 하는 것이므로 당연한 것으로 보인다. 그래서 이벤트 트리거 조건을 on: [pull_request]로 주어야 하고 on: [push, pull_request]처럼 지정해서 push 이벤트에는 워크플로우가 실행되지 않는다. 반대로 on: [push]처럼 pull_request 이벤트를 지정하지 않는다면 Pull Request를 올렸을 때 Required Workflow로 등록되지만 정작 워크플로우는 실행되지 않아서 상태 검사가 되지 않고 무한 대기에 빠지니까 이는 조심해야 한다. 아직 퍼블릭 베타이므로 이후에는 검사 로직이 추가될 수도 있겠다.

Required Workflow 설정

작성한 Required Workflow를 사용하기 위해 설정해보자. Required Workflow는 조직에서 사용할 수 있는 기능이므로 개인 계정 말고 조직 계정에서만 사용할 수 있다. 조직 계정의 Settings에서 Actions -> General에 가면 Required Workflows 설정 부분을 볼 수 있다.

Required Workflow 설정

Add workflow를 누르면 Required Workflow를 구성할 수 있다.

Required Workflow 등록

여기서는 required-actions라는 테스트용 저장소를 만들어서 이를 선택한 뒤 워크플로우 파일의 지정할 수 있다. 워크플로우 파일을 자동완성 해주기 때문에 쉽게 지정할 수 있다.

작성한 Required Workflow 설정

대상 저장소는 조직 내 모든 저장소에 하거나 선택된 저장소만 할 수 있다. 아마 모든 저장소에 지정하는 것은 조직이 과제용이라거나 특수 목적의 저장소가 아니라면 업무할 때 제약사항이 많을 것이므로 보통은 선택된 저장소만 지정하게 될 것 같다. 물론 이 선택 저장소를 어떻게 관리할지가 쉽지 않을 수 있다.

등록된 Required Workflow 목록

저장하면 설정이 잘 된 것을 확인할 수 있다.

Required Workflow 동작 확인

앞에서 설정한 저장소에서 Pull Request를 올리면 다음과 같이 워크플로우가 실행되는 것을 볼 수 있다. 참고로 테스트용으로 만든 거라 해당 저장소에는 워크플로우를 하나도 추가하지 않았다.

Pull Reqeust에서 실행된 조직의 Required Workflow

Required Workflow가 성공적으로 실행되면 머지할 수 있는 상태가 된다.

Pull Reqeust에서 실행된 조직의 Required Workflow가 성공한 상태

실패 테스트를 위해 항상 실패하는 워크플로우를 Required Workflow로 하나 더 추가했다.

Pull Reqeust에서 실행된 조직의 Required Workflow가 실패한 상태

위와 같이 검사가 실패했으므로 머지가 되지 않는다.

원래 저장소에서 protected 브랜치를 설정하면 Branch protection rule을 추가하면서 상태 검사 중에 머지전 필수로 검사할 조건을 지정하고 어드민일 경우에는 조건이 충족되지 않아도 머지할 수 있게 하는 설정을 할 수 있는데 이 Required Workflow는 조직 수준에서 설정하는 것이기 때문에 이 protected 브랜치 설정과 어떤 영향을 받는지까지는 확인하지 못했다. 데모용으로 바로 만든 프로젝트에서는 제대로 설정할 수 없고 회사 조직에서 이를 테스트할 수는 없어서 이는 나중에 좀 더 기회가 되면 테스트해보려고 한다.

Required Workflow이긴 하지만 업무에서는 장애등 급한 경우에는 먼저 적용하고 나중에 수정해야 하는 경우도 있어서 이 부분도 궁금했다. 너무 엄격하면 조직 수준에서 적용할 때 더 조심스러운 부분도 생기기 마련이다. 어쨌든 GitHub Actions을 쓸 때 코드에 관해 조직 차원에서 관리하는 프로세스에 관해 아쉬움이 있었는데 Required Workflow가 나와서 어느정도 해소될 것 같다.

GitHub Actions 화면의 Required Workflow

저장소에 설정된 조직의 Required Workflow는 Actions 메뉴에서 따로 표시되므로 설정된 Required Workflow를 쉽게 확인할 수 있다.

2023/01/14 16:29 2023/01/14 16:29