GitHub Actions용 워크플로 커맨드
GitHub Actions용 워크플로 커맨드
워크플로에서 셸 명령을 실행하거나 액션의 코드에서 워크플로 커맨드를 사용할 수 있어요. 러너와 소통해서 환경 변수나 출력값, 로그 메시지를 제어하려면 꼭 알아두세요.
출처: 문서
본문
워크플로에서 셸 명령을 실행하거나 액션의 코드에서 워크플로 커맨드를 사용할 수 있습니다.
워크플로 커맨드에 대해
액션은 러너 머신과 통신해서 환경 변수를 설정하고, 다른 액션이 사용하는 출력값을 설정하고, 출력 로그에 디버그 메시지를 추가하고, 기타 작업을 수행할 수 있습니다.
대부분의 워크플로 커맨드는 특정 형식의 echo 명령을 사용하고, 일부는 파일에 쓰는 방식으로 호출됩니다. 자세한 내용은 Environment files를 참고하세요.
워크플로 커맨드의 예시
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
[!NOTE] 워크플로 커맨드와 파라미터 이름은 대소문자를 구분하지 않습니다.
[!WARNING] Command Prompt를 사용한다면 워크플로 커맨드를 사용할 때 큰따옴표 문자(
")를 생략하세요.
워크플로 커맨드를 사용해서 툴킷 함수에 접근하기
actions/toolkit에는 워크플로 커맨드로 실행할 수 있는 여러 함수가 포함되어 있습니다. YAML 파일 안에서 워크플로 커맨드를 실행하려면 :: 구문을 사용하세요. 그러면 해당 커맨드가 stdout을 통해 러너로 전송됩니다.
예를 들어 오류 주석을 만들기 위해 코드를 사용하는 대신, 아래처럼 사용합니다:
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
예시: 오류 주석 만들기
워크플로에서 error 커맨드를 사용해서 같은 오류 주석을 만들 수 있습니다:
- name: Create annotation for build error
run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: Write-Output "::error file=app.js,line=1::Missing semicolon"
다음 표는 워크플로 안에서 사용할 수 있는 툴킷 함수를 보여줍니다:
| Toolkit function | Equivalent workflow command |
|---|---|
core.addPath |
환경 파일 GITHUB_PATH로 접근 |
core.debug |
debug |
core.notice |
notice |
core.error |
error |
core.endGroup |
endgroup |
core.exportVariable |
환경 파일 GITHUB_ENV로 접근 |
core.getInput |
환경 변수 INPUT_{NAME}로 접근 |
core.getState |
환경 변수 STATE_{NAME}로 접근 |
core.isDebug |
환경 변수 RUNNER_DEBUG로 접근 |
core.summary |
환경 파일 GITHUB_STEP_SUMMARY로 접근 |
core.saveState |
환경 파일 GITHUB_STATE로 접근 |
core.setCommandEcho |
echo |
core.setFailed |
::error와 exit 1의 바로가기로 사용 |
core.setOutput |
환경 파일 GITHUB_OUTPUT로 접근 |
core.setSecret |
add-mask |
core.startGroup |
group |
core.warning |
warning |
디버그 메시지 설정하기
로그에 디버그 메시지를 출력합니다. 이 커맨드가 설정한 디버그 메시지를 로그에서 보려면 값이 true인 ACTIONS_STEP_DEBUG라는 시크릿을 만들어야 합니다. 자세한 내용은 Enabling debug logging을 참고하세요.
::debug::{message}
예시: 디버그 메시지 설정하기
echo "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
공지(notice) 메시지 설정하기
공지 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.
::notice file={name},line={line},endLine={endLine},title={title}::{message}
| Parameter | Value | Required | Default |
|---|---|---|---|
title |
Custom title | No | None |
file |
Filename | No | .github |
col |
Column number, starting at 1 | No | None |
endColumn |
End column number | No | None |
line |
Line number, starting at 1 | No | 1 |
endLine |
End line number | No | 1 |
예시: 공지 메시지 설정하기
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
경고 메시지 설정하기
경고 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.
::warning file={name},line={line},endLine={endLine},title={title}::{message}
| Parameter | Value | Required | Default |
|---|---|---|---|
title |
Custom title | No | None |
file |
Filename | No | .github |
col |
Column number, starting at 1 | No | None |
endColumn |
End column number | No | None |
line |
Line number, starting at 1 | No | 1 |
endLine |
End line number | No | 1 |
예시: 경고 메시지 설정하기
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
오류 메시지 설정하기
오류 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.
::error file={name},line={line},endLine={endLine},title={title}::{message}
| Parameter | Value | Required | Default |
|---|---|---|---|
title |
Custom title | No | None |
file |
Filename | No | .github |
col |
Column number, starting at 1 | No | None |
endColumn |
End column number | No | None |
line |
Line number, starting at 1 | No | 1 |
endLine |
End line number | No | 1 |
예시: 오류 메시지 설정하기
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
로그 줄 그룹화하기
로그에 펼칠 수 있는 그룹을 만듭니다. 그룹을 만들려면 group 커맨드를 사용하고 title을 지정합니다. group과 endgroup 커맨드 사이에 로그로 출력하는 모든 것은 로그의 펼칠 수 있는 항목 안에 중첩됩니다.
::group::{title}
::endgroup::
예시: 로그 줄 그룹화하기
jobs:
bash-example:
runs-on: ubuntu-latest
steps:
- name: Group of log lines
run: |
echo "::group::My title"
echo "Inside group"
echo "::endgroup::"
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::"

로그에서 값 마스킹하기
::add-mask::{value}
값을 마스킹하면 문자열이나 변수가 로그에 출력되지 않도록 방지합니다. 공백으로 구분된 각 마스킹된 단어는 * 문자로 대체됩니다. 마스크의 value에는 환경 변수나 문자열을 사용할 수 있습니다. 이 작업은 잡마다 값당 한 번 수행해야 합니다. 값을 마스킹하면 시크릿으로 취급되어 러너에서 가려집니다. 예를 들어 값을 마스킹한 후에는 그 값을 출력으로 설정할 수 없습니다.
예시: 문자열 마스킹하기
로그에 "Mona The Octocat"을 출력하면 "***"이 표시됩니다.
echo "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
[!WARNING] 시크릿을 빌드 로그에 출력하거나 다른 워크플로 커맨드에서 사용하기 전에
add-mask로 시크릿을 등록해야 합니다.
예시: 환경 변수 마스킹하기
로그에 MY_NAME 변수나 "Mona The Octocat" 값을 출력하면 "Mona The Octocat" 대신 "***"이 표시됩니다.
jobs:
bash-example:
runs-on: ubuntu-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: bash-version
run: echo "::add-mask::$MY_NAME"
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"
예시: 단일 잡 내에서 생성된 출력 마스킹하기
시크릿을 다른 잡으로 전달할 필요가 없다면 다음을 할 수 있습니다:
- 시크릿을 생성합니다(출력하지 않고).
add-mask로 마스킹합니다.GITHUB_OUTPUT을 사용해서 시크릿을 잡 내의 다른 스텝에서 사용할 수 있게 합니다.
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 }}"
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 }}"
예시: 잡 또는 워크플로 간에 마스킹된 시크릿 전달하기
마스킹된 시크릿을 잡이나 워크플로 간에 전달하려면 시크릿을 저장소(store)에 저장한 다음 이후의 잡이나 워크플로에서 검색해야 합니다.
설정
- 워크플로 중에 생성할 시크릿을 저장할 시크릿 저장소를 설정합니다. 예를 들어 Vault.
- 해당 시크릿 저장소에 읽고 쓰기 위한 키를 생성합니다. 키를 저장소 시크릿으로 저장합니다. 다음 예시 워크플로에서 시크릿 이름은
SECRET_STORE_CREDENTIALS입니다. 자세한 내용은 Using secrets in GitHub Actions를 참고하세요.
워크플로
[!NOTE] 이 워크플로는 가상의 시크릿 저장소인
secret-store를 사용하며, 가상의 커맨드store-secret과retrieve-secret가 있습니다.some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29는secret-store애플리케이션을 설치하고credentials로instance에 연결하도록 구성하는 가상의 액션입니다.
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"
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"
워크플로 커맨드 중지 및 시작하기
모든 워크플로 커맨드의 처리를 중지합니다. 이 특수 커맨드를 사용하면 실수로 워크플로 커맨드를 실행하지 않고 무엇이든 로그로 기록할 수 있습니다. 예를 들어 주석이 있는 전체 스크립트를 출력하기 위해 로그 기록을 중지할 수 있습니다.
::stop-commands::{endtoken}
워크플로 커맨드 처리를 중지하려면 stop-commands에 고유한 토큰을 전달합니다. 워크플로 커맨드 처리를 재개하려면 워크플로 커맨드를 중지할 때 사용한 것과 같은 토큰을 전달합니다.
[!WARNING] 사용하는 토큰이 무작위로 생성되고 각 실행마다 고유한지 확인하세요.
::{endtoken}::
예시: 워크플로 커맨드 중지 및 시작하기
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.'
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.'
pre 및 post 액션에 값 보내기
GITHUB_STATE에 위치한 파일에 쓰면 워크플로의 pre:나 post: 액션과 공유할 환경 변수를 만들 수 있습니다. 예를 들어 pre: 액션으로 파일을 만들고, 파일 위치를 main: 액션에 전달한 다음, post: 액션으로 파일을 삭제할 수 있습니다. 또는 main: 액션으로 파일을 만들고 파일 위치를 post: 액션에 전달하고 post: 액션으로도 파일을 삭제할 수 있습니다.
pre:나 post: 액션이 여러 개라면 저장된 값은 GITHUB_STATE에 기록된 액션에서만 접근할 수 있습니다. post: 액션에 대한 자세한 내용은 Metadata syntax reference를 참고하세요.
GITHUB_STATE 파일은 액션 내에서만 사용할 수 있습니다. 저장된 값은 STATE_ 접두사가 있는 환경 값으로 저장됩니다.
이 예시는 JavaScript를 사용해서 GITHUB_STATE 파일에 씁니다. 결과 환경 변수는 값이 12345인 STATE_processID라는 이름이 됩니다:
import * as fs from 'fs'
import * as os from 'os'
fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
encoding: 'utf8'
})
그런 다음 STATE_processID 변수는 main 액션 아래에서 실행되는 정리 스크립트에서만 독점적으로 사용할 수 있습니다. 이 예시는 main에서 실행되며 JavaScript를 사용해서 STATE_processID 환경 변수에 할당된 값을 표시합니다:
console.log("The running PID from the main action is: " + process.env.STATE_processID);
환경 파일(Environment files)
워크플로 실행 중 러너는 특정 작업을 수행하는 데 사용할 수 있는 임시 파일을 생성합니다. 이 파일들의 경로는 GitHub의 기본 환경 변수를 사용해서 접근하고 편집할 수 있습니다. Variables reference를 참고하세요. 커맨드의 올바른 처리를 보장하려면 이 파일들에 쓸 때 UTF-8 인코딩을 사용해야 합니다. 같은 파일에 여러 커맨드를 줄바꿈으로 구분해서 쓸 수 있습니다.
GitHub Action에서 환경 변수를 사용하려면 특정 GitHub Actions 커맨드를 사용해서 .env 파일을 만들거나 수정합니다.
방법은 다음과 같습니다:
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, 아티팩트 이름 같은 메타데이터를 저장하는 데 사용하는 것입니다:
steps:
- name: Store build timestamp
run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV
- name: Deploy using stored timestamp
run: echo "Deploying at $BUILD_TIME"
[!NOTE] PowerShell 5.1 이하 버전(
shell: powershell)은 기본적으로 UTF-8을 사용하지 않으므로 UTF-8 인코딩을 지정해야 합니다. 예를 들어:jobs: legacy-powershell-example: runs-on: windows-latest steps: - shell: powershell run: | "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -AppendPowerShell Core 6 이상 버전(
shell: pwsh)은 기본적으로 UTF-8을 사용합니다. 예를 들어:jobs: powershell-core-example: runs-on: windows-latest steps: - shell: pwsh run: | "mypath" >> $env:GITHUB_PATH
환경 변수 설정하기
[!NOTE] 문제를 피하기 위해 운영 체제와 셸의 동작과 관계없이 환경 변수를 대소문자 구분으로 취급하는 것이 좋습니다.
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
-
PowerShell 6 이상 버전 사용:
"{environment_variable_name}={value}" >> $env:GITHUB_ENV -
PowerShell 5.1 이하 버전 사용:
"{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
환경 변수를 정의하거나 업데이트하고 GITHUB_ENV 환경 파일에 기록하면 워크플로 잡의 이후 스텝에서 사용할 수 있게 만들 수 있습니다. 환경 변수를 만들거나 업데이트하는 스텝은 새 값에 접근할 수 없지만, 잡의 이후 모든 스텝에서는 접근할 수 있습니다.
GITHUB_*와 RUNNER_*라는 기본 환경 변수의 값은 덮어쓸 수 없습니다. 현재 CI 변수의 값은 덮어쓸 수 있습니다. 그러나 이것이 항상 가능하리라는 보장은 없습니다. 기본 환경 변수에 대한 자세한 내용은 Variables reference를 참고하세요.
[!NOTE] 보안 제한으로 인해
GITHUB_ENV를 사용해서NODE_OPTIONS환경 변수를 설정할 수 없습니다.
GITHUB_ENV에 환경 변수 쓰기 예시
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'
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'
여러 줄 문자열
여러 줄 문자열의 경우 다음 구문으로 구분자(delimiter)를 사용할 수 있습니다.
{name}<<{delimiter}
{value}
{delimiter}
[!WARNING] 사용하는 구분자가 값 안에서 단독 줄로 발생하지 않도록 확인하세요. 값이 완전히 임의적이라면 이 형식을 사용하지 마세요. 대신 값을 파일에 쓰세요.
여러 줄 문자열의 예시
이 예시는 EOF를 구분자로 사용하고 JSON_RESPONSE 환경 변수를 curl 응답의 값으로 설정합니다.
steps:
- name: Set the value in bash
id: step_one
run: |
{
echo 'JSON_RESPONSE<<EOF'
curl https://example.com
echo EOF
} >> "$GITHUB_ENV"
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가 정의되어 있어야 합니다. Multiline strings 섹션에서 여러 줄 환경 변수를 정의하는 데 사용한 것과 같은 기법으로 여러 줄 출력 값을 설정할 수 있습니다.
echo "{name}={value}" >> "$GITHUB_OUTPUT"
"{name}=value" >> $env:GITHUB_OUTPUT
출력 파라미터 설정 예시
이 예시는 SELECTED_COLOR 출력 파라미터를 설정하고 나중에 검색하는 방법을 보여줍니다:
- 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 출력 파라미터를 설정하고 나중에 검색하는 방법을 보여줍니다:
- 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"
잡 요약 추가하기
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY
각 잡에 대한 사용자 지정 Markdown을 설정해서 워크플로 실행의 요약 페이지에 표시할 수 있습니다. 잡 요약을 사용해서 테스트 결과 요약 같은 고유한 콘텐츠를 표시하고 그룹화할 수 있으므로, 워크플로 실행 결과를 보는 사람이 실패 같은 실행과 관련된 중요한 정보를 보기 위해 로그로 들어갈 필요가 없습니다.
잡 요약은 GitHub flavored Markdown을 지원하며, 스텝의 Markdown 콘텐츠를 GITHUB_STEP_SUMMARY 환경 파일에 추가할 수 있습니다. GITHUB_STEP_SUMMARY는 잡의 각 스텝마다 고유합니다. GITHUB_STEP_SUMMARY가 참조하는 스텝별 파일에 대한 자세한 내용은 Environment files를 참고하세요.
잡이 끝나면 잡의 모든 스텝에 대한 요약이 단일 잡 요약으로 그룹화되어 워크플로 실행 요약 페이지에 표시됩니다. 여러 잡이 요약을 생성하면 잡 요약은 잡 완료 시간순으로 정렬됩니다.
잡 요약 추가 예시
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY

여러 줄 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 콘텐츠를 수정할 수 없습니다. 요약은 실수로 추가된 시크릿을 자동으로 마스킹합니다. 잡 요약에 삭제해야 할 민감한 정보가 있다면 워크플로 실행 전체를 삭제해서 모든 잡 요약을 제거할 수 있습니다. 자세한 내용은 Deleting a workflow run을 참고하세요.
스텝 격리 및 한도
잡 요약은 스텝 간에 격리되며 각 스텝은 최대 크기 1MiB로 제한됩니다. 단일 스텝의 잠재적으로 잘못된 Markdown이 이후 스텝의 Markdown 렌더링을 깨뜨릴 수 없도록 스텝 간에 격리가 강제됩니다. 스텝에 1MiB가 넘는 콘텐츠가 추가되면 스텝의 업로드가 실패하고 오류 주석이 생성됩니다. 잡 요약의 업로드 실패는 스텝이나 잡의 전반적인 상태에 영향을 주지 않습니다. 잡당 최대 20개의 스텝 잡 요약이 표시됩니다.
시스템 경로 추가하기
시스템 PATH 변수에 디렉터리를 앞에 추가하고 현재 잡의 이후 모든 액션에서 자동으로 사용할 수 있게 만듭니다. 현재 실행 중인 액션은 업데이트된 경로 변수에 접근할 수 없습니다. 잡에 대해 현재 정의된 경로를 보려면 스텝이나 액션에서 echo "$PATH"를 사용할 수 있습니다.
시스템 경로 추가 예시
이 예시는 사용자 $HOME/.local/bin 디렉터리를 PATH에 추가하는 방법을 보여줍니다:
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
이 예시는 사용자 $env:HOMEPATH/.local/bin 디렉터리를 PATH에 추가하는 방법을 보여줍니다:
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append
워크플로 아티팩트 선언하기
파일이나 OCI 참조를 워크플로 아티팩트로 선언하려면 GITHUB_ARTIFACTS 환경 파일에 줄마다 하나씩 작성합니다. 각 스텝은 새롭고 스텝별 파일에 씁니다. 경로는 해당 스텝에 고유합니다.
선언된 아티팩트에 대한 메타데이터는 잡의 모든 스텝에 걸쳐 수집되며 GITHUB_ARTIFACTS_LIST 파일을 통해 노출됩니다.
각 줄은 다음 형식 중 하나여야 합니다. 빈 줄과 #로 시작하는 줄은 무시됩니다.
- 파일 경로: 파일에 대한 상대 또는 절대 경로이며, 선택적으로
file://접두사가 붙습니다. 상대 경로는GITHUB_WORKSPACE에 대해 해석됩니다. 경로는 존재하는 일반 파일(디렉터리 아님)을 가리켜야 합니다. 러너는 파일의 기본 이름과 SHA-256 다이제스트를 기록합니다. - OCI 참조:
REFERENCE@ALGORITHM:HEX형식의 참조이며, 선택적으로oci://접두사가 붙습니다.REFERENCE는 이미지 이름(선택적 태그 포함)이고,ALGORITHM은sha256,sha384,sha512중 하나여야 합니다.HEX는 해당 알고리즘의 전체 소문자 다이제스트여야 합니다:sha256은 64개,sha384는 96개,sha512는 128개의 16진수 문자입니다.
한도:
- 스텝별 커맨드 파일은 1MiB로 제한됩니다.
- 잡은 모든 스텝에 걸쳐 최대 500개의 워크플로 아티팩트를 축적할 수 있습니다.
- 이름과 다이제스트가 동일한 아티팩트가 두 번 이상 선언되면 중복 제거됩니다. 충돌하는 선언(같은 이름, 다른 다이제스트)은 오류를 생성합니다.
echo "dist/my-binary" >> "$GITHUB_ARTIFACTS"
OCI 참조를 선언하려면:
echo "oci://ghcr.io/octocat/myapp:1.0.0@sha256:914b38d45a65e4263a179d9c2b09cc04dcbcaa8257fa85100cf42f9a3b408cfb" >> "$GITHUB_ARTIFACTS"
"dist/my-binary" >> $env:GITHUB_ARTIFACTS
OCI 참조를 선언하려면:
"oci://ghcr.io/octocat/myapp:1.0.0@sha256:914b38d45a65e4263a179d9c2b09cc04dcbcaa8257fa85100cf42f9a3b408cfb" >> $env:GITHUB_ARTIFACTS
워크플로 아티팩트 읽기
현재 잡의 이전 스텝에서 선언한 집계된 워크플로 아티팩트 메타데이터를 GITHUB_ARTIFACTS_LIST 환경 파일에서 읽습니다. 이 파일은 읽기 전용이며 각 스텝이 완료된 후 러너가 업데이트합니다. 다음 구조의 UTF-8로 인코딩된 JSON 객체를 포함합니다:
{
"version": 1,
"subjects": [
{
"name": "my-binary",
"digest": "sha256:abc123...",
"kind": "file"
},
{
"name": "ghcr.io/octocat/myapp:1.0.0",
"digest": "sha256:a1b2c3d4...",
"kind": "oci"
}
]
}
subjects 배열의 각 항목은 다음을 포함합니다:
name: 파일의 기본 이름 또는 OCI 참조 이름(다이제스트 제외).digest: 아티팩트의algorithm:hex다이제스트.kind:file또는oci중 하나.
아티팩트는 name별로 알파벳순으로 정렬됩니다.
cat "$GITHUB_ARTIFACTS_LIST"
Get-Content $env:GITHUB_ARTIFACTS_LIST