GithubActions를 통해 Album 프로젝트를 ELB에 배포하면서, 한 가지 고민 거리가 생겼다.
Album 프로젝트는 env.properties라는 파일에서 환경 변수를 관리하고 있었다.
환경 변수에는 DB 정보, Oauth2 정보 등 민감 정보가 포함되어 있어서, github에는 업로드를 하지 않고 있었다.
배포를 하기 전에는 로컬에서만 어플리케이션을 실행하고, 테스트 코드를 실행했기 때문에 github에 env.properties를 업로드하지 않아도 아무 문제가 없었다.
그러나 GithubActions를 통해 프로젝트 배포를 시도하면서, github에 env.properties를 업로드 하지 않는 것이 문제를 발생시켰다.
우선 GithubActions로 프로젝트를 배포할 때는 테스트가 먼저 정상 통과되어야하는데, 테스트를 실행할 때 env.properties에 저장된 환경 변수들이 필요해서 테스트가 정상 통과되지 않는 문제가 발생했다.
또한 어플리케이션을 빌드할 때도 env.properties에 저장된 환경 변수들이 필요했기 때문에 env.properties가 없이는 빌드가 되지 않는다.
이러한 문제를 해결하기 위해 github의 actions secrets를 사용하기로 했다.
actions secrets
actions secrets는 GithubActions를 실행할 때 사용할 환경 변수들을 key : value 형태로 지정할 수 있는 기능이다.
actions secrets에 저장되는 정보들은 public하게 공개되지 않는다.
따라서 github 리포지토리에는 공개되면 안될 정보들을 관리할 수 있다.
실제 적용
actions secrets 설정
github 리포지토리의 settings 탭에 들어간다.
그리고 Secrets and variables > Actions에 들어간다.
New repository secret를 클릭하면 GithubActions에서 사용할 환경 변수들을 등록할 수 있다.
Name에 key를 입력하고, Secret에는 key를 통해 불러올 정보들을 입력한다.
나의 경우에는 name을 ENV_PROPERTIES로 정하고, secret에는 env.properties의 내용을 복사해서 그대로 입력했다.
deploy.yml
실제 GithubActions의 실행 동작을 정의하는 deploy.yml를 수정해야한다.
아래의 코드에서 살펴볼 부분은 name: Add env properties 부분이다.
- touch ./src/main/resources/env.properties를 통해 github 리포지토리에서 다운 받은 프로젝트에 env.properties 파일을 생성한다.
- echo "${{ secrets.ENV_PROPERTIES }}" > ./src/main/resources/env.properties를 통해 actions secrets에 저장된 ENV_PROPERTIES의 값을 읽어와서 env.properties에 쓰기 작업을 실시한다.
- cat ./src/main/resources/env.properties를 통해 env.properties의 내용을 출력한다. 이것은 필수가 아니며, 디버깅 용도이다.
Add env properties 작업을 통해 github 리포지토리에서 다운 받은 프로젝트는 env.properties 파일이 포함된 상태가 된다.
이제 프로젝트는 env.properties를 포함하고 있기 때문에 테스트와 어플리케이션 빌드에 필요한 모든 환경 변수를 갖게 된다.
name: aws-album
on:
push:
branches:
- main # main 브랜치에 push가 발생하면, jobs 이하를 진행해라.
# https://github.com/actions/setup-java
# actions/setup-java@v2는 사용자 정의 배포를 지원하고 Zulu OpenJDK, Eclipse Temurin 및 Adopt OpenJDK를 기본적으로 지원합니다. v1은 Zulu OpenJDK만 지원.
jobs:
build: # 이름 상관 없음.
runs-on: ubuntu-latest
steps:
- name: Checkout # 첫 번째(action -> 코드 다운로드)
uses: actions/checkout@v3
- name: Add env properties
run: |
touch ./src/main/resources/env.properties
echo "${{ secrets.ENV_PROPERTIES }}" > ./src/main/resources/env.properties
cat ./src/main/resources/env.properties
- name: Set up JDK 11 # 두 번째(action -> JDK11 설치)
uses: actions/setup-java@v3
with:
java-version: 11
distribution: zulu
- name: Pemission # 세 번째(scrpit -> gradlew 실행 권한 부여)
run: chmod +x ./gradlew
- name: Build with Gradle # 네 번째(script -> 실행 파일 생성)
run: ./gradlew clean build
# UTC가 기준이기 때문에 한국시간으로 맞추려면 +9시간 해야 한다
- name: Get current time # 다섯 번째(action -> 한국 시간으로 설정)
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current Time # 여섯 번째(script -> 시간을 보여준다.)
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
# EB에 CD 하기 위해 추가 작성
- name: Generate deployment package # 일곱 번째(script)
run: | # 명령어 여러 줄 작성 가능
mkdir deploy
cp build/libs/*.jar deploy/application.jar
cp Procfile deploy/Procfile
cp -r .ebextensions deploy/.ebextensions
cd deploy && zip -r deploy.zip .
- name: Deploy to EB # 여덟 번째(action -> 엘라스틱 빈스톡으로 배포)
uses: einaregilsson/beanstalk-deploy@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
application_name: album # 엘리스틱 빈스톡 애플리케이션 이름!
environment_name: Album-env # 엘리스틱 빈스톡 환경 이름!
version_label: album-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
wait_for_environment_recovery: 300