Skip to content

8dong/release-workflows

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

12 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Next.js release process with changesets

changesets์„ ์ด์šฉํ•œ Next.js ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. github actions๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋ฉฐ, changesets์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ release version, CHANGELOG, Deploy๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

Environment

packageManager์€ yarn@4.5.0(yarn berry)๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, deploy๋Š” sst(v^3.1.49)๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

sst.config.ts

yarn create sst ๋ช…๋ น์–ด ์‹คํ–‰์‹œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— sst ์„ค์ • ํŒŒ์ผ(sst.config.ts)์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

// sst.config.ts

/// <reference path="./.sst/platform/config.d.ts" />

export default $config({
  app(input) {
    return {
      name: 'release-workflows',
      home: 'aws',
      providers: {
        aws: {
          region: 'ap-northeast-2'
        }
      },
      removal: input?.stage === 'production' ? 'retain' : 'remove'
    }
  },
  async run() {
    new sst.aws.Nextjs('ReleaseWorkflows', {
      imageOptimization: {
        memory: '512 MB'
      }
    })
  }
})
  • config: config ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. config ํ•จ์ˆ˜๋Š” app, run ๋‘ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

    • app: app ํ•จ์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ๋“œ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

      • name: ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์„ค์ •ํ•˜๋ฉฐ, ์ด๋Š” ๋ฆฌ์†Œ์Šค์˜ prefix๋กœ ์‚ฌ์šฉ (required)

      • home: โ€œawsโ€ | โ€œcloudflareโ€ | โ€œlocalโ€ ์™€ ๊ฐ™์€ ๊ฐ’์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋ฅผ ์ง€์ • (required)

      • providers: home์— ์„ค์ •๋œ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ๊ด€๋ จ ์„ค์ • (optional)

      • removal: โ€œremoveโ€ | โ€œretainโ€ | โ€œretain-allโ€์™€ ๊ฐ™์€ ๊ฐ’์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ "retain". ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋ฉฐ "remove"์˜ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ, "retain"์€ S3 buckets and DynamoDB tables ์œ ์ง€ํ•˜๋ฉฐ ์ด์™ธ ๋ฆฌ์†Œ์Šค๋“ค์€ ์ œ๊ฑฐ, "retain-all"์€ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ (optional)

    • run: run ํ•จ์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๋ฉฐ, ์ด ํ•จ์ˆ˜ ๋‚ด์—์„œ AWS Lambda, API Gateway, DynamoDB ๋“ฑ๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

      • sst.aws.Nextjs ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค ๊ด€๋ จ ์„ค์ • ๊ฐ€๋Šฅ

        • imageOptimization.memory: Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์„ ์ง€์ •

        • domain: ์‚ฌ์šฉ์ž ์ •์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„๊ณผ ๊ด€๋ จ๋œ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ

          • name: ์‚ฌ์šฉ์ž ์ •์˜ ๋„๋ฉ”์ธ

          • cert: SSL ์ธ์ฆ์„œ ARN

        • environment: ๋ฐฐํฌ์‹œ ์‚ฌ์šฉ๋  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

.changesets

changesets๋Š” ํ”„๋กœ์ ํŠธ ๋ฒ„์ „๊ณผ CHANGELOG ๋“ฑ ํŽธ๋ผํžˆ๊ฒŒ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ Semver๊ทœ์น™์— ๋”ฐ๋ผ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

yarn chageset init ๋ช…๋ น์–ด ์‹คํ–‰์‹œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .changeset ํด๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ changeset ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ @changesets/changelog-github๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Github ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— CHANGELOG๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Github API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์™€ PR(pull request) ์ œ๋ชฉ ๋ฐ ์„ค๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ CHANGELOG ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

config.json

์•„๋ž˜๋Š” yarn changeset init ๋ช…๋ น์–ด ์‹คํ–‰์‹œ ์ƒ์„ฑ๋˜๋Š” config ํŒŒ์ผ์ด๋ฉฐ, ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ์— .changeset/config.json์œผ๋กœ ๋ช…๋ น์„œ ์‹คํ–‰์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "$schema": "https://unpkg.com/@changesets/config@3.0.2/schema.json",
  "changelog": [
    "@changesets/changelog-github",
    { "repo": "OWNER/REPO_NAME" }
  ],
  "commit": false,
  "fixed": [],
  "linked": [],
  "access": "restricted",
  "baseBranch": "main",
  "updateInternalDependencies": "patch",
  "ignore": [],
  "privatePackages": {
    "tag": true,
    "version": true
  }
}
  • changelog: CHANGELOG๋ฅผ ์ƒ์„ฑํ•  ๋ฐฉ๋ฒ•์„ ์ •์˜

    • repo: CHANGELOG๊ฐ€ ์ƒ์„ฑ๋  Gihub repo ๋ช… ์ž‘์„ฑ
  • commit: false๋กœ ์„ค์ •์‹œ Changesets๋Š” ์ž๋™์œผ๋กœ ์ปค๋ฐ‹์„ ๋งŒ๋“ค์ง€ ์•Š์Œ

  • baseBranch: ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋ฅผ ์ •์˜

  • updateInternalDependencies: ๋‚ด๋ถ€ ์ข…์†์„ฑ์˜ ์—…๋ฐ์ดํŠธ ์ •์ฑ…์„ ์ •์˜

  • privatePackages: ๋น„๊ณต์‹ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ •์˜, npm์— ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€๋ผ๋ฉด ํ•ด๋‹น ์˜ต์…˜ ์ถ”๊ฐ€

    • tag: true ์„ค์ •์‹œ ํŒจํ‚ค์ง€๋ฅผ ํƒœ๊ทธ ๊ด€๋ฆฌ ํ—ˆ์šฉ

    • version: true ์„ค์ •์‹œ ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ํ—ˆ์šฉ

changesets Command

yarn changeset version ๋ช…๋ น์–ด ์‹คํ–‰์‹œ .changeset ํด๋”์˜ ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด์ „์— ๊ธฐ๋กํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ๊ณ  ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์–ด๋–ค ๋ฒ„์ „ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , package.json์˜ version ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งˆํฌ๋‹ค์šด์— ์ž‘์„ฑํ•œ ์„ค๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ CHANGELOG.md ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธ, ๋ณ€๊ฒฝ๋œ version ์ •๋ณด์™€ ์—…๋ฐ์ดํŠธ๋œ CHANGELOG.md๊ฐ€ ์ž๋™์œผ๋กœ commit, Release Note ์ž‘์„ฑ์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

---
"ํŒจํ‚ค์ง€ ์ด๋ฆ„": major | minor | patch
---

CHANGELOG.md์— ์ž‘์„ฑ๋  ๋‚ด์šฉ ์ž‘์„ฑ

์œ„ ํŒŒ์ผ์ฒ˜๋Ÿผ .changeset ํด๋” ๋‚ด ์œ ๋‹ˆํฌํ•œ ์ด๋ฆ„์˜ markdown ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์œ„ ํ…œํ”Œ๋ฆฟ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๊ณ  yarn changeset version ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ version, CHANGELOG, Release Note๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ , ํ•ด๋‹น ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

yarn changeset version ๋ช…๋ น์–ด ์‹คํ–‰ ์ดํ›„ yarn changeset tag ๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๋ฉด ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „ ์ •๋ณด์— ๋งž๋Š” Git tag๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

Github Actions

์•„๋ž˜๋Š” Github Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„ ๊ณผ์ •๋“ค์„ ์ž๋™ํ™”ํ•˜๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐฐํฌ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๋Š” workflow์ด๋ฉฐ, ์ „์ฒด์ ์ธ ํ‹€์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

dev์™€ main ๋ธŒ๋žœ์น˜ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๋ฐฐํฌ ๋ฒ„์ „์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋ถ€ํ„ฐ๋Š” dev ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐœ๋ฐœ ๋ฒ„์ „, main ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์šฉ ๋ฒ„์ „์ด๋ผ ์นญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

dev-release.yml

  • development release workflow์˜ ๊ฒฝ์šฐ dev ๋ธŒ๋žœ์น˜์— commit์ด push๋˜๋Š” ๊ฒฝ์šฐ์— ์ˆ˜ํ–‰

    • release jobs

      • environment

        • runs-on: ubuntu-latest: GitHub์ด ์ œ๊ณตํ•˜๋Š” ์ตœ์‹ ์˜ Ubuntu ์šด์˜์ฒด์ œ์—์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰

        • permissions: ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํŠน์ • GitHub API ๊ถŒํ•œ์„ ์ œ์–ด

          • content: write: ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์šฉ ์ˆ˜์ • ๊ถŒํ•œ์„ ๋ถ€์—ฌ, ํ•ด๋‹น ๊ถŒํ•œ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ , commit์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ‘ธ์‹œ ๊ฐ€๋Šฅ

          • pull-request: write: ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ ๊ถŒํ•œ์„ ๋ถ€์—ฌ

      • steps

        • name: Enable corepack: Node.js์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(Corepack)๋ฅผ ํ™œ์„ฑํ™”, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” yarn berry๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ corepack์„ ํ†ตํ•ด ํŒจํ‚ค์ง€์˜ yarn berry ๋ฒ„์ „์„ ๋ณด์žฅ๋˜๋„๋ก ๋ณด์žฅํ•ด์คŒ

        • name: Install Node.js: Node.js ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋กœ์ด๋ฅด๋ชจ Node๋ฅผ v18๋กœ ์„ค์น˜, yarn cache๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋นŒ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ

        • name: Install Dependencies: ํŒจํ‚ค์ง€ ์˜์กด์„ฑ ์„ค์น˜

        • name: Configure AWS credentials: AWS CLI ์‹คํ–‰์„ ์œ„ํ•œ credentials ์„ค์ •

        • name: Deploy: sst ๋ฐฐํฌ ์ˆ˜ํ–‰

    • notification jobs

      • environment

        • runs-on: ubuntu-latest: GitHub์ด ์ œ๊ณตํ•˜๋Š” ์ตœ์‹ ์˜ Ubuntu ์šด์˜์ฒด์ œ์—์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰

        • needs: release: release jobs ์ž‘์—… ์™„๋ฃŒ๋œ ํ›„์—๋งŒ ์‹คํ–‰

      • steps

        • name: Send Slack notification: release jobs ์ž‘์—…์˜ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋ฅผ Slack ์•Œ๋ฆผ์œผ๋กœ ์ „์†ก
name: development release

on:
  push:
    branches: [dev]

jobs:
  release:

    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write

    steps:
      - name: Enable corepack
      - uses: actions/checkout@v4
      - run: corepack enable

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: "yarn"

      - name: Install Dependencies
        run: yarn install

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: Deploy
        env:
          NEXT_PUBLIC_NODE_ENV: 'production'
        run: |
          yarn run deploy:dev

  notification:

    runs-on: ubuntu-latest
    needs: release
    if: always()

    steps:
      - name: Send Slack notification
        uses: slackapi/slack-github-action@v1.26.0
        with:
          channel-id: "์ฑ„๋„ ID"
          slack-message: "${{ github.repository }} ๊ฐœ๋ฐœ ๋ฐฐํฌ ${{ needs.release.result == 'success' &&  'โœ… ์„ฑ๊ณต' || 'โŒ ์‹คํŒจ'}}"
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

prod-release.yml

  • production release workflow์˜ ๊ฒฝ์šฐ main ๋ธŒ๋žœ์น˜์— commit์ด push๋˜๋Š” ๊ฒฝ์šฐ์— ์ˆ˜ํ–‰

    • release jobs

      • steps

        • name: Create Release Pull Request

          • title: "chore: Development release": ์ƒ์„ฑ๋  PR์˜ ํƒ€์ดํ‹€

          • commit: "chore: Development release": ์ƒ์„ฑ๋  commit ๋‚ด์šฉ

          • version: yarn changeset:version: .changeset ํด๋”๋‚ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ž‘์„ฑ๋œ md ํŒŒ์ผ ์กด์žฌ์‹œ ์‹คํ–‰๋  ๋ช…๋ น์–ด๋กœ md ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ package.json์˜ version, CHANGELOG.md ์—…๋ฐ์ดํŠธํ•˜๊ณ  PR์„ ์ƒ์„ฑ

          • publish: yarn release: ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ๋œ ๊ฒฝ์šฐ ์‹คํ–‰๋  ๋ช…๋ น์–ด๋กœ Github ๋ฆด๋ฆฌ์ฆˆ, ํƒœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Github repository์— ์ถ”๊ฐ€, ์„ฑ๊ณต์‹œ outputs.published ๊ฐ’ "true" ๋ฐ˜ํ™˜

    • update-dev-brand jobs: main ๋ธŒ๋žœ์น˜์˜ version๊ณผ dev ๋ธŒ๋žœ์น˜์˜ version ๋™๊ธฐํ™” ์ž‘์—…

      • steps

        • name: Checkout dev branch: dev ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์„ ์ฒดํฌ์•„์›ƒํ•˜๊ณ  ์ดํ›„ step๋“ค ๋˜ํ•œ ํ•ด๋‹น ํ™˜๊ฒฝ์—์„œ ์ž‘์—… ์ˆ˜ํ–‰

        • name: Get release version

          • curl "https://,,,": URL์— HTTP ์š”์ฒญ์„ ์ „์†ก

          • - H ",,,": ์š”์ฒญ ํ—ค๋” ์„ค์ •

          • jq -r .tag_name: jq๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด๋ฉฐ, -r ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉฐ, .tag_name์€ JSON ๊ฐ์ฒด์—์„œ tag_name ํ•„๋“œ๋ฅผ ์ถ”์ถœ

          • if [-z "$version"]; then ,,, else ,,, fi: -z ์˜ต์…˜์„ ํ†ตํ•ด version ๋ณ€์ˆ˜๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ›„ version ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹น

          • echo "VERSION=${version}" >> $GITHUB_ENV: VERSION ํ™˜๊ฒฝ๋ณ€์ˆ˜์— version ๊ฐ’ ํ• ๋‹น

        • name: Delete changeset markdown file: .changeset ํด๋” ๋‚ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ ์ œ๊ฑฐ

        • name: Update package.json version

          • jq --arg version "$VERSION": VERSION ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ version ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ

          • '.version = $version' package.json > tmp.json: package.json์˜ version ํ•„๋“œ ๊ฐ’์„ ์•ž์—์„œ ์ €์žฅ๋œ version ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋‚ด์šฉ์„ tmp.json ํŒŒ์ผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ

          • mv tmp.json package.json: tmp.json ๋‚ด์šฉ์„ package.json์— ๋ฎ์–ด์”Œ์›Œ ์—…๋ฐ์ดํŠธ

        • name: Create commit and push to dev branch: ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์„ commit ์ƒ์„ฑํ›„ dev ๋ธŒ๋žœ์น˜์— push

name: production release

on:
  push:
    branches: [main]

jobs:
  release:

    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write

    steps:
      - name: Enable corepack
      - uses: actions/checkout@v4
      - run: corepack enable

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: "yarn"

      - name: Install Dependencies
        run: yarn install

      - name: Create Release Pull Request
        id: changesets
        uses: changesets/action@v1
        with:
          title: "chore: Production release"
          commit: "chore: Production release"
          version: yarn changeset:version
          publish: yarn release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Configure AWS credentials
        if: steps.changesets.outputs.published == 'true'
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: Deploy
        if: steps.changesets.outputs.published == 'true'
        env:
          NEXT_PUBLIC_NODE_ENV: 'production'
        run: |
          yarn run deploy:prod

    outputs: 
      published: ${{ steps.changesets.outputs.published }}

  update-dev-branch:

    runs-on: ubuntu-latest
    needs: release
    permissions:
      contents: write
    if: needs.release.outputs.published == 'true'
    
    steps:
      - uses: actions/checkout@v4
        with:
          ref: dev

      - name: Get current release version
        run: |
          version=$(curl --silent -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -H "X-GitHub-Api-Version: 2022-11-28" "https://api.github.com/repos/${{ github.repository }}/releases/latest"| jq -r .tag_name)

          if [ -z "$version" ]; then
            version="0.0.1"
          else
            version="${version#v}"
          fi

          echo "VERSION=${version}" >> $GITHUB_ENV

      - name: Delete changeset markdown file
        run: |
          find .changeset -type f -name "${VERSION}.md" -delete

      - name: Update package.json version
        run: |
          jq --arg version "$VERSION" '.version = $version' package.json > tmp.json && mv tmp.json package.json

      - name: Create commit and push to dev branch
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git add .
          git commit -m "chore: Update package.json version to $VERSION"
          git push origin dev
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  notification:

    runs-on: ubuntu-latest
    needs: release
    if: always()

    steps:
      - name: Send Slack notification
        if: needs.release.outputs.published == 'true'
        uses: slackapi/slack-github-action@v1.26.0
        with:
          channel-id: "์ฑ„๋„ ID"
          slack-message: "${{ github.repository }} ์ƒ์šฉ ๋ฐฐํฌ ${{ needs.release.result == 'success' &&  'โœ… ์„ฑ๊ณต' || 'โŒ ์‹คํŒจ'}}"
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

Monorepo

changeset์˜ ๊ฒฝ์šฐ ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ƒํ˜ธ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๋“ค์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ ๋ฐ ์‰ฝ๊ฒŒ ๋ฐฐํฌ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

yarn berry with monorepo

yarn beryy์˜ ๊ฒฝ์šฐ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ package.json์— workspaces๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "workspaces": [
    "packages/*"
  ]
}

์ดํ›„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— packages ํด๋” ์ƒ์„ฑ ํ›„ packages ํด๋” ๋‚ด ํ”„๋กœ์ ํŠธ๋“ค์„ ์ƒ์„ฑํ•˜๋ฉด packages ํ•˜์œ„ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ๋“ค์„ workspace๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ workspace์—์„œ ๋ช…๋ น์–ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด yarn workspace ํŒจํ‚ค์ง€์ด๋ฆ„ ํ˜•์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

chanageset with monorepo

changeset์€ ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฒ„์ „๊ณผ ๋ฐฐํฌ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜๋ฉฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” .chnageset ํด๋” ๋‚ด ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

---
"ํŒจํ‚ค์ง€ ์ด๋ฆ„": patch | minor | major
---

CHANGELOG.md์— ์ž‘์„ฑ๋  ๋‚ด์šฉ ์ž‘์„ฑ

๊ฐ ํŽ˜ํ‚ค์ง€์˜ package.json์— ์ž‘์„ฑ๋œ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฒ„์ „๊ณผ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

About

A way to manage your versioning and changelogs with changesets ๐Ÿฆ‹

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors