DBMS(Dev-Books-Master-Study) 라는 기술 책 스터디를 시작하게 됐는데 Github로 스터디 자료를 관리해야한다는 규칙이 있어서 이에 관련된 내용을 정리해보려고 한다.
스터디에서 발표 자료 관리를 맡아서 하게 됐는데, 깃허브로 자료를 관리하는 게 처음이라 스터디 총책임자가 사용하시는 방식을 여쭤봐서 그대로 적용했다.🫠
알려주신 방법대로만 하면 될 줄 알았는데, GitHub에 대해 내가 모르고 있는 부분이 많아서 그런지 당황한 적이 많았다.
최근에 책 한 권이 끝났는데 두 번째 스터디부터는 같은 실수를 하지 않도록 첫 번째 스터디에서 했던 자료 관리 방법과 실수들을 정리해두려고 한다.
자료 관리 방식은 GitHub Actions를 사용해 Pull request로 올린 자료들을 정해진 시간에 자동으로 merge하는 것인데, GitHub Actions로 정적 페이지 배포만 해봤었지 다른 기능도 Actions로 정의해서 사용할 수 있는지 처음 알게 되었다.
Actions 기능을 사용하면 스터디원들이 자료를 업로드한 Pull request 들을 approve 없이 자동으로 merge 할 수 있기 때문에 편리하다.
스터디 레포지토리에 자동으로 merge되는 Actions 적용하는 방법
1. 레포지토리에 .github/workflows 폴더를 만들고, 폴더 안에 automerge.yml 파일을 생성한다.
automerge.yml 파일에 어떤 내용이 들어가는지는 아래에서 알아볼 것이다.
2. 레포지토리의 settings에 들어가서 Allo auto-merge 옵션을 체크해준다.
3. 스터디원들은 레포지토리를 fork한 다음 fork한 레포지토리에서 자료를 업로드 한 후, Pull request를 날린다.
4. automerge.yml 파일에서 설정한 시간에 자동으로 모든 Pull requests 들이 merge 된다.
⚠️ 이때 지정한 시간보다 5분에서 10분정도 merge가 늦게 된다.
아래 링크는 스터디중 팀원들에게 공유한 자료로, 더 자세한 방법을 알고싶다면 아래 링크를 참고하면 된다.
https://obtainable-hole-4a6.notion.site/DBMS-67b0fb771c744b9da46c940a0270ba73?pvs=4
DBMS 스터디 자료 업로드 방법
✅ 규칙
obtainable-hole-4a6.notion.site
automerge.yml 파일이란?
automerge라는 이름의 job을 수행하는 workflow를 정의해놓은 파일이다.
workflow란 공식문서에 하나 이상의 작업(job)을 실행하는 구성 가능한 자동화된 프로세스이며, 레포지토리의 이벤트에 의해 트리거될 때 실행되거나 수동으로 정의된 일정에 따라 트리거 된다고 적혀있다.
즉, automerge.yml 파일을 예시로 들면, 원본 레포지토리에 fork한 레포지토리로부터 pull request 라는 이벤트가 발생했을 때, automerge.yml 파일에 정의한 workflow가 자동으로 트리거된다는 것이다.
workflow를 정의하기 위해서는 .github/workflows 폴더 안에 .yml 또는 .ymal 확장자를 가지는 파일을 생성하고, 원하는 작업을 정해진 규칙에 맞게 작성하면 된다.
workflow를 작성하는 자세한 방법은 다음에 한 번 다뤄보도록 하겠다.
이 글에서는 스터디에서 사용한 automerge.yml 파일을 예시로 살펴보며, workflows의 기능중 몇 개만 간단하게 알아보려고 한다.
//.github/workflows/automerge.yml
name: automerge
on:
schedule:
- cron: '0 15 * * 4'
jobs:
automerge:
runs-on: ubuntu-latest
steps:
- name: automerge
uses: "pascalgn/automerge-action@v0.13.1"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
MERGE_LABELS: ""
그럼 스터디에서 사용했던 automerge.yml 파일에 대해 알아보자.
1. name
name은 workflow의 이름이다.
이름을 작성하지 않으면 Github에서 레포지토리 루트를 기준으로 workflow의 파일 경로를 표시한다고 한다.
예시에서는 automerge 기능을 정의한 workflow이므로, 이름을 automerge로 설정했다.
2. on
on은 workflow를 자동으로 트리거하기 위해 사용한다.
무슨 말이냐면, on 뒤에 오는 이벤트가 발생했을 때 자동으로 workflow가 실행되도록 할 수 있다는 뜻이다.
workflow를 트리거하는 이벤트는 예시에서 사용된 schedule 외에도 push, pull_request 등 다양하다.
예시에서는 schedule 이라는 이벤트를 설정했기 때문에 cron 구문에 정의된 시간에 workflow가 자동으로 실행되게 된다.
3. schedule
schedule 이벤트를 사용하면 cron 구문에 작성한 시간에 workflow가 실행되도록 예약할 수 있다.
이때, 주의할 점은 cron 구문에 작성하는 시간은 UTC 시간 기준이라는 것이다.
한국 시간은 UTC보다 +9시간만큼 빠르기 때문에 이 점에 주의해서 작성하도록 하자.
4. jobs
workflow는 하나 이상의 job으로 구성된다.
jobs 아래에 정의하고 싶은 job들을 정의하면 된다.
5. jobs.<job_id>
jobs 아래에 여러 개의 job이 존재할 수 있기 때문에 job_id라는 고유한 값으로 각 작업을 식별한다.
6. jobs.<job_id>.runs_on
job이 어떤 환경에서 실행될지 정의한다.
예시에서는 ubuntu-latest 즉, 가장 최신 버전의 우분투 환경에서 작업이 실행되도록 되어있다.
7. jobs.<job_id>.steps
각 job 아래 필요한 일련의 과정들을 정의한다.
모든 과정이 job을 실행하는 것은 아니고, 변수 설정 등의 과정도 포함된다.
8. jobs.<job_id>.steps[*].name
Github에 표시되는 이름이다.
예시에서는 name 을 automerge로 설정했기 때문에 해당 step의 이름이 automerge로 표시된다.
9. jobs.<job_id>.steps[*].uses
step의 과정중 실행할 작업을 선택한다.
예시에서는 public 레포지토리에서 제공하는 JavaScript 파일의 작업을 사용했기 때문에 {owner}/{repo}@{ref} 형식으로 작성했다.
어떤 저장소에 어떻게 저장되어있는지에 따라 작업을 사용하는 방법이 다르기 때문에 공식문서를 참고해서 작성하도록 하자.
10. jobs.<job_id>.steps[*].env
해당 step에서 사용할 변수를 설정한다.
예시에서는 GITHUB_TOKEN과 MERGE_LABELS라는 변수 두 개가 사용됐는데,
GITHUB_TOKEN은 모든 workflow의 실행에 대해 자동으로 생성되는 값으로, 인증이 필요한 작업을 할 때 ${{ secrets.GITHUB_TOKEN }} 라는 표준구문을 사용해 workflow에서 사용할 수 있다.
MERGE_LABELS는 merge하기 위해 필요한 label을 정의하는 변수이다.
빈 문자열(””)을 넣으면 모든 Pull request가 merge 되기 때문에 예시에서는 빈 문자열을 사용했다.
그렇다면, automerge.yml 파일이 어떤 일을 하는지 정리해보자.
- automerge라는 이름의 workflow가 schedule에 설정한 시간에 실행된다.
- automerge workflow에는 automerge라는 하나의 job이 존재한다.
- automerge job은 가장 최신 버전의 우분투 환경에서 실행된다.
- automerge job은 automerge라는 하나의 step으로 구성된다.
- automerge step에서는 pulbic 레포지토리인 pascalgn/automerge-action에서 버전이 v0.13.1인 JavaScript 파일을 가져와 실행한다.
- 그리고 이 작업을 실행하는데 필요한 변수들이 env에 정의되어 있다.
😱 몰라서 삽질했던 내용
- cron 구문으로 시간 설정할때 UTC 시간 기준인지 몰랐던 것
- fork한 레포지토리에서 한 번 Pull reauest를 날리고나서 commit을 하면 계속해서 Pull request에 반영이 된다는 것
- automerge.yml 파일을 수정하고 나면 그 이후에 날린 Pull request에 대해서만 수정한 workflow가 적용된다는 것
'Git & GitHub' 카테고리의 다른 글
[Git] 레포지토리 하나로 합치기 (0) | 2023.03.29 |
---|