홍차의 미로찾기

[CICD] github actions 변수 사용하기 (env 파일, secrets and variables) 본문

프로그래밍/BUILD DEPLOY

[CICD] github actions 변수 사용하기 (env 파일, secrets and variables)

홍차안디 2024. 10. 20. 13:53
반응형

github actions 스크립트를 작성하면서 알게된 변수 사용하는 방법을 몇 가지 정리해보겠습니다.

 

1. 변수가 작성된 env 파일 사용

2. github actions repository secrets 변수

3. github actions repository variables 변수

 

변수 사용 방식 3가지

 

1. repository root 경로에 env 파일 생성 후 로드

이 방식은 각 리포지토리의 root 경로에 변수를 작성한 env 파일을 로드해서 사용하는 방식입니다.

우선, env 파일을 생성 후 사용할 변수를 작성합니다.

 

deploy-config.env

PROJECT_NAME=myserver-api
PORT=8081

 

이렇게 작성된 변수는 github actions 스크립트에서 로드 후, 사용할 수 있습니다.

 

github actions script

...

jobs:
  build:
    runs-on: ubuntu-latest

    steps:

    # env 파일에 접근하기위해서 Github Repository 에서 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v4

    ..

    # env 파일에서 변수 가져오기
    - name: Load environment variables
      run: |
          set -o allexport
          source ./deploy-config.env
          set +o allexport
          echo "PROJECT_NAME=$PROJECT_NAME" >> $GITHUB_ENV
          echo "PORT=$PORT" >> $GITHUB_ENV

    ...

    # 변수 출력해보기
    - name: Check environment variables
      run: |
        echo "PROJECT_NAME is $PROJECT_NAME"
        echo "PORT is $PORT"

 

env 파일을 로드 한 후, 내부의 변수를 GITHUB ACTION 변수로 설정합니다.

설정한 변수는 스크립트에서 $PROJECT_NAME 형식으로 사용 가능합니다.

 

다만, 사용 시 알아야할 점이 있습니다.

1. 코드에서 env 파일을 가져오는 것이기 때문에 code checkout 이 먼저 선행되어야 합니다.

2. jobs.build 단계에서 가져온 변수는 jobs.deploy 단계에서는 사용할 수 없습니다 (ㅠㅠ)
3. deploy 단계에서 사용하기 위해서는 code checkout이 한 번 더 필요하다는 불필요함이 있습니다. (같은 작업 반복해야 함)

 

저는 동일한 스크립트를 여러 리포지토리에 사용하고, 리포지토리마다 다른 부분은 변수처리를 하려고 했으나

위 방법은 jobs.build 와 jobs.deploy 단계 모두에서 사용 가능한 변수가 아니어서 다른 방법을 찾아보았습니다.

 

아래에서 설명하는 github repository secretsrepository variablesgithub actions 스크립트 모든 단계에서 사용이 가능합니다!

 

 

2. github actions repository secrets 변수

 

이 변수는 Github 시크릿 변수 (Github Secret) 라고 부릅니다.

리포지토리에서 사용되는 정보 중에 보안이 필요한 민감한 정보를 저장합니다.

주로 API 키, EC2 pem 파일, IP주소와 같은 정보를 저장합니다.

 

또한, public repository에서 application-secret.yml 파일을 사용한다면 secret 변수를 사용하여 보안을 강화할 수 있습니다.

 

 

2-1. 시크릿 변수 (API KEY, IP주소, pem 파일, 비밀번호 등으로 사용)

 

[repository > Settings] 메뉴로 이동합니다.

 

[Security > Secrets and variables > Actions] 메뉴로 이동합니다.

 

New repository secret 버튼을 클릭해서 새로운 secret을 생성합니다.

 

사용할 변수 이름과 변수 값을 추가합니다.

Name 에 작성한 이름으로 github actions script에서 사용할 수 있습니다.

 

 

github actions script에서는 아래와 같이 사용할 수 있습니다.

${{ secrets.EC2_IP }} 로 사용합니다.

...

jobs:
	build:
    ...
    
  	deploy:
        runs-on: ubuntu-latest
        needs: build

        steps:

        # EC2에서 도커 이미지 로드 및 컨테이너 실행
        - name: Deploy Docker container on EC2
          uses: appleboy/ssh-action@v0.1.5
          with:
            host: ${{ secrets.EC2_IP }}
 
...

 

 

 

 

시크릿 변수가 보안상 안전한 이유가 몇 가지 있습니다.

 

1. 시크릿 변수는 진행사항에서 ***로 표시됩니다.

- [repository > actions] 메뉴에서 빌드 및 배포 진행 사항을 확인 가능

2. 한 번 저장된 시크릿 변수 값은 사용만 가능하고 확인이 불가합니다.

 - 값 수정은 가능하나 기존 값 확인 불가능

 

 

2-2. application-secret.yml 파일을 secret 변수로 사용하기

 

public repository에서 application-secret.yml을 사용하고 있다면 시크릿 변수를 사용하는 것이 유용할 수 있습니다.

해당 방식을 사용하면 application-secret.yml 파일을 github에 올리지 않기때문에 유출될 유려가 없습니다.

 

1번 방식인 env파일에서 변수를 가져와 사용하는것과는 달리, 

시크릿 변수는 jobs.build 와 jobs.deploy 단계에서 모두 사용할 수 있는 변수입니다.

repository에서 코드를 따로 체크아웃 받아서 가져올 필요도 없습니다.

또한, 보안상 중요한 값을 보관할 변수로 용이합니다.

 

 

진행순서

 

(1) application-secret.yml에 DB 엔드포인트, 계정 ID/PW, JWT secret key 와 같이 보안 상 중요한 정보를 저장합니다.

 

(2) gitIgnore 파일에 application-secret.yml 파일을 등록합니다.

- github에 시크릿 파일이 push 되지 않도록 합니다.

 

(3) application-secret.yml 파일의 내용을 base64로 암호화합니다.

- window : base64로 암호화해주는 사이트를 검색해서 사용 (내용 복사 후, 사이트에 붙여넣어 인코딩)

- 사이트는 검색해서 아무 사이트나 이용했습니다.

 

- macOS : mac 터미널을 이용해서 파일 내용을 base64로 인코딩 한 후, 클립보드에 저장합니다.

# 파일 내용을 base64로 암호화한 후, 클립보드에 저장
cat ./경로/application-secret.yml | base64 | pbcopy

 

 

(4) github secret 변수암호화 된 값을 저장합니다.

 

위에 일반 시크릿 변수를 생성하는 메뉴로 동일하게 들어갑니다. 대신, 값으로는 base64로 암호화된 값을 넣습니다.

변수 이름은 github actions에서 사용할 수 있도록 작성합니다. 저는 APPLICATION_SECRET 으로 생성했습니다.

 

(5) github actions script 작성하기

 

yml 파일의 내용을 인코딩 한 후, 시크릿 변수로 작성했기 때문에 다시 변수를 가져온 후 파일을 생성하는 작업을 진행합니다.

application-secret.yml 파일을 생성해서 프로젝트의 적절한 위치에 넣어주는 것입니다.

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    
    # Github Repository 에서 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v4
      
    ...
    
    # Github secret을 사용해 application-secret.yml 파일 생성 후, 코드에 추가합니다.
    - name: Create application-scret.yml
      run: |
        echo "${{ secrets.APPLICATION_SECRET }}" | base64 --decode > ./src/main/resources/application-secret.yml

 

- 시크릿 변수로 값을  가져오기 - ${{ secrets.APPLICATION_SECRET }}

- base64로 인코딩한 값을 다시 디코딩 -  base64 --decode

- 프로젝트 안에 yml파일 넣기 - ./src/main/resources/application-secret.yml

 

중요한 것은, 해당 작업 전에 repository에서 코드를 체크아웃 받아야 한다는 것입니다.

코드를 가져와야 application-secret.yml 파일을 넣어줄 수 있습니다.

도커 이미지 빌드 전 적절한 시점에 넣어주면 됩니다.

 

 

3. github actions repository variables 변수

 

보안 상 중요한 정보는 시크릿 변수로 저장했습니다.

하지만, 단순히 github actions script 전체에서 변수로서 사용하고 싶은 값이 있다면 해당 변수를 사용할 수 있습니다.

 

이 변수 또한 jobs.build 와 jobs.deploy 단계에서 모두 사용할 수 있는 변수입니다.

repository에서 코드를 따로 체크아웃 받아서 가져올 필요도 없습니다.

하지만, 보안상 중요한 정보에는 사용하지 않습니다.

 

 

사용하기

 

(1) 시크릿 변수와 동일한 메뉴로 이동합니다. 

- [repository > Settings > Secrets and variables > Actions] 메뉴에서 Variables 탭으로 이동합니다.

- New repository variable 로 변수를 생성합니다.

 

Repository variables 내용을 보면 Value값이 노출되는 것을 볼 수 있습니다.

 

(2) github actions script에서 ${{ vars.REPO_NAME }} 의 형식으로 사용합니다.

- script 전체 범위에서 사용할 수 있습니다.

...
jobs:
  build:
    
    steps:
    
    # docker 이미지를 빌드하고 tar 파일로 저장
    - name: Build Docker image
      run: |
        docker build -t ${{ vars.REPO_NAME }} .
        docker save -o ./${{ vars.REPO_NAME }}.tar ${{ vars.REPO_NAME }}
        chmod 664 ${{ vars.REPO_NAME }}.tar

 

 


초반에는 env 파일을 작성해서 사용했으나, github actions 스크립트 전체에서 사용 불가능해서 고전했습니다.

하지만, gihub repository 변수를 사용한 이후로는 보다 쉽게 변수를 사용하고 있습니다.

 

저의 경우에는, 모든 repository마다 github actions script 내용을 동일하게 작성했고,

각 프로젝트마다 바뀌는 값들은 이 github secret 변수와 vars 변수를 사용했습니다.

 

보안상 중요한 변수는 secret을, 단순하게 스크립트 내에서 프로젝트마다 구별되어야 하는 값들은 vars 사용했습니다.

 

덕분에 새로운 repository를 빌드/배포 할 때, 스크립트 내용은 복붙하고, 달라야하는 값들은 변수를 추가하면서 여러 프로젝트 배포가 쉬워져서 만족하고 있습니다.

 

 

정리

  env 파일 github secrets github variables
사용 조건 - 프로젝트에 env 파일 생성  github 사이트에서 변수 추가 필요
github actions script 작성 조건 - 코드 체크아웃 단계 필요
- env 파일 로드 단계 필요
별도 추가 작성 필요없음
github actions script 사용 범위 env파일을 load 한 jobs에서만 사용 가능
- jobs.build에서 load 시, jobs.deploy에서 사용 불가능
스크립트 전체
변수 사용 방법 $변수명 ${{ secrets.변수명 }} ${{ vars.변수명 }}

 

반응형
Comments