Skip to main content

GitHub Actions์— ๋Œ€ํ•œ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น

์›Œํฌํ”Œ๋กœ ๋˜๋Š” ์ž‘์—… ์ฝ”๋“œ์—์„œ ์…ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tool navigation

์›Œํฌํ”Œ๋กœ ๋ช…๋ น ์ •๋ณด

์ž‘์—…์€ ์‹คํ–‰๊ธฐ ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ , ์ถœ๋ ฅ ๋กœ๊ทธ์— ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์€ ํŠน์ • ํ˜•์‹์œผ๋กœ echo ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด ํŒŒ์ผ์— ์ž‘์„ฑํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์›Œํฌํ”Œ๋กœ ๋ช…๋ น์˜ ์˜ˆ์‹œ

Bash
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
PowerShell
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"

์ฐธ๊ณ  ํ•ญ๋ชฉ

์›Œํฌํ”Œ๋กœ ๋ช…๋ น ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋Œ€/์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ ํฐ๋”ฐ์˜ดํ‘œ(")๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ ํ‚คํŠธ ํ•จ์ˆ˜์— ์•ก์„ธ์Šค

์ž‘์—…/๋„๊ตฌ ํ‚คํŠธ์—๋Š” ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. :: ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ ๋‚ด์—์„œ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๋ช…๋ น์ด stdout์„ ํ†ตํ•ด ์‹คํ–‰๊ธฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ค๋ฅ˜ ์ฃผ์„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript
core.error('Missing semicolon', {file: 'app.js', startLine: 1})

์˜ˆ: ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ฃผ์„ ๋งŒ๋“ค๊ธฐ

์›Œํฌํ”Œ๋กœ์˜ error ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์˜ค๋ฅ˜ ์ฃผ์„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
      - name: Create annotation for build error
        run: echo "::error file=app.js,line=1::Missing semicolon"
YAML
      - name: Create annotation for build error
        run: Write-Output "::error file=app.js,line=1::Missing semicolon"

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ์›Œํฌํ”Œ๋กœ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ ํ‚คํŠธ ํ•จ์ˆ˜๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

๋„๊ตฌ ํ‚คํŠธ ํ•จ์ˆ˜๋™๋“ฑํ•œ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น
core.addPathGITHUB_PATH ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.debugdebug
core.noticenotice
core.errorerror
core.endGroupendgroup
core.exportVariableGITHUB_ENV ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.getInputINPUT_{NAME} ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.getStateSTATE_{NAME} ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.isDebugRUNNER_DEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.summaryGITHUB_STEP_SUMMARY ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.saveStateGITHUB_STATE ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.setCommandEchoecho
core.setFailed::error ๋ฐ exit 1์— ๋Œ€ํ•œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ์‚ฌ์šฉ
core.setOutputGITHUB_OUTPUT ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
core.setSecretadd-mask
core.startGroupgroup
core.warningwarning

๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€ ์„ค์ •

๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์—์„œ ์ด ๋ช…๋ น์œผ๋กœ ์„ค์ •๋œ ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ ค๋ฉด ์ด๋ฆ„์ด ACTIONS_STEP_DEBUG์ด๋ฉฐ ๊ฐ’์ดtrue์ธ ๋น„๋ฐ€์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋””๋ฒ„๊ทธ ๋กœ๊น… ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

Text
::debug::{message}

์˜ˆ์ œ: ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€ ์„ค์ •

Bash
echo "::debug::Set the Octocat variable"
PowerShell
Write-Output "::debug::Set the Octocat variable"

์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์„ค์ •

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

Text
::notice file={name},line={line},endLine={endLine},title={title}::{message}
๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ’Required๊ธฐ๋ณธ๊ฐ’
title์‚ฌ์šฉ์ž ์ง€์ • ์ œ๋ชฉ์•„๋‹ˆ์š”None
fileFilename์•„๋‹ˆ์š”.github
col์—ด ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”None
endColumn๋งˆ์ง€๋ง‰ ์—ด ๋ฒˆํ˜ธ์•„๋‹ˆ์š”None
lineํ–‰ ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”1
endLine๋งˆ์ง€๋ง‰ ์ค„ ๋ฒˆํ˜ธ์•„๋‹ˆ์š”1

์˜ˆ์ œ: ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์„ค์ •

Bash
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
PowerShell
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์„ค์ •

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

Text
::warning file={name},line={line},endLine={endLine},title={title}::{message}
๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ’Required๊ธฐ๋ณธ๊ฐ’
title์‚ฌ์šฉ์ž ์ง€์ • ์ œ๋ชฉ์•„๋‹ˆ์š”None
fileFilename์•„๋‹ˆ์š”.github
col์—ด ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”None
endColumn๋งˆ์ง€๋ง‰ ์—ด ๋ฒˆํ˜ธ์•„๋‹ˆ์š”None
lineํ–‰ ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”1
endLine๋งˆ์ง€๋ง‰ ์ค„ ๋ฒˆํ˜ธ์•„๋‹ˆ์š”1

์˜ˆ์ œ: ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์„ค์ •

Bash
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
PowerShell
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์„ค์ •

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

Text
::error file={name},line={line},endLine={endLine},title={title}::{message}
๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ’Required๊ธฐ๋ณธ๊ฐ’
title์‚ฌ์šฉ์ž ์ง€์ • ์ œ๋ชฉ์•„๋‹ˆ์š”None
fileFilename์•„๋‹ˆ์š”.github
col์—ด ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”None
endColumn๋งˆ์ง€๋ง‰ ์—ด ๋ฒˆํ˜ธ์•„๋‹ˆ์š”None
lineํ–‰ ๋ฒˆํ˜ธ, 1๋ถ€ํ„ฐ ์‹œ์ž‘์•„๋‹ˆ์š”1
endLine๋งˆ์ง€๋ง‰ ์ค„ ๋ฒˆํ˜ธ์•„๋‹ˆ์š”1

์˜ˆ์ œ: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์„ค์ •

Bash
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
PowerShell
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

๋กœ๊ทธ ์ค„ ๊ทธ๋ฃนํ™”

๋กœ๊ทธ์— ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ฃน์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฃน์„ ๋งŒ๋“ค๋ ค๋ฉด group ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ณ  title์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. group ๋ช…๋ น๊ณผ endgroup ๋ช…๋ น ๊ฐ„ ๋กœ๊ทธ์— ์ธ์‡„ํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์€ ๋กœ๊ทธ์˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ ๋‚ด์—์„œ ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค.

Text
::group::{title}
::endgroup::

์˜ˆ์ œ: ๋กœ๊ทธ ์„  ๊ทธ๋ฃนํ™”

YAML
jobs:
  bash-example:
    runs-on: ubuntu-latest
    steps:
      - name: Group of log lines
        run: |
            echo "::group::My title"
            echo "Inside group"
            echo "::endgroup::"
YAML
jobs:
  powershell-example:
    runs-on: windows-latest
    steps:
      - name: Group of log lines
        run: |
            Write-Output "::group::My title"
            Write-Output "Inside group"
            Write-Output "::endgroup::"

์›Œํฌํ”Œ๋กœ ๋‹จ๊ณ„์˜ ๋กœ๊ทธ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์ธ "My title"์€ ํ™•์žฅ๋œ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์ธ "๋‚ด๋ถ€ ๊ทธ๋ฃน"์€ ์•„๋ž˜์— ๋“ค์—ฌ์“ฐ๊ธฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์—์„œ ๊ฐ’ ๋งˆ์Šคํ‚น

Text
::add-mask::{value}

๊ฐ’์„ ๋งˆ์Šคํ‚นํ•˜๋ฉด ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚น๋˜์–ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ ๋‹จ์–ด๋Š” * ๋ฌธ์ž๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํฌ์˜ value์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ๋งˆ์Šคํ‚นํ•˜๋ฉด ๋น„๋ฐ€๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์‹คํ–‰๊ธฐ์—์„œ ํŽธ์ง‘๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์„ ๋งˆ์Šคํ‚นํ•œ ํ›„์—๋Š” ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ: ๋ฌธ์ž์—ด ๋งˆ์Šคํ‚น

๋กœ๊ทธ์—์„œ "Mona The Octocat"์„ ์ถœ๋ ฅํ•˜๋ฉด "***"๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Bash
echo "::add-mask::Mona The Octocat"
PowerShell
Write-Output "::add-mask::Mona The Octocat"

๊ฒฝ๊ณ 

๋น„๋ฐ€์„ ๋นŒ๋“œ ๋กœ๊ทธ์— ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— โ€˜add-maskโ€™์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋งˆ์Šคํ‚น

๋กœ๊ทธ์— MY_NAME ๋ณ€์ˆ˜ ๋˜๋Š” "Mona The Octocat" ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ "Mona The Octocat" ๋Œ€์‹  "***"๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

YAML
jobs:
  bash-example:
    runs-on: ubuntu-latest
    env:
      MY_NAME: "Mona The Octocat"
    steps:
      - name: bash-version
        run: echo "::add-mask::$MY_NAME"
YAML
jobs:
  powershell-example:
    runs-on: windows-latest
    env:
      MY_NAME: "Mona The Octocat"
    steps:
      - name: powershell-version
        run: Write-Output "::add-mask::$env:MY_NAME"

์˜ˆ: ๋‹จ์ผ ์ž‘์—… ๋‚ด์—์„œ ์ƒ์„ฑ๋œ ์ถœ๋ ฅ ๋งˆ์Šคํ‚น

ํ•œ ์ž‘์—…์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ ๋น„๋ฐ€์„ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋น„๋ฐ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ถœ๋ ฅํ•˜์ง€ ์•Š๊ณ ).
  2. add-mask(์œผ)๋กœ ๋งˆ์Šคํ‚นํ•ฉ๋‹ˆ๋‹ค.
  3. ์ž‘์—… ๋‚ด์˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ๋น„๋ฐ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ GITHUB_OUTPUT์„(๋ฅผ) ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
YAML
on: push
jobs:
  generate-a-secret-output:
    runs-on: ubuntu-latest
    steps:
      - id: sets-a-secret
        name: Generate, mask, and output a secret
        run: |
          the_secret=$((RANDOM))
          echo "::add-mask::$the_secret"
          echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT"
      - name: Use that secret output (protected by a mask)
        run: |
          echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
YAML
on: push
jobs:
  generate-a-secret-output:
    runs-on: ubuntu-latest
    steps:
      - id: sets-a-secret
        name: Generate, mask, and output a secret
        shell: pwsh
        run: |
          Set-Variable -Name TheSecret -Value (Get-Random)
          Write-Output "::add-mask::$TheSecret"
          "secret-number=$TheSecret" >> $env:GITHUB_OUTPUT
      - name: Use that secret output (protected by a mask)
        shell: pwsh
        run: |
          Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"

์˜ˆ: ์ž‘์—… ๋˜๋Š” ์›Œํฌํ”Œ๋กœ ๊ฐ„์— ๋น„๋ฐ€ ๋งˆ์Šคํ‚น ๋ฐ ์ „๋‹ฌ

์ž‘์—… ๋˜๋Š” ์›Œํฌํ”Œ๋กœ ๊ฐ„์— ๋งˆ์Šคํ‚น๋œ ๋น„๋ฐ€์„ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์ €์žฅ์†Œ์— ๋น„๋ฐ€์„ ์ €์žฅํ•œ ๋‹ค์Œ ํ›„์† ์ž‘์—… ๋˜๋Š” ์›Œํฌํ”Œ๋กœ์—์„œ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •

  1. ์›Œํฌํ”Œ๋กœ ์ค‘์— ์ƒ์„ฑํ•  ๋น„๋ฐ€์„ ์ €์žฅํ•˜๋„๋ก ๋น„๋ฐ€ ์ €์žฅ์†Œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: Vault.
  2. ํ•ด๋‹น ๋น„๋ฐ€ ์ €์žฅ์†Œ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋น„๋ฐ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ ์›Œํฌํ”Œ๋กœ์—์„œ ๋น„๋ฐ€ ์ด๋ฆ„์€ SECRET_STORE_CREDENTIALS์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions์—์„œ ๋น„๋ฐ€ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์›Œํฌํ”Œ๋กœ

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ด ์›Œํฌํ”Œ๋กœ๋Š” ๊ฐ€์ƒ์˜ ๋ช…๋ น store-secret ๋ฐ retrieve-secret๊ฐ€ ์žˆ๋Š” ๊ฐ€์ƒ์˜ ๋น„๋ฐ€ ์ €์žฅ์†Œ secret-store๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. some/secret-store@ 27b31702a0e7fc50959f5ad993c78deac1bdfc29์€(๋Š”) secret-store ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜๊ณ  credentials์„(๋ฅผ) ํฌํ•จํ•˜์—ฌ instance์™€(๊ณผ) ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์ƒ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

YAML
on: push

jobs:
  secret-generator:
    runs-on: ubuntu-latest
    outputs:
      handle: ${{ steps.generate-secret.outputs.handle }}
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: generate secret
      id: generate-secret
      shell: bash
      run: |
        GENERATED_SECRET=$((RANDOM))
        echo "::add-mask::$GENERATED_SECRET"
        SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET")
        echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT"
  secret-consumer:
    runs-on: macos-latest
    needs: secret-generator
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: use secret
      shell: bash
      run: |
        SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}"
        RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE")
        echo "::add-mask::$RETRIEVED_SECRET"
        echo "We retrieved our masked secret: $RETRIEVED_SECRET"
YAML
on: push

jobs:
  secret-generator:
    runs-on: ubuntu-latest
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: generate secret
      shell: pwsh
      run: |
        Set-Variable -Name Generated_Secret -Value (Get-Random)
        Write-Output "::add-mask::$Generated_Secret"
        Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret")
        "handle=$Secret_Handle" >> $env:GITHUB_OUTPUT
  secret-consumer:
    runs-on: macos-latest
    needs: secret-generator
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: use secret
      shell: pwsh
      run: |
        Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}"
        Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle")
        echo "::add-mask::$Retrieved_Secret"
        echo "We retrieved our masked secret: $Retrieved_Secret"

์›Œํฌํ”Œ๋กœ ๋ช…๋ น ์ค‘์ง€ ๋ฐ ์‹œ์ž‘

์›Œํฌํ”Œ๋กœ ๋ช…๋ น ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠน์ˆ˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์‹ค์ˆ˜๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์„์ด ์žˆ๋Š” ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊น…์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Text
::stop-commands::{endtoken}

์›Œํฌํ”Œ๋กœ ๋ช…๋ น์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๊ณ ์œ ํ•œ ํ† ํฐ์„ stop-commands์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ ๋ช…๋ น ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ ๋ช…๋ น์„ ์ค‘์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ† ํฐ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

์‚ฌ์šฉ ์ค‘์ธ ํ† ํฐ์ด ์ž„์˜๋กœ ์ƒ์„ฑ๋˜๊ณ  ๊ฐ ์‹คํ–‰์— ๋Œ€ํ•ด ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Text
::{endtoken}::

์˜ˆ์ œ: ์›Œํฌํ”Œ๋กœ ๋ช…๋ น ์ค‘์ง€ ๋ฐ ์‹œ์ž‘

YAML
jobs:
  workflow-command-job:
    runs-on: ubuntu-latest
    steps:
      - name: Disable workflow commands
        run: |
          echo '::warning:: This is a warning message, to demonstrate that commands are being processed.'
          stopMarker=$(uuidgen)
          echo "::stop-commands::$stopMarker"
          echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
          echo "::$stopMarker::"
          echo '::warning:: This is a warning again, because stop-commands has been turned off.'
YAML
jobs:
  workflow-command-job:
    runs-on: windows-latest
    steps:
      - name: Disable workflow commands
        run: |
          Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.'
          $stopMarker = New-Guid
          Write-Output "::stop-commands::$stopMarker"
          Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
          Write-Output "::$stopMarker::"
          Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'

์ด์ „ ๋ฐ ์‚ฌํ›„ ์ž‘์—…์— ๊ฐ’ ๋ณด๋‚ด๊ธฐ

GITHUB_STATE์— ์žˆ๋Š” ํŒŒ์ผ์— ์ž‘์„ฑํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์˜ pre: ๋˜๋Š” post: ์ž‘์—…๊ณผ ๊ณต์œ ํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด pre: ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํŒŒ์ผ ์œ„์น˜๋ฅผ main: ์ž‘์—…์— ์ „๋‹ฌํ•œ ๋‹ค์Œ, post: ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” main: ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํŒŒ์ผ ์œ„์น˜๋ฅผ post: ์ž‘์—…์— ์ „๋‹ฌํ•œ ๋‹ค์Œ, post: ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ pre: ๋˜๋Š” post: ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ์ €์žฅ๋œ ๊ฐ’์€ GITHUB_STATE์— ๊ธฐ๋ก๋œ ์ž‘์—…์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. post: ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

GITHUB_STATE ํŒŒ์ผ์€ ์ž‘์—… ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ฐ’์€ ์ ‘๋‘์‚ฌ๊ฐ€ STATE_์ธ ํ™˜๊ฒฝ ๊ฐ’์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ๋Š” JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GITHUB_STATE ํŒŒ์ผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ STATE_processID์ด๋ฉฐ ๊ฐ’์€ 12345์ด(๊ฐ€) ๋ฉ๋‹ˆ๋‹ค.

JavaScript
import * as fs from 'fs'
import * as os from 'os'

fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
  encoding: 'utf8'
})

๊ทธ๋Ÿฐ ๋‹ค์Œ main ์ž‘์—…์—์„œ ์‹คํ–‰๋˜๋Š” ์ •๋ฆฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋งŒ STATE_processID ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” main์—์„œ ์‹คํ–‰๋˜๋ฉฐ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ STATE_processID ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

JavaScript
console.log("The running PID from the main action is: " + process.env.STATE_processID);

ํ™˜๊ฒฝ ํŒŒ์ผ

์›Œํฌํ”Œ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์‹คํ–‰๊ธฐ๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋Š” GitHub์˜ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ๋ช…๋ น์˜ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด UTF-8 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ์ค„ ๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub ์ž‘์—…์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ • GitHub Actions ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ .env ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ˆ˜์ • ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

YAML
name: Example Workflow for Environment Files

on: push

jobs:
  set_and_use_env_vars:
    runs-on: ubuntu-latest
    steps:
      - name: Set environment variable
        run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV

      - name: Use environment variable
        run: |
          echo "The value of MY_ENV_VAR is $MY_ENV_VAR"

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๋นŒ๋“œ ํƒ€์ž„์Šคํƒฌํ”„, ์ปค๋ฐ‹ SHA ๋˜๋Š” ์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

YAML
steps:
  - name: Store build timestamp
    run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV

  - name: Deploy using stored timestamp
    run: echo "Deploying at $BUILD_TIME"

์ฐธ๊ณ  ํ•ญ๋ชฉ

PowerShell ๋ฒ„์ „ 5.1 ์ดํ•˜(shell: powershell)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UTF-8์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ UTF-8 ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

YAML
jobs:
  legacy-powershell-example:
    runs-on: windows-latest
    steps:
      - shell: powershell
        run: |
          "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

PowerShell Core ๋ฒ„์ „ 6 ์ด์ƒ(shell: pwsh)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ UTF-8์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

YAML
jobs:
  powershell-core-example:
    runs-on: windows-latest
    steps:
      - shell: pwsh
        run: |
          "mypath" >> $env:GITHUB_PATH

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

์ฐธ๊ณ  ํ•ญ๋ชฉ

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

Bash
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
  • PowerShell ๋ฒ„์ „ 6 ์ด์ƒ ์‚ฌ์šฉ:

    PowerShell
    "{environment_variable_name}={value}" >> $env:GITHUB_ENV
    
  • PowerShell ๋ฒ„์ „ 5.1 ์ดํ•˜ ์‚ฌ์šฉ:

    PowerShell
    "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
    

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ด๋ฅผ GITHUB_ENV ํ™˜๊ฒฝ ํŒŒ์ผ์— ์ž‘์„ฑํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ ์ž‘์—…์˜ ํ›„์† ๋‹จ๊ณ„์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋‹จ๊ณ„๋Š” ์ƒˆ ๊ฐ’์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ž‘์—…์˜ ๋ชจ๋“  ํ›„์† ๋‹จ๊ณ„์—๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

GITHUB_* ๋ฐ RUNNER_*(์œผ)๋กœ ๋ช…๋ช…๋œ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋ฎ์–ด์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ CI ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€์ˆ˜์— ์ •๋ณด ์ €์žฅ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ  ํ•ญ๋ชฉ

๋ณด์•ˆ ์ œํ•œ์œผ๋กœ ์ธํ•ด GITHUB_ENV๋Š” NODE_OPTIONS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ GITHUB_ENV์— ์“ฐ๋Š” ์˜ˆ์‹œ

YAML
steps:
  - name: Set the value
    id: step_one
    run: |
      echo "action_state=yellow" >> "$GITHUB_ENV"
  - name: Use the value
    id: step_two
    run: |
      printf '%s\n' "$action_state" # This will output 'yellow'
YAML
steps:
  - name: Set the value
    id: step_one
    run: |
      "action_state=yellow" >> $env:GITHUB_ENV
  - name: Use the value
    id: step_two
    run: |
      Write-Output "$env:action_state" # This will output 'yellow'

๋‹ค์ค‘ ์„  ๋ฌธ์ž์—ด

๋‹ค์ค‘ ์„  ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ตฌ๋ฌธ์— ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Text
{name}<<{delimiter}
{value}
{delimiter}

๊ฒฝ๊ณ 

์‚ฌ์šฉ ์ค‘์ธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ๊ฐ’ ๋‚ด์˜ ์ž์ฒด ์ค„์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์™„์ „ํžˆ ์ž„์˜์ธ ๊ฒฝ์šฐ ์ด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ํŒŒ์ผ์— ๊ฐ’์„ ์”๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด์˜ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ์—์„œ๋Š” EOF์„(๋ฅผ) ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉํ•˜๊ณ  JSON_RESPONSE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ curl ์‘๋‹ต์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

YAML
steps:
  - name: Set the value in bash
    id: step_one
    run: |
      {
        echo 'JSON_RESPONSE<<EOF'
        curl https://example.com
        echo EOF
      } >> "$GITHUB_ENV"
YAML
steps:
  - name: Set the value in pwsh
    id: step_one
    run: |
      $EOF = (New-Guid).Guid
      "JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV
      (Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV
      "$EOF" >> $env:GITHUB_ENV
    shell: pwsh

์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์„ค์ •

๋‹จ๊ณ„์˜ ์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ถœ๋ ฅ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ๋‹จ๊ณ„์—๋Š” ์ •์˜๋œ id์ด(๊ฐ€) ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด ์„น์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ธฐ์ˆ ๋กœ ์—ฌ๋Ÿฌ ์ค„ ์ถœ๋ ฅ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ค„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bash
echo "{name}={value}" >> "$GITHUB_OUTPUT"
PowerShell
"{name}=value" >> $env:GITHUB_OUTPUT

์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ์—์„œ๋Š” SELECTED_COLOR ์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚˜์ค‘์— ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

YAML
      - name: Set color
        id: color-selector
        run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT"
      - name: Get color
        env:
          SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
        run: echo "The selected color is $SELECTED_COLOR"

์ด ์˜ˆ์‹œ์—์„œ๋Š” SELECTED_COLOR ์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚˜์ค‘์— ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

YAML
      - name: Set color
        id: color-selector
        run: |
            "SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT
      - name: Get color
        env:
          SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
        run: Write-Output "The selected color is $env:SELECTED_COLOR"

์ž‘์—… ์š”์•ฝ ์ถ”๊ฐ€

Bash
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
PowerShell
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY

์›Œํฌํ”Œ๋กœ ์‹คํ–‰์˜ ์š”์•ฝ ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋˜๋„๋ก ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ • Markdown์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์š”์•ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ๊ณผ ๊ฐ™์€ ๊ณ ์œ ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›Œํฌํ”Œ๋กœ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ๋กœ ์ด๋™ํ•˜์—ฌ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ์ •๋ณด(์˜ˆ: ์‹คํŒจ)๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์š”์•ฝ์€ GitHub Flavored Markdown์„ ์ง€์›ํ•˜๋ฉฐ, ๋‹จ๊ณ„๋ณ„ Markdown ์ฝ˜ํ…์ธ ๋ฅผ GITHUB_STEP_SUMMARY ํ™˜๊ฒฝ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GITHUB_STEP_SUMMARY๋Š” ์ž‘์—…์˜ ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค. GITHUB_STEP_SUMMARY๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋‹จ๊ณ„๋ณ„ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ž‘์—…์˜ ๋ชจ๋“  ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์š”์•ฝ์ด ๋‹จ์ผ ์ž‘์—… ์š”์•ฝ์œผ๋กœ ๊ทธ๋ฃนํ™”๋˜๊ณ  ์›Œํฌํ”Œ๋กœ ์‹คํ–‰ ์š”์•ฝ ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์š”์•ฝ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—… ์š”์•ฝ์€ ์ž‘์—… ์™„๋ฃŒ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์š”์•ฝ ์ถ”๊ฐ€ํ•˜๊ธฐ ์˜ˆ์‹œ

Bash
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
PowerShell
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY

์›Œํฌํ”Œ๋กœ ์‹คํ–‰์˜ ์š”์•ฝ ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฐ์ƒท. "์˜ˆ์ œ ์š”์•ฝ" ์•„๋ž˜์—๋Š” "Hello world!" ๊ทธ๋ฆฌ๊ณ  ๋กœ์ผ“ ์ด๋ชจํ‹ฐ์ฝ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ค„ Markdown ์ฝ˜ํ…์ธ 

์—ฌ๋Ÿฌ ์ค„ Markdown ์ฝ˜ํ…์ธ ์˜ ๊ฒฝ์šฐ >>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ž‘์—…๋งˆ๋‹ค ์ค„ ๋ฐ”๊ฟˆ ๋ฌธ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ค„ Markdown ์ฝ˜ํ…์ธ ์˜ ์˜ˆ์‹œ

- name: Generate list using Markdown
  run: |
    echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
    echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
    echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
    echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
    echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
- name: Generate list using Markdown
  run: |
    "This is the lead in sentence for the list" >> $env:GITHUB_STEP_SUMMARY
    "" >> $env:GITHUB_STEP_SUMMARY # this is a blank line
    "- Lets add a bullet point" >> $env:GITHUB_STEP_SUMMARY
    "- Lets add a second bullet point" >> $env:GITHUB_STEP_SUMMARY
    "- How about a third one?" >> $env:GITHUB_STEP_SUMMARY

์ž‘์—… ์š”์•ฝ ๋ฎ์–ด์“ฐ๊ธฐ

ํ˜„์žฌ ๋‹จ๊ณ„์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์šฐ๋ ค๋ฉด >์„(๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ Bash์—์„œ ์ด์ „์— ์ถ”๊ฐ€ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜ PowerShell์˜ -Append์„(๋ฅผ) ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์š”์•ฝ ๋ฎ์–ด์“ฐ๊ธฐ ์˜ˆ์‹œ

- name: Overwrite Markdown
  run: |
    echo "Adding some Markdown content" >> $GITHUB_STEP_SUMMARY
    echo "There was an error, we need to clear the previous Markdown with some new content." > $GITHUB_STEP_SUMMARY
- name: Overwrite Markdown
  run: |
    "Adding some Markdown content" >> $env:GITHUB_STEP_SUMMARY
    "There was an error, we need to clear the previous Markdown with some new content." >> $env:GITHUB_STEP_SUMMARY

์ž‘์—… ์š”์•ฝ ์ œ๊ฑฐ

ํ˜„์žฌ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์š”์•ฝ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ ค๋ฉด GITHUB_STEP_SUMMARY๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์š”์•ฝ ์ œ๊ฑฐํ•˜๊ธฐ ์˜ˆ์‹œ

- name: Delete all summary content
  run: |
    echo "Adding Markdown content that we want to remove before the step ends" >> $GITHUB_STEP_SUMMARY
    rm $GITHUB_STEP_SUMMARY
- name: Delete all summary content
  run: |
    "Adding Markdown content that we want to remove before the step ends" >> $env:GITHUB_STEP_SUMMARY
    Remove-Item $env:GITHUB_STEP_SUMMARY

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

๋‹จ๊ณ„ ๊ฒฉ๋ฆฌ ๋ฐ ํ•œ๋„

์ž‘์—… ์š”์•ฝ์€ ๋‹จ๊ณ„ ๊ฐ„์— ๊ฒฉ๋ฆฌ๋˜๋ฉฐ ๊ฐ ๋‹จ๊ณ„๋Š” ์ตœ๋Œ€ 1MiB ํฌ๊ธฐ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋‹จ๊ณ„์˜ ์ž ์žฌ์ ์œผ๋กœ ์ž˜๋ชป๋œ ํ˜•์‹์˜ Markdown์ด ํ›„์† ๋‹จ๊ณ„์— ๋Œ€ํ•œ Markdown ๋ Œ๋”๋ง์„ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์—†๋„๋ก ๋‹จ๊ณ„ ๊ฐ„์— ๊ฒฉ๋ฆฌ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋‹จ๊ณ„์— 1MiB ์ด์ƒ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ๋‹จ๊ณ„์˜ ์—…๋กœ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์˜ค๋ฅ˜ ์ฃผ์„์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์š”์•ฝ ์—…๋กœ๋“œ ์˜ค๋ฅ˜๋Š” ๋‹จ๊ณ„ ๋˜๋Š” ์ž‘์—…์˜ ์ „์ฒด ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์—…๋ณ„๋กœ ๋‹จ๊ณ„์˜ ์ž‘์—… ์š”์•ฝ์ด ์ตœ๋Œ€ 20๊ฐœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ฒฝ๋กœ ์ถ”๊ฐ€

๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‹œ์Šคํ…œ PATH ๋ณ€์ˆ˜ ์•ž์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ˜„์žฌ ์ž‘์—…์˜ ๋ชจ๋“  ํ›„์† ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์€ ์—…๋ฐ์ดํŠธ๋œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘์—…์— ๋Œ€ํ•ด ํ˜„์žฌ ์ •์˜๋œ ๊ฒฝ๋กœ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹จ๊ณ„ ๋˜๋Š” ์ž‘์—…์—์„œ echo "$PATH"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ฒฝ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์˜ˆ์‹œ

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž $HOME/.local/bin ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ PATH์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

Bash
echo "$HOME/.local/bin" >> "$GITHUB_PATH"

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž $env:HOMEPATH/.local/bin ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ PATH์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

PowerShell
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append