환경 변수 관리 최적화 방법

이경헌·2025년 5월 16일
0

CI/CD 자동화 파이프라인을 구축할 때, 서비스별 환경 변수가 점점 많아지면 이를 Docker Compose에 매번 일일이 작성하는 방식은 너무 번거롭고 비효율적입니다.

이 글에서는 GitHub Actions + Docker Compose를 사용하는 프로젝트에서 .env 파일 하나로 환경 변수를 효율적으로 관리하는 방법과, 그에 따른 CI/CD 설정법을 정리했습니다.


📁 프로젝트 구조

eventor/
├── .env                  # 공통 환경 변수 파일
├── eventor-front/
├── eventor-back/
├── eventor-auth/
├── eventor-gateway/
└── eventor-eureka/
  • 모든 서비스가 공통 .env 파일을 참조하도록 구성
  • CI/CD 과정에서도 .env 파일을 활용해 환경 변수 주입

🐳 Docker Compose 파일 수정

기존 방식 (비효율적 방식)

environment:
  - EUREKA_USERNAME=${EUREKA_USERNAME}
  - EUREKA_PASSWORD=${EUREKA_PASSWORD}
  - PROD_MYSQL_URL=${PROD_MYSQL_URL}
  ...
  • 서비스마다 환경 변수를 반복해서 명시해야 함
  • 변수 수가 많아질수록 유지보수성이 떨어짐

✅ 개선된 방식: .env로 통합 관리

services:
  eventor-back-blue-1:
    image: dlrudgjs104/eventor-back:blue-1
    container_name: "eventor-back-blue-1"
    env_file:
      - ../.env
    environment:
      - TZ=Asia/Seoul
      - PROD_SERVER_PORT=8101

🔑 핵심 포인트

  • 공통 환경 변수는 ../.env에 모두 정의
  • 각 서비스에서는 필수 항목만 environment:로 덮어쓰기
  • 관리 효율성과 가독성 크게 향상

🤖 GitHub Actions에서 .env 관리하기

GitHub Secrets 설정

  • ENV_FILE이라는 이름으로 .env 전체 내용을 저장
  • Secrets 위치:
    깃허브 레포지토리 > Settings > Secrets and variables > Actions
EUREKA_USERNAME=your_username
EUREKA_PASSWORD=your_password
MYSQL_USERNAME=your_username
DEV_MYSQL_PASSWORD=your_password
PROD_MYSQL_PASSWORD=your_password
...


⚙️ CI/CD YML 전체 흐름

🔨 Build 단계

jobs:
  build:
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Load .env and Install with Maven
        run: |
          echo "${{ secrets.ENV_FILE }}" > .env
          export $(grep -v '^#' .env | xargs)
          mvn install
        shell: bash

✅ 핵심

  • Secrets로부터 .env 생성
  • 필요한 변수들 export 후 Maven 빌드 시 반영

🚀 Deploy 단계

  server:
    runs-on: ubuntu-22.04
    needs: build
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Write .env file to temporary file
        run: echo "${{ secrets.ENV_FILE }}" > .env

      - name: Send .env to remote server
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          source: ".env"
          target: "/home/eventor"

      - name: Deploy to Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd eventor-back
            source deploy.sh

✅ 핵심

  • .env 파일을 생성하여 원격 서버로 전송
  • 서버에 복사된 .env는 Docker Compose에서 참조됨 (env_file)

⚠️ 주의할 점

구분설명
env_file 위치Docker Compose에서 .env 경로(../.env) 정확히 맞춰야 인식됩니다.
변수 우선순위env_file의 변수보다 environment:가 우선합니다.
비밀 관리.env를 Git에 올리지 말고 반드시 GitHub Secrets로 관리하세요.

📌 마무리

이 구조를 사용하면:

  • .env 파일 하나로 모든 서비스 환경 변수 관리
  • GitHub Actions에서 .env안전하게 전달하고 사용할 수 있음
  • 유지보수성과 보안성 모두 향상

0개의 댓글