표현식 (Expressions)

표현식 (Expressions)

워크플로를 "항상 똑같이"가 아니라 "상황에 따라 다르게" 돌리려면, 조건과 값을 계산할 도구가 필요해요. GitHub Actions는 ${{ }} 로 감싸는 표현식(Expression) 문법으로 이런 계산을 지원해요. 잡·스텝의 if: 조건, 환경변수 값, 매트릭스 변수 등 거의 모든 곳에서 표현식을 쓸 수 있어요.

상위 문서: GitHub Actions · 워크플로 문법

출처: https://docs.github.com/en/actions/reference/workflows-and-actions/expressions

리터럴(Literal)

표현식 안에는 boolean·null·number·string 값을 그대로 쓸 수 있어요. 문자열은 ${{ }} 안에서는 홑따옴표(')로 감싸고, 문자열 안의 홑따옴표는 하나 더 붙여('') 이스케이프해요. 큰따옴표(")로 감싸면 오류가 나요. ${{ }} 밖의 값(예: env:의 일반 값)은 표현식으로 취급되지 않아요.

env:
  myNull: ${{ null }}
  myBoolean: ${{ false }}
  myIntegerNumber: ${{ 711 }}
  myString: Mona the Octocat
  myStringInBraces: ${{ 'It''s open source!' }}

조건문에서는 거짓 같은 값(false, 0, -0, 빈 문자열, null)이 false로, 나머지는 true로 취급돼요.

연산자(Operator)

표현식에 쓸 수 있는 연산자는 다음과 같아요.

  • 논리 결합 ( ) · 인덱스 [ ] · 속성 접근 .
  • 부정 ! · 비교 < <= > >= == !=
  • 논리곱 && · 논리합 ||

문자열 비교는 대소문자를 무시해요. steps.<step_id>.outputs.<output_name>처럼 문자열로 평가되는 값은, 계산시키려면 특정 문법(${{ }})으로 감싸야 해요. 숫자 비교가 필요하면 fromJSON()으로 문자열을 숫자로 바꾸는 게 도움이 돼요.

함수(Function)

표현식에서 자주 쓰는 내장 함수가 있어요.

  • fromJSON() — 문자열을 그 값(부울·숫자·객체·배열)으로 바꿔요. 환경변수로 받은 문자열을 continue-on-errortimeout-minutes처럼 부울·숫자가 필요한 자리에 쓸 때 유용해요.
env:
  continue: true
  time: 3
jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - continue-on-error: ${{ fromJSON(env.continue) }}
        timeout-minutes: ${{ fromJSON(env.time) }}
        run: echo ...
  • hashFiles()GITHUB_WORKSPACE 기준 경로 패턴에 맞는 파일들의 SHA-256 해시를 계산해요. 의존성 파일(package-lock.json 등)이 바뀌면 해시도 바뀌어서, "의존성이 바뀔 때만 캐시를 갱신"하는 데 자주 쓰여요. 패턴에 매칭되는 파일이 없으면 빈 문자열을 돌려주요.
  • case() — 여러 조건을 순서대로 평가해 첫 번째로 참인 값에 대응하는 반환값을 내줘요. 브랜치별 설정값을 만들 때 편리해요.
env:
  MY_ENV_VAR: ${{ case(github.ref == 'refs/heads/main', 'production',
      github.ref == 'refs/heads/staging', 'staging',
      'development') }}

상태 확인 함수(Status check functions)

if: 조건에서 실패·성공·취소 상태를 확인하는 함수를 쓸 수 있어요. 아무 상태 함수도 없으면 기본값으로 success()가 적용돼요.

  • success() — 앞선 모든 스텝이 성공했을 때만 참.
  • always() — 취소되더라도 항상 실행되며 true를 돌려줘요. 로그 전송처럼 취소돼도 해야 할 작업에 유용해요.
  • cancelled() · failure() — 각각 취소·실패 상태를 확인해요.

주의: always()는 소스(checkout)처럼 치명적 실패가 일어나면 안 되는 작업에 남용하면 워크플로가 타임아웃까지 늘어질 수 있어요. "성공·실패와 무관하게 돌려야 한다"면 차라리 if: ${{ !cancelled() }}를 권장해요.

표현식은 잡·스텝·환경변수·매트릭스 등 전반에서 쓰이므로, 컨텍스트(어디서 값이 오는지)와 함께 이해하는 게 중요해요.

더 알아보기