🎯 open source workflowλ₯Ό μƒμ„±ν•˜λŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.


πŸ“— Today I Learned

μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈ 생성 μ‹€μŠ΅

GitHubλ₯Ό ν™œμš©ν•œ μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈλ₯Ό μ„€μ •ν•˜κ³ , 이λ₯Ό κ΄€λ¦¬ν•˜λŠ” 데 ν•„μš”ν•œ λ¬Έμ„œμ™€ μžλ™ν™” μž‘μ—…μ„ μΆ”κ°€ν•˜λŠ” μ‹€μŠ΅μ„ ν•©λ‹ˆλ‹€.


μ˜€ν”ˆμ†ŒμŠ€ μ €μž₯μ†Œ 생성 및 브랜치 보호

λ¨Όμ € GitHubμ—μ„œ μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜λ €λ©΄, μƒˆ μ €μž₯μ†Œλ₯Ό 생성해야 ν•©λ‹ˆλ‹€. μ΄λ²ˆμ—” Organization을 μ΄μš©ν•˜μ—¬ μƒˆλ‘œμš΄ μ €μž₯μ†Œλ₯Ό λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€.

1️⃣ GitHubμ—μ„œ Organizations둜 μ΄λ™ν•˜μ—¬ New Organization λ²„νŠΌμ„ ν΄λ¦­ν•©λ‹ˆλ‹€.


2️⃣ Organization 이름, 이메일, μ†Œμ†μ„ 선택해 μƒˆ 쑰직을 μƒμ„±ν•©λ‹ˆλ‹€.


3️⃣ New Repositoryλ₯Ό 클릭해 μ €μž₯μ†Œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.


4️⃣ μ €μž₯μ†Œ 생성 ν›„, Settings > Branchesμ—μ„œ main 브랜치λ₯Ό 보호 μ„€μ •ν•©λ‹ˆλ‹€.


5️⃣ main λΈŒλžœμΉ˜μ— λŒ€ν•œ Ruleset을 μ§€μ •ν•˜κ³  보호 μ˜΅μ…˜μ„ μ„€μ •ν•©λ‹ˆλ‹€.

  • Require a pull request before merging : λ°˜λ“œμ‹œ PR을 ν†΅ν•΄μ„œλ§Œ main λΈŒλžœμΉ˜μ— 병합이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    • Dismiss stale pull request approvals when new commits are pushed : PR에 λŒ€ν•œ 승인이 μ™„λ£Œλœ ν›„ μƒˆλ‘œμš΄ 컀밋이 μΆ”κ°€λ˜λ©΄ κΈ°μ‘΄ μŠΉμΈμ„ λ¬΄νš¨ν™”ν•©λ‹ˆλ‹€.

    • Require approval of the most recent reviewable push : λ§ˆμ§€λ§‰μœΌλ‘œ ν‘Έμ‹œλœ 컀밋이 νƒ€μΈμ˜ μŠΉμΈμ„ λ°˜λ“œμ‹œ λ°›μ•„μ•Ό 병합이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    • Require conversation resolution before merging : PR에 μž‘μ„±λœ λͺ¨λ“  μ½”λ©˜νŠΈ λŒ€ν™”(Conversation)κ°€ ν•΄κ²°λ˜μ–΄μ•Ό 병합할 수 μžˆμŠ΅λ‹ˆλ‹€.




μ˜€ν”ˆμ†ŒμŠ€ λ¬Έμ„œ ν…œν”Œλ¦Ώ 생성

MINIDASH/
β”œβ”€β”€ πŸ“ .github/                 
β”‚   β”œβ”€β”€ πŸ“ ISSUE_TEMPLATE/      
β”‚   β”‚   β”œβ”€β”€ πŸ“„ bug_report.md       
β”‚   β”‚   └── πŸ“„ feature_request.md   
β”‚   └── πŸ“ workflows/
β”‚       └── πŸ“„ workflow.yml       
β”œβ”€β”€ πŸ“ src/                           
β”‚   β”œβ”€β”€ πŸ“„ capitalize.js
β”‚   β”œβ”€β”€ πŸ“„ checkArr.js 
β”‚   β”œβ”€β”€ πŸ“„ findEvenNums.js 
β”‚   └── πŸ“„ findOddNums.js
β”œβ”€β”€ πŸ“„ index.js   
β”œβ”€β”€ πŸ“„ README.md               
β”œβ”€β”€ πŸ“„ CONTRIBUTING.md         
β”œβ”€β”€ πŸ“„ CODE_OF_CONDUCT.md      
β”œβ”€β”€ πŸ“„ LICENSE                         
└── πŸ“„ package.json            



GitHub Actions μ„€μ •

GitHub Actionsλ₯Ό μ‚¬μš©ν•˜λ©΄ CI/CDλ₯Ό μžλ™ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œκ°€ ν‘Έμ‹œλ  λ•Œλ§ˆλ‹€ ν…ŒμŠ€νŠΈλ₯Ό μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜κ±°λ‚˜, 배포 μž‘μ—…μ„ μžλ™ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

GitHub Actionsλ₯Ό μ„€μ •ν•˜λ €λ©΄, μ €μž₯μ†Œ 내에 .github/workflows 폴더λ₯Ό λ§Œλ“€κ³  κ·Έ μ•ˆμ— .yml ν™•μž₯자λ₯Ό κ°€μ§„ μ›Œν¬ν”Œλ‘œμš° νŒŒμΌμ„ μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

이 μ›Œν¬ν”Œλ‘œμš° νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 것 μžμ²΄κ°€ GitHub Actions μ„€μ •μ˜ μ‹œμž‘μ΄λ©°, ν•΄λ‹Ή νŒŒμΌμ„ 톡해 μ–΄λ–€ μ΄λ²€νŠΈμ— μ–΄λ–€ μž‘μ—…μ„ μžλ™μœΌλ‘œ μ‹€ν–‰ν• μ§€ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ€” GitHub Actionsλž€?
GitHub ActionsλŠ” GitHubμ—μ„œ μ œκ³΅ν•˜λŠ” μžλ™ν™” λ„κ΅¬λ‘œ, μ €μž₯μ†Œ λ‚΄μ—μ„œ CI/CD(지속적 톡합 및 지속적 배포) νŒŒμ΄ν”„λΌμΈμ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œκ°€ λ³€κ²½λ˜λ©΄ μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈ, λΉŒλ“œ, 배포 λ“±μ˜ μž‘μ—…μ„ μ‹€ν–‰ν•˜μ—¬ 개발 νš¨μœ¨μ„±κ³Ό μ½”λ“œ ν’ˆμ§ˆμ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.


  • workflow.yml

Pull Request의 본문이 λΉ„μ–΄ μžˆλŠ”μ§€ μžλ™μœΌλ‘œ κ²€μ‚¬ν•˜κ³ , λΉ„μ–΄ μžˆμ„ 경우 μ•ˆλ‚΄ λ©”μ‹œμ§€λ₯Ό 남기고 PR을 μžλ™μœΌλ‘œ λ‹«λŠ” μ›Œν¬ν”Œλ‘œμš° μ˜ˆμ‹œμž…λ‹ˆλ‹€.

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() {
              try {
                const pull_request = context.payload.pull_request;

                if (!pull_request) {
                  console.log("This is not a pull request.");
                  return;
                }

                const body = pull_request.body;

                if (!body || body.trim() === "") {
                  await github.rest.issues.createComment({
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    issue_number: pull_request.number,
                    body: "ν•΄λ‹Ή PR은 κ°€μ΄λ“œλΌμΈμ„ μ€€μˆ˜ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ•Œλ¬Έμ— PR을 닫도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°€μ΄λ“œλΌμΈμ„ μ€€μˆ˜ν•΄μ„œ λ‹€μ‹œ PR을 μš”μ²­ν•΄μ£Όμ„Έμš”. 😊"
                  });

                  await github.rest.pulls.update({
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    pull_number: pull_request.number,
                    state: "closed"
                  });
                }
              } catch (error) {
                console.error("❌ μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ 쀑 였λ₯˜ λ°œμƒ:", error.message);
              }
            }

            run();
  • on : 이 μ„Ήμ…˜μ€ μ›Œν¬ν”Œλ‘œμš°κ°€ 싀행될 트리거λ₯Ό μ •μ˜ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€. push λ˜λŠ” pull_request μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ μ›Œν¬ν”Œλ‘œμš°κ°€ μ‹€ν–‰λ˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ( λ§Œμ•½ 브랜치λ₯Ό λ”°λ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, λͺ¨λ“  λΈŒλžœμΉ˜μ—μ„œ ν•΄λ‹Ή μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ μ›Œν¬ν”Œλ‘œμš°κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. )

  • jobs : μ›Œν¬ν”Œλ‘œμš° μ•ˆμ—μ„œ μ‹€μ œλ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—… λ‹¨μœ„μž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ μ›Œν¬ν”Œλ‘œμš°λŠ” μ—¬λŸ¬ 개의 job을 κ°€μ§ˆ 수 있고, 각 job은 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜κ±°λ‚˜ μˆœμ„œλ₯Ό μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • check : jobs μ•ˆμ— μ •μ˜λœ ν•˜λ‚˜μ˜ μž‘μ—…(job) μ΄λ¦„μž…λ‹ˆλ‹€. 이 이름은 자유둭게 λ³€κ²½ν•  수 있으며, μ›Œν¬ν”Œλ‘œμš° λ‚΄λΆ€μ—μ„œ 이 job을 식별할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

      • runs-on : job을 μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•  가상 ν™˜κ²½μ„ μ§€μ •ν•©λ‹ˆλ‹€.

      • permissions : 이 μ›Œν¬ν”Œλ‘œμš°κ°€ GitHub API에 μ–΄λ–€ κΆŒν•œμœΌλ‘œ μ ‘κ·Όν•  수 μžˆμ„μ§€ μ„€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ PR에 λŒ“κΈ€μ„ 달렀면 pull-requests: write κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

      • steps : ν•˜λ‚˜μ˜ job μ•ˆμ—μ„œ μ‹€μ œλ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—… 단계듀을 μˆœμ„œλŒ€λ‘œ μ •μ˜ν•©λ‹ˆλ‹€. 각 stepμ—λŠ” μ™ΈλΆ€ μ•‘μ…˜μ„ μ‚¬μš©ν•˜κ±°λ‚˜ 직접 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” λ‚΄μš©μ΄ λ“€μ–΄κ°‘λ‹ˆλ‹€.

        • uses : μ™ΈλΆ€μ—μ„œ λ§Œλ“€μ–΄μ§„ GitHub Action을 κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λŠ” κ΅¬λ¬Έμž…λ‹ˆλ‹€. actions/github-script@v7 λ₯Ό μ‚¬μš©ν•΄μ„œ JavaScript μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

        • with : uses 둜 κ°€μ Έμ˜¨ Action에 μ„€μ •κ°’μ΄λ‚˜ 슀크립트 등을 λ„˜κ²¨μ€„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

          • script : github-script μ•‘μ…˜μ—μ„œ μ‹€ν–‰ν•  μ‹€μ œ JavaScript μ½”λ“œμž…λ‹ˆλ‹€. PR의 본문이 λΉ„μ–΄ μžˆλŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜κ³ , 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•Šμ„ 경우 μžλ™μœΌλ‘œ λŒ“κΈ€μ„ λ‹¬κ±°λ‚˜ PR을 λ‹«λŠ” λ“±μ˜ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



✏️ 회고

ν—ˆμš©λ˜μ§€ μ•Šμ€ PR이 μ•Œμ•„μ„œ μ œμ§€κ°€ λ˜λŠ” 것을 μ‹€μŠ΅ν•˜λ©΄μ„œ μžλ™ν™”κ°€ μ‹€μ œλ‘œ ν–‰ν•΄μ§€λŠ” 것을 λ³΄λ‹ˆ μžλ™ν™”κ°€ μ–Όλ§ˆλ‚˜ μ€‘μš”ν•œ μ§€ 깨달은 ν•˜λ£¨μ˜€λ‹€.

profile
🌱개발 기둝μž₯

0개의 λŒ“κΈ€