리뷰 앱

리뷰 앱 (Review apps)

리뷰 앱은 각 브랜치나 머지 리퀘스트에 대해 자동으로 생성되는 임시 테스트 환경이에요. 로컬 개발 환경을 설정하지 않고도 변경 사항을 미리 보고 검증할 수 있어요.

동적 환경(dynamic environments) 위에 구축된 리뷰 앱은 각 브랜치나 머지 리퀘스트에 고유한 환경을 제공해요. 이런 환경은 개발 워크플로를 이렇게 개선해 줘요.

  • 변경 사항을 테스트하기 위해 로컬 설정이 필요 없음.
  • 모든 팀원에게 일관된 환경 제공.
  • 이해관계자가 URL로 변경 사항을 미리 볼 수 있게 함.
  • 변경 사항이 프로덕션에 도달하기 전에 더 빠른 피드백 주기 가능.

Kubernetes 클러스터가 있다면 Auto DevOps로 리뷰 앱을 자동으로 설정할 수 있어요.

출처: 문서

본문

리뷰 앱 워크플로

리뷰 앱 워크플로는 대략 이렇게 생겼어요.

%%{init: { "fontFamily": "GitLab Sans" }}%%
flowchart TD
    accTitle: Review app workflow
    accDescr: Diagram showing how review apps fit into the GitLab development workflow.

    subgraph Development["Development"]
        TopicBranch["Create topic branch"]
        Commit["Make code changes"]
        CreateMR["Create merge request"]
    end

    subgraph ReviewAppCycle["Review app cycle"]
        direction LR
        Pipeline["CI/CD pipeline runs"]
        ReviewApp["Review app deployed"]
        Testing["Review and testing"]
        Feedback["Feedback provided"]
        NewCommits["Address feedback
        with new commits"]
    end

    subgraph Deployment["Deployment"]
        Approval["Merge request approved"]
        Merge["Merged to default branch"]
        Production["Deployed to production"]
    end

    TopicBranch --> Commit
    Commit --> CreateMR
    CreateMR --> Pipeline

    Pipeline --> ReviewApp
    ReviewApp --> Testing
    Testing --> Feedback
    Feedback --> NewCommits
    NewCommits --> Pipeline

    Testing --> Approval
    Approval --> Merge
    Merge --> Production

리뷰 앱 구성하기

각 브랜치나 머지 리퀘스트에 대한 애플리케이션 미리보기 환경을 제공하려면 리뷰 앱을 구성해요.

전제 조건:

  • 프로젝트에 대한 Developer, Maintainer 또는 Owner 역할이 있어야 해요.
  • 프로젝트에 CI/CD 파이프라인이 있어야 해요.
  • 리뷰 앱을 호스팅하고 배포할 인프라를 설정해야 해요.

프로젝트에서 리뷰 앱을 구성하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾아요.

  2. 왼쪽 사이드바에서 Build > Pipeline editor를 선택해요.

  3. .gitlab-ci.yml 파일에 동적 환경을 만드는 잡을 추가해요. 각 환경을 구분하려면 사전 정의 CI/CD 변수를 사용할 수 있어요. 예를 들어 CI_COMMIT_REF_SLUG 사전 정의 변수를 사용하면:

review_app:
  stage: deploy
  script:
    - echo "Deploy to review app environment"
    # Add your deployment commands here
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    url: https://$CI_COMMIT_REF_SLUG.example.com
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
  1. (선택) 리뷰 앱을 수동으로만 배포하려면 잡에 when: manual을 추가해요.

  2. (선택) 더 이상 필요 없을 때 리뷰 앱을 중지하는 잡을 추가해요.

  3. 커밋 메시지를 입력하고 Commit changes를 선택해요.

리뷰 앱 템플릿 사용하기

GitLab은 기본적으로 머지 리퀘스트 파이프라인에 맞게 구성된 내장 템플릿을 제공해요.

이 템플릿을 사용하고 커스터마이즈하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾아요.

  2. 왼쪽 사이드바에서 Operate > Environments를 선택해요.

  3. Enable review apps를 선택해요.

  4. 나타나는 Enable Review Apps 대화 상자에서 YAML 템플릿을 복사해요.

deploy_review:
  stage: deploy
  script:
    - echo "Add script here that deploys the code to your infrastructure"
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_ENVIRONMENT_SLUG.example.com
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  1. Build > Pipeline editor를 선택해요.

  2. 템플릿을 .gitlab-ci.yml 파일에 붙여넣어요.

  3. 배포 요구 사항에 맞게 템플릿을 커스터마이즈해요.

    • 배포 스크립트와 환경 URL을 인프라에 맞게 수정해요.
    • 머지 리퀘스트 없이도 브랜치에 리뷰 앱을 배포하려면 rules 섹션을 조정해요.

예를 들어 Heroku로 배포하면:

deploy_review:
  stage: deploy
  image: ruby:latest
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$HEROKU_APP_NAME.herokuapp.com
    on_stop: stop_review_app
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

이 구성은 머지 리퀘스트에 대해 파이프라인이 실행될 때마다 Heroku에 자동 배포를 설정해요. Ruby의 dpl 배포 도구로 프로세스를 처리하고, 지정된 URL로 접근할 수 있는 동적 리뷰 환경을 만들어요.

  1. 커밋 메시지를 입력하고 Commit changes를 선택해요.

리뷰 앱 중지하기

리소스를 절약하기 위해 리뷰 앱을 수동 또는 자동으로 중지하도록 구성할 수 있어요.

리뷰 앱 환경 중지에 대한 자세한 내용은 환경 중지를 참고해요.

머지 시 리뷰 앱 자동 중지

관련 머지 리퀘스트가 병합되거나 브랜치가 삭제되면 리뷰 앱이 자동으로 중지되도록 구성하려면:

  1. 배포 잡에 [on_stop](/ci/yaml/#environmenton_stop) 키워드를 추가해요.
  2. [environment:action: stop](/ci/yaml/#environmentaction)으로 중지 잡을 만들어요.
  3. (선택) 언제든 수동으로 리뷰 앱을 중지하려면 중지 잡에 [when: manual](/ci/yaml/#when)을 추가해요.

예를 들어:

# In your .gitlab-ci.yml file
deploy_review:
  # Other configuration...
  environment:
    name: review/${CI_COMMIT_REF_NAME}
    url: https://${CI_ENVIRONMENT_SLUG}.example.com
    on_stop: stop_review_app  # References the stop_review_app job

stop_review_app:
  stage: deploy
  script:
    - echo "Stop review app"
    # Add your cleanup commands here
  environment:
    name: review/${CI_COMMIT_REF_NAME}
    action: stop
  when: manual  # Makes this job manually triggerable
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
시간 기반 자동 중지

일정 시간이 지나면 리뷰 앱이 자동으로 중지되도록 구성하려면 배포 잡에 [auto_stop_in](/ci/yaml/#environmentauto_stop_in) 키워드를 추가해요.

# In your .gitlab-ci.yml file
review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    auto_stop_in: 1 week  # Stops after one week of inactivity
  rules:
    - if: $CI_MERGE_REQUEST_ID

리뷰 앱 보기

리뷰 앱을 배포하고 접근하려면:

  1. 머지 리퀘스트로 이동해요.
  2. (선택) 리뷰 앱 잡이 수동이면 Run을 선택해 배포를 시작해요.
  3. 파이프라인이 끝나면 View app을 선택해 브라우저에서 리뷰 앱을 열어요.

예시 구현

다음 프로젝트들이 다양한 리뷰 앱 구현을 보여줘요.

프로젝트 구성 파일
NGINX .gitlab-ci.yml
OpenShift .gitlab-ci.yml
HashiCorp Nomad .gitlab-ci.yml
GitLab Documentation build.gitlab-ci.yml
https://about.gitlab.com/ .gitlab-ci.yml
GitLab Insights .gitlab-ci.yml

다른 리뷰 앱 예시:

라우트 맵 (Route maps)

라우트 맵을 사용하면 소스 파일에서 리뷰 앱 환경의 해당 공개 페이지로 바로 이동할 수 있어요. 이 기능은 머지 리퀘스트에서 특정 변경 사항을 미리 보는 것을 더 쉽게 만들어 줘요.

구성하면 라우트 맵이 매핑 패턴과 일치하는 파일의 리뷰 앱 버전을 볼 수 있게 하는 컨텍스트 링크를 추가해요. 이 링크는 다음에 나타나요.

  • 머지 리퀘스트 위젯.
  • 커밋 및 파일 보기.

라우트 맵 구성하기

라우트 맵을 설정하려면:

  1. 저장소에 .gitlab/route-map.yml 파일을 만들어요.
  2. 소스 경로(저장소의)와 공개 경로(리뷰 앱 인프라 또는 웹사이트의) 사이의 매핑을 정의해요.

라우트 맵은 각 항목이 source 경로를 public 경로에 매핑하는 YAML 배열이에요.

라우트 맵의 각 매핑은 다음 형식을 따라요.

- source: 'path/to/source/file'  # Source file in repository
  public: 'path/to/public/page'  # Public page on the website

두 가지 유형의 매핑을 사용할 수 있어요.

  • 정확히 일치: 작은따옴표로 묶인 문자열 리터럴
  • 패턴 일치: 슬래시로 묶인 정규 표현식

정규 표현식으로 패턴 일치를 사용할 때:

  • 정규식은 전체 소스 경로와 일치해야 해요(^$ 앵커가 암시됨).
  • public 경로에서 참조할 수 있는 캡처 그룹 ()를 사용할 수 있어요.
  • 캡처 그룹은 발생 순서대로 \N 표현식을 사용해 참조해요(\1, \2 등).

더 알아보기

리뷰 앱의 기반이 되는 동적 환경과 환경 중지/배포 동작을 이해해 두면 리뷰 앱을 더 자유롭게 다룰 수 있어요. Kubernetes 위에서 자동으로 설정하고 싶다면 Auto DevOps 문서도 함께 읽어보는 걸 추천해요.