Github Actions - env Context

DongHwan·2022년 3월 31일
0

Github Actions

목록 보기
3/7

개발을 하면서 환경 변수를 설정할 일이 많을 것이다. 특히나 Github Actions처럼 우리가 직접 명령을 수행하는게 아닌 경우, 보통 환경 변수를 통해 동작을 제어하는 경우가 많다. Github Actions에서는 이러한 환경 변수를 다루기 위해 env Context를 제공한다.

환경 변수 설정

env Context에 대해 설명하기 전에 Github Actions에서 환경 변수를 설정하는 방법부터 알아보자.

- name: 환경변수 설정
  run: HELLO=World!

- name: 환경변수 출력
  run: echo $HELLO

위 예시의 echo $HELLO에서 과연 World!가 출력될까? 정답은 그렇지 않다이다. Github Actions에서 각각의 스텝은 별도의 프로세스로 실행된다. 즉, 위처럼 다른 스텝에서 환경변수를 설정해도 프로세스가 다르기 때문에 다른 스텝에서 이를 사용할 수 없다.

- name: 환경변수 출력
  env:
    HELLO: World!
  run: echo $HELLO

그래서 Github Actions에서는 스텝 내에서 env를 설정하지 않고, env 속성을 통해 환경 변수를 설정해준다. 위 예시에서는 step 범위의 환경 변수를 설정해주었다. 이 경우, 해당 스텝에서만 HELLO=World!가 적용된다.

jobs:
  test-job:
    env:
      HELLO: World!
    steps:
      - run: echo $HELLO
  build-job:
    steps:
      - run: echo $HELLO

위 예시는 Job 범위의 환경 변수를 설정해주었으며, test-job이 그 대상이다. 이 경우 test-job의 스텝에서는 HELLO 환경 변수에 값이 들어간 상태이지만, build-job의 스텝들에서는 값이 들어가 있지않다.

env:
  HELLO: World!
  
jobs:
  test-job:
    steps:
      - run: echo $HELLO
  build-job:
    steps:
      - run: echo $HELLO

마지막 경우는 Workflow 범위의 환경 변수를 설정하는 것이다. 이 경우 해당 워크플로우 내의 모든 Job에서 이 환경 변수를 사용할 수 있다.

우선 순위

env:
  HELLO: workflow
  
jobs:
  test-job:
    env:
      HELLO: job
    steps:
      - name: 환경 변수 출력
        run: echo $HELLO
		env:
  		  HELLO: step

같은 이름의 환경 변수가 여러번 설정될 경우, 우선권을 가진 설정 값을 사용한다. 더 구체화된 범위의 환경 변수 설정일수록 우선권을 가진다. 즉, 워크플로우 전체에 걸리는 설정보다 Job 단위로 걸리는 설정이 우선권을 가지며, Step 단위로 걸리는 설정이 가장 높은 우선권을 가진다. 그렇기에 위의 예시에서 환경 변수 출력 Step에서는 HELLO 환경 변수에 step이 들어간다.

env Context

위에서는 echo $HELLO와 같은 방식으로 환경 변수를 사용했다. 그런데 만약 터미널 명령어로 사용하는 것이 아닌 Workflow 설정에서 환경 변수 값이 필요한 경우는 어떻게 해야할까? env Context에는 workflow 전체나 job, 혹은 step 단위로 설정된 환경 변수들이 모두 포함된다. 즉, env Context를 사용하여 Workflow 설정 자체에서 환경 변수를 사용할 수 있게 된다.

${{ env.<env_name> }}

ex)
${{ env.HELLO }}

env Context의 사용방법은 위와 같다. env_name은 가져올 환경 변수의 이름을 지정하면 된다.

env:
  docker_repo: gidskql6671/mydocker

jobs:
  docker:
    steps:
     - name: Build and push
       uses: docker/build-push-action@v2
       with:
         push: true
         tags: ${{ env.docker_repo }}

실제 사용 예제는 위와 같다. docker/build-push-action의 입력 값으로 환경 변수의 값을 사용했다.

env:
  HELLO: World!
  
jobs:
  test-job:
    steps:
      - run: echo ${{ env.HELLO }}
        name: ${{ env.HELLO }}

기존의 환경변수를 쓰던 것처럼 run 스텝 안에서도 사용할 수 있으며, 심지어는 name 속성에도 넣을 수 있는 것을 알 수 있다.

주의점

env Context는 위에서 보았듯이 다양한 곳에서 사용이 가능하다. 단, id 속성과 uses 속성에는 사용할 수 없다.

jobs:
  test-job:
    env:
      uses_val: actions/checkout@v2
      id_val: checkout_step
    steps:
      - uses: ${{ env.uses_val }}
        id: ${{ env.id_val }}

즉, 위처럼 사용하는 것은 안된다는 이야기이다. 이 두가지 경우를 제외하면, 어느 속성의 값이든 사용할 수 있다.

profile
날 어떻게 한줄로 소개해~

0개의 댓글