Bitbucket Pipelines로 Google App Engine에 자동 배포 시 안전하게 환경변수를 추가하는 방법을 소개합니다.
app.yaml
)에 환경 변수를 추가하는 방법은 env_varibles
항목에 key:value
형태로 평문 그대로 저장하는 방식입니다.app.yaml
파일에 API Key, Auth Token 등의 노출되면 안되는 정보들이 그대로 노출됩니다.app.yaml
파일에 직접 저장하는 방식이 아니라, 배포 시에 동적으로 추가해 주는 방식이 필요합니다.standard
환경 일 때는 동작하지만 flex
환경일 때는 동작하지 않습니다.app.yaml
파일에 추가해 주는 방법이 그나마 괜찮은 방법 같았습니다.app.yaml
에 평문으로 저장되어 있던 환경변수를 모두 Bitbucket에 저장합니다.Repository settings > PIPELINES > Deployments
페이지로 이동하여 환경변수를 추가합니다..env.array
파일을 생성합니다.TEST_ENV1
TEST_ENV2
TEST_ENV3
add-env-to-gae-conf.sh
파일을 생성합니다.#!/bin/bash
# Set default file input/output name
FILE_INPUT_NAME=.env.array
FILE_OUTPUT_NAME=app.yaml
# Set file input/output name, when user add options
while getopts "i:o:" opt; do
case $opt in
i)
FILE_INPUT_NAME=$OPTARG ;;
o)
FILE_OUTPUT_NAME=$OPTARG ;;
*) echo "usage: $0 [-i] [-o]" >&2
exit 1 ;;
esac
done
# Read all environment variables that have to be copied from input file
declare env_array=()
while IFS= read -r line || [[ "$line" ]]; do
env_array+=("$line")
done < "${FILE_INPUT_NAME}"
# Print all environment variables to output file
if [ "${#env_array[@]}" -eq 0 ]; then
echo "There is no environment variables";
else
{ printf "\n\n"; printf "env_variables:"; printf "\n"; } >> "${FILE_OUTPUT_NAME}";
for i in "${env_array[@]}";
do
printf " %s\n" "${i}: ${!i}" >> "${FILE_OUTPUT_NAME}";
done
fi;
.env.array
), 기본 출력 파일 (app.yaml
) 이 설정되어 있고, -i, -o
옵션을 통해서 변경 가능합니다.환경변수 이름: 값
형태로 출력 파일 가장 하단에 추가합니다.env_variables
항목을 통째로 추가하는 것이기 때문에 기존에 env_variables
항목이 정의되어 있다면 삭제해야 정상적으로 동작합니다.app.yaml
파일에 유동적으로 추가해 줍니다.app.yaml
파일 하단에 아래와 같이 추가 됩니다.env_variables:
TEST_ENV1: test string 1
TEST_ENV2: test string 2
TEST_ENV3: test string 3
app.yaml
파일에 환경변수가 추가 되는 것을 확인할 수 있습니다.export TEST_ENV1='test string 1'
export TEST_ENV2='test string 2'
export TEST_ENV3='test string 3'
bash add-env-to-gae-conf.sh
bitbucket-pipelines.yml
파일 중 Google App Engine 배포 단계의 스크립트에 환경변수 추가 스크립트를 실행합니다.node:alpine
이미지를 기본으로 사용하여 bash를 별도로 설치해 줍니다.image: node:alpine
run-test: &run-test
step:
name: Run jest unit test
caches:
- node
script:
- yarn
- yarn test
deploy-dev: &deploy-dev
step:
name: Deploy Develop Branch to App Engine
deployment: gcp-dev
script:
- apk add bash
- chmod +x ./add-env-to-gae-conf.sh
- bash ./add-env-to-gae-conf.sh
- cat ./app.yaml
- pipe: atlassian/google-app-engine-deploy:0.7.3
variables:
KEY_FILE: $KEY_FILE
PROJECT: $PROJECT
STOP_PREVIOUS_VERSION: 'true'
DEBUG: 'true'
pipelines:
branches:
master:
- <<: *run-test
develop:
- <<: *run-test
- <<: *deploy-dev
process.env.TEST_ENV1
, process.env.TEST_ENV2
, process.env.TEST_ENV3
를 console.log에 찍거나 JSON 형태로 반환해 봅니다.app.yaml
파일에 env_variables
항목이 이미 있는 경우에는 정상적으로 동작하지 않습니다.보완을 위해 고민하다가 좋은 라이브러리를 찾아서 해결했습니다. 파일의 변수를 환경변수 값으로 교체해 주는 라이브러리 envsub