Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Actions에서 output 변수의 문법 변경

GitHub Actions에서 워크플로우를 작성할 때 각 스텝이나 잡 간의 결과를 공유해야 하는 경우가 있다. 코드에서 변수를 사용하듯이 앞의 단계에서 출력값을 저장해 두고 이후에 참고해야 하는 상황이다.

set-output, set-state 폐기 예정

기존에는 다음과 같은 문법을 사용했다.

jobs:
  test:
    name: 'test'
    runs-on: ubuntu-latest
    steps:
      - name: Set color
        id: random-color-generator
        run: echo "::set-output name=SELECTED_COLOR::green"
      - name: Get color
        run: echo "The selected color is ${{ steps.random-color-generator.outputs.SELECTED_COLOR }}"

echo "::set-output name={name}::{value}" 같은 문법으로 워크플로우 명령어를 실행하는 :: 문법을 사용했다. 이렇게 사용하면 위처럼 echo "::set-output name=SELECTED_COLOR::green"를 실행했을 때 SELECTED_COLOR라는 키에 green이라는 값이 들어가게 된다.

이후 참조하기 위해서는 step에 반드시 id를 지정해야 참조할 수 있다. 이후 이 값을 참조하기 위해서는 steps.<ID>.outputs.<NAME> 형태로(여기서는 steps.random-color-generator.outputs.SELECTED_COLOR) 참조할 수 있다. job간의 output과 참조를 위해서는 별도로 output을 지정해 주어야 한다.

이 방식에 문제는 없었지만 지난 10월 문법 변경에 대한 공지에 따르면 set-output 뿐 아니라 set-state 워크플로우 명령어를 제거하고 환경 파일의 사용으로 바꾼다고 한다. untrusted logged data라고 언급한 것으로 보아 정확한 내용은 모르지만 해당 명령어를 통해서 보안 취약점이 생긴게 아닐까 생각한다.

GitHub Actions 러너 버전 2.298.2부터 set-outputset-state를 사용하면 다음과 같은 경고를 보여준다.

이 명령어는 2023년 5월 31일까지만 사용할 수 있어서 6월 1일부터는 set-outputset-state를 사용하면 오류가 발생할 것이다. GitHub Actions의 실행 화면을 자주 보지 않으면(PR이나 배지로 결과만 볼 수도 있으니) 잘 모를 수도 있으니 경고를 확인하면 바로 조치를 취하는 것이 좋다.

환경 파일

이제 echo "::set-output name={name}::{value}" 대신echo "{name}={value}" >> $GITHUB_OUTPUT문법으로 바뀌게 된다.echo "::save-state name={name}::{value}"의 경우는 echo "{name}={value}" >> $GITHUB_STATE로 바뀌게 된다.

jobs:
  test:
    name: 'test'
    runs-on: ubuntu-latest
    steps:
      - name: Set color
        id: random-color-generator
        run: echo "SELECTED_COLOR=green" >> $GITHUB_OUTPUT
      - name: Get color
        run: echo "The selected color is ${{ steps.random-color-generator.outputs.SELECTED_COLOR }}"

output을 참조해서 사용하는 방식은 동일하기 때문에 output을 저장하는 문법만 변경하면 된다.

Windows에서의 환경 파일

GitHub Actions에서는 보통 Ubuntu를 사용하겠지만 Windows Server도 사용 가능하므로runs-on에서 windows-latest, windows-2022, windows-2019지정할 수 있다.

run을 사용할 때 셸이 실행되는데 문서에 따르면 shell을 따로 지정하지 않으면 Windows의 기본 셸은 PowerShell이다. 그래서 위 문법을 Windows에서 실행한다면 참조할 때 값이 null이 된다.

PowerShell은 bash와는 문법이 다르기 때문에 echo "{name}={value}" >> $env:GITHUB_OUTPUT와 같은 형태를 사용해야만 한다. 앞의 예제를 PowerShell 형태로 바꾸면 다음과 같다.

jobs:
  test:
    name: 'test'
    runs-on: ubuntu-latest
    steps:
      - name: Set color
        id: random-color-generator
        run: echo "SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT
      - name: Get color
        run: echo "The selected color is ${{ steps.random-color-generator.outputs.SELECTED_COLOR }}"

혹은 matrix를 써서 OS와 상관없이 같은 문법을 쓰고 싶다면 Windows에서 PowerShell이 쓰이지 않도록 다음과 같이 명시적으로 shell: bash를 지정하면 된다.

jobs:
  test:
    name: 'test'
    runs-on: ubuntu-latest
    steps:
      - name: Set color
        id: random-color-generator
        run: echo "SELECTED_COLOR=green" >> $GITHUB_OUTPUT
        shell: bash
      - name: Get color
        run: echo "The selected color is ${{ steps.random-color-generator.outputs.SELECTED_COLOR }}"
2023/01/30 02:49 2023/01/30 02:49