Skip to main content

JavaScript ์ž‘์—… ๋งŒ๋“ค๊ธฐ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ž‘์—… ๋„๊ตฌ ํ‚คํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JavaScript ์ž‘์—…์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์†Œ๊ฐœ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ํŒจํ‚ค์ง€๋œ JavaScript ์ž‘์—…์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ์ž‘์—…์„ ํŒจํ‚ค์ง€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ฐ€์ด๋“œ์˜ ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์ž‘์—… ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์€ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋ฉด ๋กœ๊ทธ์— "Hello World" ๋˜๋Š” "Hello [์ธ์‚ฌํ•  ์‚ฌ๋žŒ]"์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” GitHub Actions ๋„๊ตฌ ํ‚คํŠธ Node.js ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ actions/toolkit ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ณ ์œ ์˜ JavaScript ์ž‘์—…์„ ๋นŒ๋“œํ•˜๊ณ  ์›Œํฌํ”Œ๋กœ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

JavaScript ์ž‘์—…์ด ๋ชจ๋“  GitHub ํ˜ธ์ŠคํŠธ๋œ ์‹คํ–‰๊ธฐ(Ubuntu, Windows ๋ฐ macOS)์™€ ํ˜ธํ™˜๋˜๋„๋ก ํ•˜๋ ค๋ฉด ์ž‘์„ฑํ•˜๋Š” ํŒจํ‚ค์ง€๋œ JavaScript ์ฝ”๋“œ๋Š” ์ˆœ์ˆ˜ JavaScript์ด๊ณ  ๋‹ค๋ฅธ ์ด์ง„ ํŒŒ์ผ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. JavaScript ์ž‘์—…์€ ์‹คํ–‰๊ธฐ์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋ฉฐ ์‹คํ–‰๊ธฐ ์ด๋ฏธ์ง€์— ์ด๋ฏธ ์žˆ๋Š” ์ด์ง„ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

์›Œํฌํ”Œ๋กœ์™€ ์ž‘์—…์„ ๋งŒ๋“ค ๋•Œ๋Š” ์ฝ”๋“œ๊ฐ€ ๊ณต๊ฒฉ์ž์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž…๋ ฅ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ปจํ…์ŠคํŠธ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ž์‹ ์˜ ์•…์„ฑ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž…๋ ฅ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณด์•ˆ ์‚ฌ์šฉ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•„์ˆ˜ ์กฐ๊ฑด

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— Node.js๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํผ๋ธ”๋ฆญ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. npm์„ ํฌํ•จํ•˜๋Š” Node.js 20.x๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    https://nodejs.org/en/download/

  2. GitHub์— ์ƒˆ ํผ๋ธ”๋ฆญ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  "hello-world-javascript-action"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

  3. ์ปดํ“จํ„ฐ์— ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ณต์ œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

  4. ํ„ฐ๋ฏธ๋„์—์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    Shell
    cd hello-world-javascript-action
    
  5. ํ„ฐ๋ฏธ๋„์—์„œ npm์œผ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ package.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    Shell
    npm init -y
    

์ž‘์—… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ hello-world-javascript-action ๋””๋ ‰ํ„ฐ๋ฆฌ์— action.yml์ด๋ผ๋Š” ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
name: Hello World
description: Greet someone and record the time

inputs:
  who-to-greet: # id of input
    description: Who to greet
    required: true
    default: World

outputs:
  time: # id of output
    description: The time we greeted you

runs:
  using: node20
  main: dist/index.js

์ด ํŒŒ์ผ์€ who-to-greet ์ž…๋ ฅ ๋ฐ time ์ถœ๋ ฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž‘์—… ์‹คํ–‰๊ธฐ์—์„œ JavaScript ์ž‘์—… ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์ž‘์—… ๋„๊ตฌ ํ‚คํŠธ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€

์ž‘์—… ๋„๊ตฌ ํ‚คํŠธ๋Š” ๋” ์ผ๊ด€์ ์œผ๋กœ JavaScript ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” Node.js ํŒจํ‚ค์ง€์˜ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.

๋„๊ตฌ ํ‚คํŠธ @actions/core ํŒจํ‚ค์ง€๋Š” ์›Œํฌํ”Œ๋กœ ๋ช…๋ น, ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๋ณ€์ˆ˜, ์ข…๋ฃŒ ์ƒํƒœ, ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ํ‚คํŠธ๋Š” ๋˜ํ•œ ์ธ์ฆ๋œ Octokit REST ํด๋ผ์ด์–ธํŠธ์™€ GitHub Actions ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” @actions/github ํŒจํ‚ค์ง€๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ํ‚คํŠธ๋Š” core ๋ฐ github ํŒจํ‚ค์ง€ ์ด์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ actions/toolkit ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ„ฐ๋ฏธ๋„์—์„œ ์ž‘์—… ๋„๊ตฌ ํ‚คํŠธ core ๋ฐ github ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Shell
npm install @actions/core @actions/github

์ด์ œ ์„ค์น˜๋œ ๋ชจ๋“  ์ข…์†์„ฑ๊ณผ ์ข…์†์„ฑ์˜ ๋ฒ„์ „์„ ์ถ”์ ํ•˜๋Š” node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ package-lock.json ํŒŒ์ผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ฝ”๋“œ ์ž‘์„ฑ

์ด ์ž‘์—…์€ ๋„๊ตฌ ํ‚คํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ํ•„์š”ํ•œ who-to-greet ์ž…๋ ฅ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋กœ๊ทธ์˜ ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€์— "Hello [who-to-greet]"๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚˜์ค‘์— ์ž‘์—…์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ๋ ฅ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions๋Š” ์›นํ›„ํฌ ์ด๋ฒคํŠธ, Git ReFS, ์›Œํฌํ”Œ๋กœ, ์ž‘์—…, ์›Œํฌํ”Œ๋กœ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด github ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•  ์ž‘์—…์€ ์›นํ›„ํฌ ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋กœ๊ทธ์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ src/index.js๋ผ๋Š” ์ƒˆ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

JavaScript
import * as core from "@actions/core";
import * as github from "@actions/github";

try {
  // `who-to-greet` input defined in action metadata file
  const nameToGreet = core.getInput("who-to-greet");
  core.info(`Hello ${nameToGreet}!`);

  // Get the current time and set it as an output variable
  const time = new Date().toTimeString();
  core.setOutput("time", time);

  // Get the JSON webhook payload for the event that triggered the workflow
  const payload = JSON.stringify(github.context.payload, undefined, 2);
  core.info(`The event payload: ${payload}`);
} catch (error) {
  core.setFailed(error.message);
}

์œ„ index.js ์˜ˆ์ œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ throw๋˜๋ฉด core.setFailed(error.message);๋Š” ์ž‘์—… ๋„๊ตฌ ํ‚คํŠธ @actions/core ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‹คํŒจํ•œ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ž‘์—…์˜ ์ข…๋ฃŒ ์ฝ”๋“œ ์„ค์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ถ”๊ฐ€ ์ •๋ณด ๋งŒ๋“ค๊ธฐ

์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ •๋ณด ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ž‘์—…์„ ๊ณต๊ฐœ์ ์œผ๋กœ ๊ณต์œ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ์œ ์šฉํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ๋˜๋Š” ํŒ€์—๊ฒŒ ์ž‘์—… ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

hello-world-javascript-action ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ง€์ •ํ•˜๋Š” README.md ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ์ž‘์—…์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์„ ํƒ์  ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€์ž…๋‹ˆ๋‹ค.
  • ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.
Markdown
# Hello world JavaScript action

This action prints "Hello World" or "Hello" + the name of a person to greet to the log.

## Inputs

### `who-to-greet`

**Required** The name of the person to greet. Default `"World"`.

## Outputs

### `time`

The time we greeted you.

## Example usage

```yaml
uses: actions/hello-world-javascript-action@e76147da8e5c81eaf017dede5645551d4b94427b
with:
  who-to-greet: Mona the Octocat
```

์ž‘์—…์„ ์ปค๋ฐ‹, ํƒœ๊ทธ ์ง€์ •, ํ‘ธ์‹œ

GitHub๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘์— ์›Œํฌํ”Œ๋กœ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ ์ž‘์—…์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ „์ฒด ์ฝ”๋“œ ํŒจํ‚ค์ง€๋กœ ์‹คํ–‰ํ•œ ํ›„ run๊ณผ ๊ฐ™์€ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๊ธฐ ๋จธ์‹ ๊ณผ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์ข…์†์„ฑ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ์ž‘์—…์—์„œ๋Š” @actions/core ๋ฐ @actions/github ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒดํฌ ์ธํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, rollup.js ๋˜๋Š” @vercel/ncc ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์™€ ์ข…์†์„ฑ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ„ฐ๋ฏธ๋„์—์„œ ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ rollup ๋ฐ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์„ธ์š”.

    npm install --save-dev rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve

  2. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rollup.config.js๋ผ๋Š” ์ƒˆ ํŒŒ์ผ์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    JavaScript
    import commonjs from "@rollup/plugin-commonjs";
    import { nodeResolve } from "@rollup/plugin-node-resolve";
    
    const config = {
      input: "src/index.js",
      output: {
        esModule: true,
        file: "dist/index.js",
        format: "es",
        sourcemap: true,
      },
      plugins: [commonjs(), nodeResolve({ preferBuiltins: true })],
    };
    
    export default config;
    
  3. dist/index.js ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

    rollup --config rollup.config.js

    ์ฝ”๋“œ์™€ ์ข…์†์„ฑ์ด ํฌํ•จ๋œ ์ƒˆ dist/index.js ํŒŒ์ผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  4. ํ„ฐ๋ฏธ๋„์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

    Shell
    git add src/index.js dist/index.js rollup.config.js package.json package-lock.json README.md action.yml
    git commit -m "Initial commit of my first action"
    git tag -a -m "My first action release" v1.1
    git push --follow-tags
    

์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  ํ‘ธ์‹œํ•  ๋•Œ, ์—…๋ฐ์ดํŠธ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

hello-world-javascript-action/
โ”œโ”€โ”€ action.yml
โ”œโ”€โ”€ dist/
โ”‚   โ””โ”€โ”€ index.js
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ package-lock.json
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ rollup.config.js
โ””โ”€โ”€ src/
    โ””โ”€โ”€ index.js

์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘์—… ํ…Œ์ŠคํŠธ

์ด์ œ ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘์—…์„ ํ…Œ์ŠคํŠธํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํผ๋ธ”๋ฆญ ์ž‘์—…์€ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์›Œํฌํ”Œ๋กœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ํ”„๋ผ์ด๋น— ๋˜๋Š” ๋‚ด๋ถ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์€ ๋™์ผํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์—์„œ๋งŒ ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋˜๋Š” ๋™์ผํ•œ ์กฐ์ง ๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์—์„œ ์†Œ์œ ํ•œ ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ GitHub Actions ์„ค์ • ๊ด€๋ฆฌ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

ํผ๋ธ”๋ฆญ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ

์ด ์˜ˆ์ œ์—์„œ๋Š” ์™ธ๋ถ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์—์„œ ์ƒˆ ํผ๋ธ”๋ฆญ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‹ค์Œ YAML์„ .github/workflows/main.yml์˜ ์ƒˆ ํŒŒ์ผ์— ๋ณต์‚ฌํ•˜๊ณ  ์œ„์—์„œ ๋งŒ๋“  ํผ๋ธ”๋ฆญ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b ์ค„์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. who-to-greet ์ž…๋ ฅ์„ ์ž์‹ ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
on:
  push:
    branches:
      - main

jobs:
  hello_world_job:
    name: A job to say hello
    runs-on: ubuntu-latest

    steps:
      - name: Hello world action step
        id: hello
        uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
        with:
          who-to-greet: Mona the Octocat

      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

์ด ์›Œํฌํ”Œ๋กœ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ์‹คํ–‰๊ธฐ๋Š” ํผ๋ธ”๋ฆญ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ hello-world-javascript-action ์ž‘์—…์„ ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ผ์ด๋น— ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ

์ž‘์—… ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ .github/workflows/main.yml ํŒŒ์ผ์— ์›Œํฌํ”Œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. who-to-greet ์ž…๋ ฅ์„ ์ž์‹ ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
on:
  push:
    branches:
      - main

jobs:
  hello_world_job:
    name: A job to say hello
    runs-on: ubuntu-latest

    steps:
      # To use this repository's private action,
      # you must check out the repository
      - name: Checkout
        uses: actions/checkout@v4

      - name: Hello world action step
        uses: ./ # Uses an action in the root directory
        id: hello
        with:
          who-to-greet: Mona the Octocat

      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ž‘์—… ํƒญ์„ ํด๋ฆญํ•˜๊ณ  ์ตœ์‹  ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์•„๋ž˜ ๋˜๋Š” ์‹œ๊ฐํ™” ๊ทธ๋ž˜ํ”„์—์„œ ์ธ์‚ฌํ•  ์ž‘์—…์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Hello world ๋™์ž‘ ๋‹จ๊ณ„ ํด๋ฆญํ•˜๋ฉด โ€œHello Mona Octocatโ€ ๋˜๋Š” who-to-greet ์ž…๋ ฅ์— ์‚ฌ์šฉํ•œ ์ด๋ฆ„์ด ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.. ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ณด๋ ค๋ฉด ์ถœ๋ ฅ ์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

JavaScript ์ž‘์—…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

GitHub์€(๋Š”) JavaScript ๋ฐ TypeScript ์ž‘์—…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ, Linting ๋ฐ ๊ธฐํƒ€ ๊ถŒ์žฅ ์‚ฌ๋ก€๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒˆ ์ž‘์—… ๋งŒ๋“ค๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub.com์˜ JavaScript ์ž‘์—… ์˜ˆ์ œ

GitHub.com์—์„œ JavaScript ์ž‘์—…์˜ ๋งŽ์€ ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.