본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 91일차 with. TS 웹 풀스택

📚요약

지난 시간에는 실제 오픈 소스에 기여해 보는 방법들을 배웠습니다. 이번 시간에는 직접 오픈 소스 프로젝트를 만들어 보겠습니다.

 

📖오픈소스 프로젝트 만들어 보기

📄주제선정

오픈소스 프로젝트의 주제는 어렵게 생각할 필요 없이 개발 과정 중 필요한 부분을 오픈 소스로 만드는 것입니다. 예를 들어, lodash.js, immer.js처럼 복잡한 구동과정 없이 결과를 확인할 수 있고, 확장성이 보장된다면 좋은 주제입니다.

 

📄레포지토리 생성 및 설정

📑organization

레포지토리는 일반적인 레포지토리로 생성할 수 있지만, github의 organization 기능을 이용해서 생성해 보겠습니다. Organization을 통해 생성하면 비슷한 레포지토리끼리 모아서 작성할 수 있기 때문에 좀 더 편리하게 사용할 수 있습니다.

 

📑브랜치 protection rule 설정

오픈 소스의 경우 마음대로 merge를 했다가 오류가 발생하면 큰 문제가 발생할 수 있기 때문에 organization에 소속되어 있더라도 한 번 더 확인할 수 있도록 protection rule을 추가하는 것이 좋습니다. 이 외에도 다양한 방법들이 있으니 protection rule도 자세하게 살펴보시면 좋습니다.

 

📑템플릿 추가

지난 시간에 배웠던 github의 issue와 pull request에 대한 템플릿을 추가해 보겠습니다.

 

📑README 작성

readme도 단순하게 제목만 올라가 있는 빈 파일이 아닌 프로젝트에 대한 간단한 설명, 특징, 설치, 사용법, 기여 방법 등 다른 오픈 소스에 나와 있는 것처럼 작성해 보겠습니다.

 

📄Github Actions 설정

github에서 자동화를 위해서 제공하는 action 기능을 활용해서 pull request에 대한 검사를 진행해 보겠습니다.

 

📑yml 작성

action 기능을 동작시키기 위한 yml 문서를 작성해 보겠습니다.

name: Pull Request Check # 워크플로우 이름

on: # 워크플로우 실행 트리거
  pull_request: # pull request 실행 시 동작
    types: [opened, synchronize] # PR 생성 또는 업데이트 시 동

jobs: # 작업정의
  check: 
    runs-on: ubuntu-lastest
    permissions: #권한 설정
      pull-requests: write # PR 쓰기 권한 설정
    steps: # 작업 단계
      - uses: actions/github-script@7
        with:
          script: | # 스크립트 시작
            async function run() {
              const pull_request = context.payload.pull_request; # pull_request 객체 가져오기
  
              if(pull_request === undefined) {
                console.log("This is not a pull request"); # console 출력
                return; # 종료
              }

              const body = pull_request.body;

              if(!body) {
                // PR에 코멘트 추가
                await github.rest.issues.createComment({ // PR에 코멘트 추가
                  owner: context.repo.owner, // 저장소 소유자
                  repo: context.repo.repo, // 저장소 이름
                  issue_number: pull_request.number, // PR 번호
                  body: "해당 PR은 가이드라인을 준수하지 않았기 때문에 PR을 닫습니다. 가이드라인을 준수해서 다시 PR 해주세요", // 코멘트 내용
                });

                // PR 닫기
                await github.rest.pulls.update({ // PR 닫
                  owner: context.repo.owner, // 저장소 소유자
                  repo: context.repo.repo, // 저장소 이름
                  pull_number: pull_request.number, // PR 번호
                  state: "closed", // 상태 변경
                });
              }
            }

            run();

뭔가 오류가 발생해서 진행이 안 되는데 왜 그런지 모르겠다.

name: Pull Request Check

on: 
  pull_request: 
    types: [opened, synchronize]

jobs:
  check: 
    runs-on: ubuntu-latest
    permissions: 
      pull-requests: write
    steps: 
      - uses: actions/github-script@v7
        with:
          script: |
            async function run() {
              const pull_request = context.payload.pull_request; // pull_request 객체 가져오기
  
              if (!pull_request) {
                console.log("This is not a pull request"); // console 출력
                return; // 종료
              }

              const body = pull_request.body;

              if (!body) {
                // PR에 코멘트 추가
                await github.rest.issues.createComment({
                  owner: context.repo.owner, // 저장소 소유자
                  repo: context.repo.repo, // 저장소 이름
                  issue_number: pull_request.number, // PR 번호
                  body: "해당 PR은 가이드라인을 준수하지 않았기 때문에 PR을 닫습니다. 가이드라인을 준수해서 다시 PR 해주세요", // 코멘트 내용
                });

                // PR 닫기
                await github.rest.pulls.update({
                  owner: context.repo.owner, // 저장소 소유자
                  repo: context.repo.repo, // 저장소 이름
                  pull_number: pull_request.number, // PR 번호
                  state: "closed", // 상태 변경
                });
              }
            }

            run();

문제가 없는 yml 코드

🍯tip! 스팸성 PR 같은 경우 쌓이게 되면 오픈 소스 입장에서 굉장히 곤란하기 때문에 yml 문서에서 미리 조건을 추가해 바로 PR을 닫아 주는 것이 중요합니다.
🍯tip! LGTM(look good to me) 해당 표현은 코드나 PR에 대한 리뷰를 작성할 때 사용되는 표현으로 보기 좋다는 의미를 가진다. 이 외에도 다양한 표현들이 있으니 찾아보면 좋다.

 

다음 시간에 계속...

 

출처 & 참고

강사님의 강의