Notification
새로운 알림이 없습니다.

[CI/CD] GCP VM Deploy Guide with Jenkins CI/CD(2)

GCP VM Deploy Guide with Jenkins CI/CD

  • Agenda
    • Configuring GCP Flask App for CI/CD deployment
    • CI/CD Architecture
    • Configure Jenkins Multibranch Pipeline
      • Pipeline Settings
        • Prerequisites
        • New Credentials
        • Options related to MultiBranch Pipeline creation
        • Integrating with the Source Code Repository
  • Next Actions
    • Teams Webhook with Jenkins Configuration
    • Jenkins Pipeline Script 
  • Reference Link

Configuring GCP Flask App for CI/CD deployment

GCP에서 CI/CD 배포를 위해 사전에 아래와 같이 Resource 생성을 진행하였습니다.
Resource 생성간에 필요한 Reference Link는 아래에 참조로 걸어두었으니 확인 부탁드립니다.
  • Load Balancer(HTTP)
  • VPC(Virtual Private Cloud)
    • Custom Subnet
      • 10.x.x.x/25
    • Firewall
      • HTTP
        • Source IP Ranges
          • Primary Subnet(10.x.x.x/25)
      • Load Balancer Health Check
        • Source IP Ranges
          • 35.191.0.0/16
          • 130.211.0.0/22
      • SSH
        • Source IP Ranges
          • 35.235.240.0/20
  • Managed Instance Group(DEV/PROD) 
    • Instance Template(DEV/PROD)
  • Cloud DNS
    • prd/dev domain 

CI/CD Architecture

 
GCP에서 사용할 CI/CD Architecture를 위와 같이 작성하였습니다.
관련해서 위 Architecture의 CI/CD Flow를 단계별로 설명 드리겠습니다.
  1. GitHub Repo에 변경사항이 Push되면 Jenkins는 Webhook을 통해 변경사항을 감지하고 자동으로 Build를 시작합니다.
  2. Jenkins Multibranch Pipeline Script에서 Packer를 사용하여 GCE Image를 생성합니다.
  3. Packer를 통해 이미지가 생성되면 가장 최신 이미지를 기반으로 인스턴스 템플릿을 자동으로 생성합니다.
  4. 인스턴스 템플릿 생성 후 배포 관련 알림을 팀에 전송합니다.
  5. 개발팀 리더나 릴리스 엔지니어는 주요 브랜치에 대한 코드 승인 프로세스를 거칩니다.
    • PR을 요청한 Code에 문제가 있다고 판단하게되면, Approval Cancel을 Jenkins에서 선택해서 배포 자체를 취소 시킬수 있습니다.
    • 만약, 배포 되지 말아야 할 소스가 배포되었다거나, 잠시 이벤트성 수정이 들어갔을때 빠른 Rollback을 위해 Commit Message에 "Rollback" 이라는 Keyword를 입력하게 되면, 자동으로 Rollback Stage로 향하게 됩니다. 
  6. 승인 검토를 거친 후 배포가 진행됩니다.
  7. 각 브랜치에 해당하는 GCP 프로젝트로 배포가 진행되며, 기존 운영 중인 MIG 템플릿이 롤링 업데이트를 통해 교체됩니다.
  8. 점진적으로 클라이언트 트래픽을 새로운 인스턴스 템플릿 쪽으로 전환하며, 연결 드레이닝 타임아웃을 600초로 설정하여 기존 버전의 세션을 유지하는 사용자들을 10분 동안 지원합니다. GCP에서 이러한 설정을 구성하였습니다.

Configure Jenkins Multibranch Pipeline

Architecture 구성이 완료되었으니, Jenkins로 Multibranch Pipeline 구성을 진행해보겠습니다.
Multibranch Pipeline 구성에 앞서, Github Repository 생성이 필요합니다. 
(*필자는 Github Repo를 사전에 생성해두었으며, Repo 생성에 대해선 Reference Link 참고 부탁드립니다.)

Pipeline Settings
  • Prerequisites
    • Dashboard > Manage Jenkins > Credentials

        • Pipeline 구성 전에 Jenkins에서 사용할 Credentials 생성이 필요합니다.
        • 위 이미지에서 확인하실수 있듯이, Credentials을 추가 해줍니다. 
      • New Credentials
        • 필자는 Jenkins가 github repo에 접근할수 있도록 Jenkins의 SSH Key 등록 및 Google Cloud Service Account Key를 등록해줬습니다. 
        • Credentials의 경우, 목적에 따라 선택도 가능하니 참고하여 생성해주시면 될 것 같습니다.
    • Options related to MultiBranch Pipeline creation
      • Dashboard > New Item > Multibranch Pipeline

        • New Item을 통해 Multibranch Pipeline을 생성해줍니다.
      • Dashboard > Jenkins_MultiBranch_Pipeline_GCP > Configuration
        • Multibranch Pipeline 구성 이후 git과 연동을 위해 Branch Source등 각각 설정값들에 대해 기입해줘야 합니다.
        • 아래 이미지에서 보실수 있는 General 설정에 대해 설명드리겠습니다.


        • Branch Sources
          • Overview
            • Jenkins Multibranch Pipeline에서 Branch Sources는 다양한 Source로 부터 Branch 정보를 가져오는 옵션입니다.
            • Branch Sources 설정을 통해 Jenkins는 지정된 소스에서 Branch 정보를 주기적으로 업데이트하고, Multibranch Pipeline을 통해 Project의 여러 Branch에 대한 Auto Build & Deployment를 관리할수 있게 됩니다.
            • Git, GitHub, Bitbucket, 기타 다른 SCM등이 제공됩니다. 
          • Behaviours
            • Discover Branches
              • GItHub Repo와 연결이 정상적으로 동작했다면, 전체 Branch를 Read 합니다.
            • Discover Tags
              • 각 Branch들의 Tag도 가져오는 설정입니다.
          • Property Strategy
            • Pipeline Project에서 속성(Property)을 관리하고 설정하는 옵션입니다.
            • All branches get the same properties
              • 모든 Branch가 동일한 속성을 공유하게끔 설정하는 옵션입니다.
        • Build Configuration
          • Build Mode에 대한 설정을 할 수 있으며, 필자는 Jenkinsfile로 Pipeline Script를 구성해서 Build & Deploy를 해볼 예정입니다.
        • Scan Multibranch Pipeline Triggers
          • Periodically if not otherwise run
            • 일정한 주기적으로 Pipeline을 Scan해서 새로운 Branch나 Jenkinsfile의 변경을 확인해줍니다.
          • Scan by Webhook
            • Code Repository(Git,Gitlab,Bitbucket..)와 연결된 Webhook을 사용해서 변경사항을 실시간으로 감지하는 옵션입니다. 
            • 현재는 Trigger Token값을 통해 GitHub과 Integration 시켜둔 상태입니다.
    • Integrating with the Source Code Repository
      • Jenkins에서 GitHub Integration을 설정하기 위해 아래의 절차를 진행했습니다.
        • GitHub Plugin Install 
        • GItHub Repo Add Deploy Key
          • Jenkins 계정이 사용하는 ssh-key를 추가하여 Allow Write Access를 Check 해줍니다.
          • Jenkins Job(Pipeline)구성시 Credentials를 위에 설정한 Key로 지정하시면 됩니다.
        • Github Webhook
          • Jenkins와 GitHub간에 Webhook 설정을 진행하였습니다. 
          • Payload URL의 경우, 아래와 같이 지정하시면 됩니다.
            • https://JENKINS_URL/multibranch-webhook-trigger/invoke?token=[TRIGGER_TOKEN_VALUE]
      • 위 3가지 설정을 통해, Jenkins와 GitrHub 간의 통합이 설정되어 GitHub Repository의 변경사항을 자동으로 감지하고, Jenkins 작업을 Trigger 할수 있게 됐습니다.

Next Actions

해당 글을 통해 Jenkins Multibranch Pipeline에 대한 기본 설정을 알아봤습니다.
다음 글에서는 Jenkins에서 배포 진행시 Teams로 Webhook 던지는것에 대한 설정 관련한 내용과 
Jenkins Pipeline Script의 각 Stage에 대한 설명을 통해 GCP에 배포되는 과정을 설명하고자 합니다.

끝으로 이 포스팅을 보시는 분들이 관련 정보를 얻으시는데 도움이 되었으면 합니다. 

Reference Link



CI/CD
Stan Cloud
Stan Cloud
An avid cloud engineering Fan
대화 참여하기
댓글 쓰기