개발을 하면서 환경 변수를 설정할 일이 많을 것이다. 특히나 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
이 들어간다.
위에서는 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 }}
즉, 위처럼 사용하는 것은 안된다는 이야기이다. 이 두가지 경우를 제외하면, 어느 속성의 값이든 사용할 수 있다.