본문 바로가기
source-code/etc

[Github Actions] Workflows에서 복수개 env variables 사용하기

by mattew4483 2024. 3. 25.
728x90
반응형

배경

github actions를 통해 사내 npm 패키지를 자동으로 빌드-배포-릴리즈 하고자 했습니다.

 

production branch에 버전과 관련된 PR이 병합되면

패키지 버전 변경 → build  publish → release 를 수행하는 workflow를 작성했는데...

여기서 env 파일, 즉 환경 변수 관련 문제와 마주했습니다.

export class DataFetcher {
  private BASE_URL = process.env.BASE_URL
}

다음과 같이 환경 변수를 참조하고 있으며

 

// package.json
{
    "scripts": {
        "build:prod": "DOTENV_CONFIG_PATH=.env.production node -r dotenv/config scripts/esbuild.config.js",
        "publish": "yarn build:prod && yarn publish"
    }
}

dotenv를 사용해 build 시점에 .env.production (build flag에 맞는 환경변수 파일을 사용) 파일을 설정하고 있습니다.

 

Github Actions에서 env 다루기

기본적으로 env 파일은 원격 저장소에 업로드하지 않습니다.

따라서 github actions를 통해 패키지를 build할 때, 해당 env 파일에서 환경 변수를 조회할 방법은... 존재하지 않습니다!

 

대신 github에서는 해당 레포지토리의 action들에서 사용할

secrets (민감한 정보에 사용, 암호화됩니다)와 variables (일반 텍스트로 표시됩니다)를 설정해

action 실행 시 해당 데이터에 접근할 수 있도록 합니다.

 

즉 위 예시의 경우

 - name: Create Env
        run: |
          echo "BASE_URL=$BASE_URL" >> .env.production
      	env:
          BASE_URL: ${{secrets.BASE_URL}}

 

다음과 같이 env 파일을 생성하고, github secrets에 저장된 값을 통해 환경변수를 지정할 수 있는 것이죠.

 

문제 상황

그런데 이 경우, 환경 변수가 추가될 때마다 매번 코드 수정이 발생해야한다는 문제점이 존재합니다!

 - name: Create Env
        run: |
          // 환경 변수 추가!
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
          echo "BASE_URL=$BASE_URL" >> .env.production
	
      	env:
          BASE_URL: ${{secrets.BASE_URL}}

 

하나의 변경사항이 발생(환경변수가 추가)할 때마다

1) workflow내 추가

2) github secrets내 추가

두 가지 변경 사항이 발생하게 되는데, 이는 바람직하다고 볼 수 없으며

몇 개가 될지도 모르는 값들을 매번 적기도 귀찮습니다.

 

해결 방안

그렇다면 이를 어떻게 해결하면 좋을까요?

 

github action 실행 시 환경 변수들을 조회해야하므로 → 2) github secrets내 추가 는 불가피한 영역이라 볼 수 있습니다.

그렇다면 1) workflow에 매번 추가된 값들을 작성하는 작업을 생략해야 하는데...

 

그런데 가만히 생각해 보면,

해당 작업은 결국 package.json에서 build시 .env.production 파일을 참조하기 위해 실행되고 있습니다.

 

다시 말하자면 값을 하나하나 추가하던, 한 번에 문자열 형태로 파일을 만들던

결국 .env 파일만 생성된다면 → build시 해당 파일에 존재하는 환경변수에 접근할 수 있겠죠!

 

 

즉 각 환경 변수를 secret에 저장해 하나하나 접근하는 것이 아니라

로컬 환경에 저장된 환경변수 파일을 통째로 가져와 github secret의 값으로 저장해 둔 뒤

 

  - name: Get Env
    run: |
      // .env.production 파일 생성 (이 때 script에서 참조하는 경로와 동일한 위치에 생성해야한다)
      touch ./.env.production
      
      // 생성한 파일 내 github secrets 입력
      echo "${{secrets.PRODUCTION_ENV}}" > ./.env.production
    shell: bash

shell 명령어를 통해 env 파일을 생성한 후

해당 파일에 저장해 둔 github secrets 전체를 입력하는 방식을 사용했습니다!

 

이를 통해

1) github action에서 환경 변수 참조

2) 환경 변수 추가 시, github secrets만 수정 할 수 있게 되었습니다.

728x90
반응형