배포 도구로 Dpl 사용하기

배포 도구로 Dpl 사용하기

Dpl(D-P-L처럼 읽어요)은 지속적 배포를 위해 만들어진 배포 도구로, Travis CI가 개발하고 사용하지만 GitLab CI/CD에서도 함께 쓸 수 있어요. Dpl은 지원하는 공급자(provider) 중 어떤 곳으로든 배포할 수 있어요.

출처: 문서

본문

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

사전 준비

Dpl을 사용하려면 젬을 설치할 수 있는 권한이 있는 Ruby 1.9.3 이상이 필요해요.

기본 사용법

Dpl은 다음 명령으로 어떤 머신에도 설치할 수 있어요.

gem install dpl

이렇게 하면 CI 서버에서 테스트하는 대신 로컬 터미널에서 모든 명령을 먼저 시험해볼 수 있어요.

Ruby가 설치되어 있지 않다면 Debian 계열 Linux에서 이렇게 설치할 수 있어요.

apt-get update
apt-get install ruby-dev

Dpl은 Heroku, Cloud Foundry, AWS/S3를 포함한 많은 서비스를 지원해요. 사용하려면 provider와 provider가 요구하는 추가 파라미터를 정의하면 돼요.

예를 들어 애플리케이션을 Heroku에 배포하려면 provider를 heroku로 지정하고 api_keyapp을 지정해야 해요. 가능한 모든 파라미터는 Heroku API 섹션에서 찾을 수 있어요.

staging:
  stage: deploy
  script:
    - gem install dpl
    - dpl heroku api --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
  environment: staging

위 예시는 HEROKU_STAGING_API_KEY 보안 변수에 저장된 API 키로 my-app-staging을 Heroku 서버에 배포하기 위해 Dpl을 사용했어요.

다른 provider를 쓰려면 지원하는 provider를 참고하세요.

Docker와 함께 Dpl 사용하기

대부분의 경우 GitLab Runner를 서버의 셸 명령을 사용하도록 설정했을 거예요. 이 경우 모든 명령이 로컬 사용자(예: gitlab_runner 또는 gitlab_ci_multi_runner)의 컨텍스트에서 실행돼요. 또한 Docker 컨테이너에는 Ruby 런타임이 없을 가능성이 높아서 직접 설치해야 해요.

staging:
  stage: deploy
  script:
    - apt-get update -yq
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl heroku api --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
  environment: staging

첫 줄 apt-get update -yq는 사용 가능한 패키지 목록을 갱신하고, 두 번째 apt-get install -y ruby-dev는 시스템에 Ruby 런타임을 설치해요. 이 예시는 모든 Debian 호환 시스템에서 유효해요.

스테이징·프로덕션 사용법

개발 워크플로에서 스테이징(개발)과 프로덕션 환경을 두는 건 꽤 흔한 일이에요.

다음 예시를 생각해볼게요. main 브랜치는 staging으로, 모든 태그는 production 환경으로 배포하고 싶어요. 그 설정을 위한 최종 .gitlab-ci.yml은 이렇게 생겼어요.

staging:
  stage: deploy
  script:
    - gem install dpl
    - dpl heroku api --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
  environment: staging

production:
  stage: deploy
  script:
    - gem install dpl
    - dpl heroku api --app=my-app-production --api_key=$HEROKU_PRODUCTION_API_KEY
  rules:
    - if: $CI_COMMIT_TAG
  environment: production

서로 다른 이벤트에서 실행되는 배포 잡 두 개를 만들었어요.

  • staging: main 브랜치로 푸시되는 모든 커밋에서 실행
  • production: 푸시되는 모든 태그에서 실행

이 잡들은 두 개의 보안 변수도 사용해요.

  • HEROKU_STAGING_API_KEY: 스테이징 앱 배포에 사용하는 Heroku API 키
  • HEROKU_PRODUCTION_API_KEY: 프로덕션 앱 배포에 사용하는 Heroku API 키

API 키 저장하기

API 키를 보안 변수로 저장하는 방법은 이래요.

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾아요.
  2. 왼쪽 사이드바에서 Settings > CI/CD를 선택해요.
  3. Variables를 펼쳐요.

프로젝트 설정에 정의된 변수는 빌드 스크립트와 함께 러너로 전송돼요. 보안 변수는 저장소 밖에 저장돼요. 시크릿은 절대 프로젝트의 .gitlab-ci.yml 파일에 저장하면 안 돼요. 또한 시크릿의 값이 잡 로그에 숨겨져 있는 것도 중요해요.

추가한 변수는 변수 이름 앞에 $(Windows가 아닌 러너) 또는 %(Windows Batch 러너)를 붙여서 접근해요.

  • $VARIABLE: Windows가 아닌 러너용
  • %VARIABLE%: Windows Batch 러너용

CI/CD 변수에 대해 더 자세히 알아볼 수 있어요.

더 알아보기

Dpl은 간단하지만 오래된 배포 방식이에요. 최근에는 배포 토큰이나 환경 변수를 활용한 네이티브 배포, 그리고 Dpl이 지원하는 다른 provider를 함께 살펴보면 훨씬 유연한 배포 파이프라인을 만들 수 있어요.