데브코스

[18주차 - DAY5] 오픈소스 기여(4)

미안하다 강림이 좀 늦었다 2024. 6. 28. 14:28

 

 

오픈소스 프로젝트 주제 선정

오픈소스 주제는 개발 과정에 필요성을 해소하는 주제로 선정하는 것이 좋다.

정한 주제가 없다면 다음과 같은 기능을 주제로 선정한다.

  • 복잡한 구동 과정 없이 결과를 확인할 수 있는 기능
  • 확장성이 있는 기능

예시로 lodash.js, underscore.js, immer.js가 있다.

 

 

오픈소스 저장소 생성 및 설정

1. 깃허브에서 사용자 아이콘을 클릭하여 Your organizations를 클릭한다.

 

2. New organization을 클릭한다.

 

3. 조직 이름과 내 이메일을 작성한다. My personal account를 선택하면 하고 넘어가면 된다.

 

4. 조직 멤버를 추가하는 화면이 나타난다. 일단 skip 한다.

 

5. organization 생성이 완료되었다.

 

6. 상단의 레포지토리 탭에 들어가서 새로운 레포지토리를 생성할 수 있다.

 

7. 레포지토리를 생성하고, 생성한 레포지토리의 settings의 branches에서 Add classic branch protection rule을 클릭한다.

 

8. 다음과 같이 설정하고, 저장한다.

이 설정은 인증을 받아야 브랜치 병합을 할 수 있도록 해준다. 브랜치 병합 전 브레이크 역할을 한다고 생각하면 된다.

 

 

오픈소스 문서 템플릿 및 README 작성

이슈 템플릿과 PR 템플릿은 모두 .github 폴더 안에 작성한다.

 

이슈 템플릿 작성

issue_template.md 파일을 다음과 같이 작성한다.

# <오픈소스이름> issue 양식

## 이슈
<!-- issue 제목을 적어주세요 -->

## 설명
<!-- 설명을 적어주세요 -->

## TODO
- [ ] 할 일1
- [ ] 할 일2

 

PR 템플릿 작성

pull_request_template.md 파일을 다음과 같이 작성한다.

# <오픈소스이름> pull request 양식

## PR 작업
<!-- PR 제목을 적어주세요 -->

## 설명
<!-- 설명을 적어주세요 -->

## TODO
- [ ] 할 일1
- [ ] 할 일2

 

README 작성

README.md 파일을 다음과 같이 작성한다.

# 오픈소스이름
<!-- 작성한 오픈 소스의 간단한 설명 -->

## 특징
- 특징1
- 특징2
- 특징3

## 설치
``` bash
npm install 오픈소스이름
```

## 사용법
``` js
const test = require('test');
// ...
```

## 기여하기
1. 저장소를 fork 한다.
2. 새 브랜치를 만들고, 수정 사항을 push 한다.
3. PR을 요청하고, 문서 양식에 맞게 내용을 기입한다.

## 라이센스
MIT 라이센스에 따라 제공되는 오픈 소스 SW 입니다.

 

 

PR 관리 github action 설정

github action은 깃허브에서 제공하는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 서비스이다.

.github/workflows/workflow.yml 파일을 다음과 같이 작성하면 PR을 보내면 자동으로 체크해준다.

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

on: # 워크플로우 실행 트리거
  pull_request: # pull_request가 실행될 때만
    types: [opend, synchronize] # PR 생성되고 업데이트 할 때

jobs: # 작업 정의
  check:
    runs-on: ubuntu-latest # 우분투 환경
    permissions: # 권한 설정
      pull-requests: write # PR에 쓰기 권한 설정
    steps:
      - uses: actions/github-script@v7
        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");
                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,
                  body: "",
                });

                // PR 닫기
                awiat github.rest.pulls.update({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  pull_number: pull_request.number,
                  state: "closed"
                });
              }
            }