์ต๊ทผ์ ์ ๋ TS๋ก GitHub Actions๋ฅผ ์์ฑํ๊ธฐ ์ํ ํด์ ๋ง๋ค์์ต๋๋ค. ๊ทธ ์ด๋ฆํ์ฌ GitHub Actions Justified Improvements, gaji ๋ผ๋ ํด์
๋๋ค. ์ ๋ ์ TS๋ก GitHub Actions๋ฅผ ์์ฑํ๊ฒ ๋์์ผ๋ฉฐ, ๊ธฐ์กด ํด๋ค๊ณผ ์ด๋ค ์ ์ด ๋ค๋ฅผ๊น์? ๊ฐ์ด ์์๋ณด์์ฃ .
๊ฐ์ง ๊ณต์ ๋ฌธ์
Toss Client DevOps Team์์์ ์ธํด ๊ทผ๋ฌด
์ฌํด 1์๋ถํฐ, ์ ๋ Toss Client DevOps Team ์์ ์ธํด ๊ทผ๋ฌด๋ฅผ ์์ํ์ต๋๋ค. Client DevOps Team์ ๊ฐ์ฅ ๋จ์ํ๊ฒ ํํํ์๋ฉด, ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๊ฐ ๋น ๋ฅด๊ณ ์์ ํ๊ฒ ๋ฐฐํฌํ ์ ์๋ ์ธํ๋ผ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ํ์
๋๋ค.
์ ๊ฐ ์ฃผ๋ก ์งํํ ์์
์ ๊ธฐ์กด ์ํฌํ๋ก์ฐ๋ฅผ GitHub Actions๋ก ์ ํํ๊ณ , ์๋ก์ด ๊ฒ์ฌ๋ฅผ ์ํ ์ปค์คํ
์ก์
์ ๋ง๋๋ ์ผ์ด์์ต๋๋ค.
์์ญ ๊ฐ์ ์ํฌํ๋ก์ฐ๋ฅผ ๋ค๋ฃจ๋ฉด์, ๋น ๋ฅด๊ณ ์์ ํ ๋ฐฐํฌ ์ธํ๋ผ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ํ์์ ์ ์ ๊ทธ ์ธํ๋ผ๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ฒด๋ ๋๋ฆฌ๊ณ ๋ถ์์ ํ๋ค๋ ๊ฑธ ์ฒด๊ฐํ์ต๋๋ค. ์คํ ํ๋๋ฅผ ํ์ธํ๋ ค๋ฉด ์ปค๋ฐ โ ํธ์ โ CI ์คํ โ ์คํจ ํ์ธ์ด๋ผ๋ ์ฌ์ดํด์ ๋ฐ๋ณตํด์ผ ํ๊ณ , ๋ก์ปฌ์์ ์ฌํํ ๋ฐฉ๋ฒ์ด ์์ผ๋ git ์ค๋ ฅ๋ง ๋์์ต๋๋ค.
์ธํด์ ํ๋ฉฐ ์๋ฆฌ์ก์ ์๊ฐ๋ค
์ด๋ฐ ์ธํด ๊ทผ๋ฌด๋ฅผ ํ๋ฉด์, ๋ช๊ฐ์ง ์๊ฐ์ด ์๋ฆฌ์ก์์ต๋๋ค. ์ฒ ํ๊น์ง๋ ์๋๊ณ , ๋จ์ํ ์๊ฐ ์ ๋์
๋๋ค.
-
์
์ถ๋ ฅ์ด ๋ช
ํํด์ผ ์ข์ ์ํํธ์จ์ด์
๋๋ค.
-
YAML์ ๋์์ ํํํ ์ธ์ด๊ฐ ์๋๋๋ค. Actions๋ ์
์ถ๋ ฅ๊ณผ ์ฌ์ด๋์ดํํธ๊ฐ ์๋ ๋์์
๋๋ค. ์ด๊ฑธ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํ ์ธ์ด์ธ YAML๋ก ํํํ๋ ๊ฒ ์์ฒด๊ฐ ์ธ์ด์ ์ฌ์ฉ์ฒ๊ฐ ์๋ชป๋ ๊ฒ์ด ์๋๊น์? ์ ์ธ์ ์ด์ง ์์ ๊ฑธ ์ ์ธ์ ์ผ๋ก ํํํ๋ ค๋ค ๋ณด๋, YAML ์์ ์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๋ ๊ธฐํ์ ์ธ ๊ตฌ์กฐ๊ฐ ๋์ด๋ฒ๋ ธ์ต๋๋ค.
-
์ด๋ ํ๊ฒฝ์์๋ ์ฌํ ๊ฐ๋ฅํด์ผ ์ข์ ๋๊ตฌ์
๋๋ค.
gaji๋ ์ด ์ค 1, 2๋ฒ์์ ์ถ๋ฐํ๊ณ , 3๋ฒ์ act ๊ฐ์ ๋๊ตฌ์ ์์ญ์
๋๋ค.
GitHub Actions์ 3๊ฐ์ง ๊ตฌ์กฐ์ ๋ฌธ์
์ ์๊ฐ์ ๊ฐ์ง๊ณ GitHub Actions๋ฅผ ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
- YAML์ ๋ฐ์ดํฐ ํํ ์ธ์ด์ง, ๋์์ ํํํ๊ธฐ์ ์ ํฉํ์ง ์์ต๋๋ค.
- ํ์
๊ฒ์ฌ๊ฐ ์์ต๋๋ค. ์ธ๋ถ ์ ์ฅ์์ ์์กดํ ์ผ์ด ๋ง์๋ฐ(
actions/checkout@v5์กฐ์ฐจ ์ธ๋ถ ์ ์ฅ์์
๋๋ค), ์ด๋ค์ด ์๊ตฌํ๋ ์
๋ ฅ์ ๋ํ ๊ฒ์ฆ์ด ์ ํ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ง์ ๋ฌธ์๋ฅผ ๋ณด๊ณ ์ผ์ผ์ด ํ์์ ๋ง๊ฒ ์
๋ ฅํด์ผ ํฉ๋๋ค.
- ๋ก์ปฌ์์ ์ฌํํ๊ธฐ๊ฐ ํ๋ญ๋๋ค.
์ด ์ธ ๊ฐ์ง๊ฐ ๊ฒฐํฉํด GitHub Actions๋ ์คํํ๊ธฐ ์ ๊น์ง ๊ฐ๋จํ ์คํ ํ๋๋ ๋ชป ์ฐพ๋ ํ๋ซํผ์ด ๋์์ต๋๋ค.
name: CI
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-versoin: '20' # ํค ์ด๋ฆ ์คํ! ๋ฐํ์๊น์ง ์ค๋ฅ ์์ โ
cache: 'npm'
- run: npm ci
- run: npm test
gaji๋ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ง์คํฉ๋๋ค.
๊ธฐ์กด ๋๊ตฌ๋ค๊ณผ์ ๋น๊ต
actionlint
์์งํ ๋งํ๋ฉด, gaji๋ฅผ ๋ง๋ค ๋น์์๋ actionlint์ ์กด์ฌ๋ฅผ ๋ชฐ๋์ต๋๋ค. ์ดํ์ ์๊ฒ ๋์๋๋ฐ, ํ๋ฅญํ ๋๊ตฌ์
๋๋ค. ${{ }} ํํ์์ ํ์
์ฒดํฌ, ์ก์
์
๋ ฅ ๊ฒ์ฆ, shellcheck ํตํฉ ๋ฑ YAML ์ํฌํ๋ก์ฐ์ ์ค๋ฅ๋ฅผ ์๋นํ ์ ์ก์์ค๋๋ค.
๋ค๋ง ๊ทผ๋ณธ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ๋ค๋ฆ
๋๋ค. actionlint๋ YAML์ ์ ์งํ๋ฉด์ ์ฌํ์ ์ค๋ฅ๋ฅผ ์ก๋ ๋ฆฐํฐ์ด๊ณ , gaji๋ YAML ์์ฒด๋ฅผ ๋ฒ์ด๋์ ์์ฑ ์์ ์ ์ค๋ฅ๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ ๊ทผ์
๋๋ค. ๋ฆฐํฐ๋ "์ค์๋ฅผ ์๋ ค์ฃผ๊ณ ", ํ์
์์คํ
์ "์ค์๋ฅผ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค." ๊ฐ๋ฐ ๊ฒฝํ ์ธก๋ฉด์์๋, actionlint๋ ๋ณ๋ CLI๋ฅผ ์คํํ๊ฑฐ๋ ์๋ํฐ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผ ํ์ง๋ง, gaji๋ TypeScript ๋ค์ดํฐ๋ธ ์๋์์ฑ๊ณผ ์ธ๋ผ์ธ ํ์
ํํธ๊ฐ ์๋ํฐ์์ ์ฆ์ ๋์ํฉ๋๋ค.
์ด ๋์ ๊ฐ์ด ์ฐ๋ฉด ๋์ฑ ์ข์ต๋๋ค. gaji๊ฐ ์์ฑํ YAML์ actionlint๋ก ๊ฒ์ฆํ๋ฉด ๊ฐ์ฅ ์ด์์ ์ธ ์กฐํฉ์ด ๋ฉ๋๋ค. gaji๊ฐ TypeScript ๋จ์์ ์ก์
์
๋ ฅ์ ํ์
์ ์ก๊ณ , actionlint๊ฐ ${{ }} ํํ์ ๊ฒ์ฆ ๊ฐ์ YAML ๋จ์ ๊ฒ์ฌ๋ฅผ ๋ณด์ํฉ๋๋ค.
emmanuelnk/github-actions-workflow-ts
github-actions-workflow-ts๋ TS๋ก GitHub Actions๋ฅผ ํ๊ธฐํ๋ค๋ ์์ด๋์ด์ ์ถ๋ฐ์ ์ด ๋ ํ๋ก์ ํธ์
๋๋ค. action.yml์์ ํ์
์ ์๋ ์์ฑํ๋ค๋ ์์ด๋์ด ์์ฒด๋ gaji์ ๋์ผํฉ๋๋ค. ๋ค๋ง ์ฝ๋์ ์ ์ฃผ์ฒด๊ฐ ๋ค๋ฆ
๋๋ค. github-actions-workflow-ts๋ ๋ฉ์ธํ
์ด๋๊ฐ trackedActions ๋ชฉ๋ก์ ๊ด๋ฆฌํ์ฌ npm ํจํค์ง๋ก ๋ฐฐํฌํ๋ ๋ฐฉ์์ด๊ณ , gaji๋ ์ฌ์ฉ์๊ฐ ์ฐธ์กฐํ๋ ๋ชจ๋ ์ก์
์ ๋ํด ์ฆ์ ๋ก์ปฌ์์ ํ์
์ ์์ฑํฉ๋๋ค.
github-actions-workflow-ts์ ์ฅ์ ์ ๋ช
ํํฉ๋๋ค. npm ํจํค์ง๋ฅผ ์ค์นํ๋ฉด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ฌ์ฉ์๊ฐ ๋ณ๋์ ์ฝ๋์ ์ ์คํํ ํ์๊ฐ ์์ต๋๋ค. step outputs์ ๋ํ ํ์
์์ ์ฑ๋ ์ง์ํฉ๋๋ค.
๋ฐ๋ฉด ๋จ์ ๋ ์์ต๋๋ค. ๋ฉ์ธํ
์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๋ชฉ๋ก์ ์๋ ์ก์
๋ง ํ์
์ด ์ง์๋๋ฏ๋ก, ์ปค์คํ
์ก์
์ด๋ GHE ๋ด๋ถ ์ก์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์ก์
์ด๋ ๋ฒ์ ์ถ๊ฐ๋ ๋ฉ์ธํ
์ด๋์ ์์กดํ๊ณ , ์ธ๋ถ JS ๋ฐํ์์ด ํ์ํฉ๋๋ค.
gaji์ ์ฅ์ ์ ์ฌ์ฉ์๊ฐ ์ฐธ์กฐํ๋ ์ด๋ค ์ก์
์ด๋ ์ฆ์ ํ์
์ ์์ฑํ๋ค๋ ์ ์
๋๋ค. ์ปค์คํ
์ก์
์ด๋ GHE ๋ด๋ถ ์ก์
์ด๋ ์๊ด์์ต๋๋ค. Rust ๋ฐ์ด๋๋ฆฌ๋ก ๋์ํ๋ฏ๋ก JS ๋ฐํ์๋ ๋ถํ์ํฉ๋๋ค. ๋ฐ๋ฉด ๋จ์ ์ผ๋ก๋ ์ฌ์ฉ์๊ฐ gaji dev๋ฅผ ์คํํด์ผ ํ์
์ด ์์ฑ๋๊ณ , ํ์
์ด ๋ก์ปฌ์์ ์์ฑ๋๋ฏ๋ก ํ๋ก์ ํธ๋ง๋ค ์ธํ
์ด ํ์ํ๋ค๋ ์ ์ด ์์ต๋๋ค.
์ ๋ GHE ํ๊ฒฝ์์ ์๋ง์ ์ปค์คํ
์ก์
์ ๋ค๋ค๋ ๊ฒฝํ ๋๋ฌธ์, gaji ์ชฝ์ ์ ๊ทผ์ด ํ์ํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
gaji์ ์ ๊ทผ๋ฒ
์ ์ด๋ ๊ฒ ๋ง๋ค์๋๊ฐ
์ Rust์ธ๊ฐ? ๋น ๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จ์ํ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ์ ์๋๋ฅผ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์๋๋๋ค. clippy, rustfmt ๋ฑ ์ฌ๋ฌ ๊ฒ์ฌ ๋๊ตฌ๊ฐ ๋ด์ฅ๋์ด ์์ด์ LLM์ ์ด์ฉํ ๊ฐ๋ฐ ์๋๋ฅผ ํฌ๊ฒ ์ค์ฌ์ฃผ์์ต๋๋ค. ๋๋ถ์ ์ธํด์ ํ๋ฉด์๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์์ต๋๋ค. ๋ํ oxc ๋ฑ Rust๋ก ์์ฑ๋ TypeScript ์ง์ ๋๊ตฌ๋ค์ด ์ด๋ฏธ ์ฑ์ํด ์์ด์, Rust์์ TypeScript๋ฅผ ๋ค๋ฃจ๋ ๊ฒ ๋ํ ํธํ์ต๋๋ค.
์ TypeScript์ธ๊ฐ? ์ฐ์ ์ ๊ฐ JS/TS ๊ฐ๋ฐ์์
๋๋ค. TypeScript์ ํ์
์์คํ
์ ๊ฐ๋ ฅํ๋ฉด์๋ ๋ณดํธ์ ์ด๋ผ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ ์ต์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ GitHub Actions์ YAML ๊ตฌ์กฐ๊ฐ ๋ณธ์ง์ ์ผ๋ก JSON๊ณผ ์ ์ฌํ๋ฏ๋ก, TS/JS์์ JSON-like ๊ฐ์ฒด๋ก ํํํ๊ธฐ๊ฐ ๋งค์ฐ ์์ฐ์ค๋ฝ์ต๋๋ค. ์ด๋ฅผ ๋จ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ชจ๋ gaji ์ํฌํ๋ก์ฐ ํ์ผ์ด ๊ทธ ์์ฒด๋ก ์ ํจํ TS ํ์ผ์ด๋ผ๋ ์ ์
๋๋ค. Deno์ฒ๋ผ TS๋ฅผ ๋ฐ๋ก ์คํํ ์ ์๋ ํ๊ฒฝ์์ gaji๋ก ์์ฑ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ๋ฉด, ํด๋น ์ํฌํ๋ก์ฐ๋ฅผ JSON์ผ๋ก ํํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์ action.yml ์๋ ์ฝ๋์ ์ธ๊ฐ? Client DevOps Team์์ ์ปค์คํ
์ก์
์ ์์ฑํ๋ ์ผ์ ํ๊ณ , ์ด๋ฏธ ์๋นํ ๋ง์ ์ปค์คํ
์ก์
์ด ์กด์ฌํ์ต๋๋ค. ์ด๋ค์ ๋ฌธ์๋ฅผ ์ผ์ผ์ด ๋ณด๋ฉฐ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ํ๋ค์๋ ๊ฒฝํ์ด ์ง์ ์ ์ธ ๋๊ธฐ์์ต๋๋ค. Hackers.pub์ ๊ธฐ์ฌํ๋ฉด์ GraphQL ์๋ ์ฝ๋์ ์ ๊ฐ๋
์ ์ ํ๊ณ , ๊ฐ์ ์ ๊ทผ์ GitHub Actions์ ์ ์ฉํ ์ ์๊ฒ ๋ค๊ณ ํ๋จํ์ต๋๋ค.
ํต์ฌ ๊ตฌ์กฐ
gaji ์ํฌํ๋ก์ฐ๋ getAction() โ Job โ Workflow โ .build()์ ํ๋ฆ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. gaji dev --watch๋ฅผ ์คํํ๋ฉด ์ ์ก์
์ฐธ์กฐ๋ฅผ ๊ฐ์งํ์ฌ ์๋์ผ๋ก ํ์
์ ์์ฑํฉ๋๋ค.
import { getAction, Job, Workflow } from "../generated/index.js";
const checkout = getAction("actions/checkout@v5");
const setupNode = getAction("actions/setup-node@v4");
const build = new Job("ubuntu-latest")
.addStep(checkout({}))
.addStep(setupNode({
with: {
"node-version": "20",
cache: "npm",
},
}))
.addStep({ run: "npm ci" })
.addStep({ run: "npm test" });
const workflow = new Workflow({
name: "CI",
on: { push: { branches: ["main"] } },
}).addJob("build", build);
workflow.build("ci");
์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋ชจ๋ ์ก์
์
๋ ฅ์ ๋ํ ์๋์์ฑ, ์ปดํ์ผ ์์ ํ์
์ฒดํฌ, action.yml ๋ฌธ์์ IDE ํํธ ํ์, ๊ธฐ๋ณธ๊ฐ ํ์๊ฐ ๋ชจ๋ ๋์ํฉ๋๋ค. CompositeJob์ผ๋ก ๊ณตํต ๋ก์ง์ ํด๋์ค๋ก ์ถ์ถํ๊ฑฐ๋, CallJob์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ๋ฅผ ํธ์ถํ๋ ๊ฒ๋ TS ์ฝ๋์์์ ์์ฐ์ค๋ฝ์ต๋๋ค.
์ค์ ์ฌ๋ก: gaji ์์ฒด์ ๋ฆด๋ฆฌ์ฆ CD
gaji๋ ๋ชจ๋ ci/cd๋ฅผ gaji๋ก ์์ฑํ๊ณ ์์ต๋๋ค. ๊ทธ์ค์์ ์ ์ผ ๋ณต์กํ release.ts๋ 4๊ฐ์ Job์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
build: 5๊ฐ ํ๋ซํผ(linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64) ํฌ๋ก์ค ๋น๋
upload-release-assets: GitHub Release์ ๋ฐ์ด๋๋ฆฌ์ ์ฒดํฌ์ฌ ์
๋ก๋
publish-npm: npm์ ํ๋ซํผ๋ณ ํจํค์ง ํผ๋ธ๋ฆฌ์
publish-crates: crates.io์ OIDC ๊ธฐ๋ฐ ํผ๋ธ๋ฆฌ์
์ด ์ํฌํ๋ก์ฐ๊ฐ YAML๋ก ์ปดํ์ผ๋๋ฉด ์ฝ 180์ค์ ํํํ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค. ์ฃผ์ ์์ด๋ Job ๊ฐ ๊ฒฝ๊ณ๋ ์์กด๊ด๊ณ๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ต์ต๋๋ค. TypeScript ๋ฒ์ ์์๋ build, uploadReleaseAssets, publishNpm, publishCrates๋ผ๋ ๋ณ์๋ช
๋ง์ผ๋ก ๊ตฌ์กฐ๊ฐ ์ฆ์ ํ์
๋ฉ๋๋ค. 6๊ฐ์ ์ธ๋ถ ์ก์
์ ํ์
์์ ํ๊ฒ ์ฌ์ฉํ๊ณ , ๋ณต์กํ ๋งคํธ๋ฆญ์ค ๋น๋์ OS๋ณ ๋ถ๊ธฐ๊ฐ ์ฝ๋ ๊ตฌ์กฐ ์์์ ๊ฐ๋
์ฑ ์๊ฒ ํํ๋ฉ๋๋ค.
gaji์ ํ๊ณ
gaji์๋ ์ฌ์ ํ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
๊ทผ๋ณธ์ ์ผ๋ก, ์ต์ข
์ฐ์ถ๋ฌผ์ด ์ฌ์ ํ YAML์
๋๋ค. GitHub Actions ํ๋ซํผ์ ์
๋ ฅ ํ์์ด YAML์ธ ์ด์, gaji๋ ๊ทธ ์ ์ฝ ์์ ๊ฐํ๋๋ค. gaji๋ ์ด ํ๋ซํผ ์์์์ ์ต์ ์ด์ง, ์ด์์ ์ธ ํด๋ต์ ์๋๋๋ค. ์๋ณธ action.yml์ inputs๊ฐ ๋ฌธ์์ด์ด๋ ์ซ์ ์ ๋๋ก๋ง ํํ๋๊ธฐ ๋๋ฌธ์, "npm" | "yarn" | "pnpm" ๊ฐ์ ์ธ๋ฐํ ๊ฐ ์์ค์ ํ์
๊น์ง๋ ์ ๊ณตํ ์ ์์ต๋๋ค. ${{ matrix.target.rust_target }} ๊ฐ์ GitHub Actions ํํ์๋ ์ฌ์ ํ ์์ ๋ฌธ์์ด์ด๋ผ ํ์
๊ฒ์ฆ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ธฐ์ ์ ์ธ ์ ํ๋ ์์ต๋๋ค. gaji dev๋ getAction()์ ์ ์ ๋ถ์ํด์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ง ์ง์ํ๊ณ , ๋ณ์๋ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌธ์์ด ๊ฐ ์์ฒด์ ์คํ(cache: "npn" vs cache: "npm")๋ ์ก์ ์ ์๊ณ ์.
์์ผ๋ก์ ๋ฐฉํฅ
gaji์ ํ์ฌ ์ํคํ
์ฒ๋ TypeScript โ Parse (oxc) โ Execute (QuickJS) โ YAML์
๋๋ค. ์ฝ๋์ ์ ๋ง๋ค๋ฉด์ ํ ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ป์๋๋ฐ, ํ๋ก ํธ์๋(์ฌ์ฉ์๊ฐ ์์ฑํ๋ ์ธ์ด)์ ๋ฐฑ์๋(YAML ์์ฑ)๋ฅผ ์ ๋ถ๋ฆฌํ๊ณ , ์ค๊ฐ ์ธ์ด๋ฅผ ์ ์ ์ํ๋ฉด TypeScript ์ธ์ ๋ค๋ฅธ ์ธ์ด๋ก๋ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋ค๋ ๊ฒ์
๋๋ค.
1.0์์๋ ํ๋ฌ๊ทธ์ธ ์์คํ
์ ๋์
ํด ๋ค๋ฅธ ์ธ์ด ์ง์์ ํ์ฅํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ๊ณํ์
๋๋ค. gaji์ ํต์ฌ ๊ฐ์น์ธ action.yml ์๋ ํ์
์์ฑ์ TypeScript์ ๊ตญํํ์ง ์๊ณ ํ์ฅํ๊ณ ์ถ์ต๋๋ค.
Special Thanks
gaji ๋ธ๋๋
์ด๋ฆ ์ ์์ ํด ์ฃผ์ kiwiyou ๋, RanolP ๋, ๋ก๊ณ ์ ์์ ํด ์ฃผ์ sij411 ๋๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
Client DevOps Team์๊ฒ๋ ๊ฐ์ฌํฉ๋๋ค. ์ด ํ์์ ๊ฒช์ ๊ฒฝํ์ด ์๋์์ผ๋ฉด YAML๊ณผ GitHub Actions์ ๋ํด ์๊ฐํด ๋ณด์ง ์์์ ๊ฒ๋๋ค.
emmanuelnk/github-actions-workflow-ts์๊ฒ๋ ๊ฐ์ฌ๋ฅผ ํํฉ๋๋ค. TS๋ก GitHub Actions๋ฅผ ํ๊ธฐํ๋ค๋ ์์ด๋์ด์ ๊ธฐ๋ณธ์ ์ธ TS API ์ค๊ณ๋ ์ฌ๊ธฐ์ ๊ฐ์ ธ์์ต๋๋ค.
Read more โ