CICD 예제 파이프라인 및 demo

CICD

CI/CD는 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법

CI/CD의 기본 개념은 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포입니다. 

CI : 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)

CD : 지속적인 서비스 제공(Continuous Delivery) 또는 지속적인 배포(Continuous Deployment)를 의미

CI/CD(CI CD, 지속적 통합/지속적 배포): 개념, 툴, 구축, 차이

github, gitlab (git)

분산버전관리시스템

github, gitlab 의 주요제공기능

  • 버전관리

  • 프로젝트관리 (wiki, issues)

  • 패키지기능(npm, RubyGems, Apache Maven, Gradle, Docker, and NuGet, docker 등)

  • 자동화와 CICD

  • 보안

  • API 제공

github VS gitlab 어떤 것 선택을 할 것인가?

github vs gitlab

gitlab

github

gitlab

github

Free

Premium : 1인당 월$19*12= 년 $228

Ultimate : 1인당 월$99*12=년 $1188

Free

Team : 1인당 월 $4*12 = 년 $48

Enterprise : 1인당 월 $21*12 = 년 $252

Pricing

https://github.com/pricing

  • 솔루션 관리의 편의성을 위해서 SaaS 선택, IDC나 사내에서 배포 필요시 runner 를 이용하면 됨

  • 타입별 비교 : Free 제외.

  • API는 모두 제공됨

  • CICD 기준 평가

    • github은 기본적인 CICD 기능을 제공

    • gitlab은 CICD에 필요한 각종 기능을 통합하여 제공을 하고 있음. (테스팅과 관련한 각종 툴이 통합, Auto DevOps, 애플리케이션 운영 및 유지 관리에 도움이되는 다양한 도구를 제공, 쿠버네티스 통합 등)

  • 배포

    • gitlab은 environments 를 이용하여 애플리케이션 배포 및 롤백이 편리

    • github은 public repo 또는 Enteprise에서만 지원을 함

  • 선택

    • gitlab에서 제공하는 CICD 이 다양하지만 당장 사용을 할 수 있는 있는 상황은 아님

    • gitlab의 배포기능은 상당히 유용하며 이 부분을 활용할 것이라면 gitlab을 사용하는 것이 좋음

    • gitlab 배포기능이 현재 당장 필요한 것이 아니라면 github 사용

git branch 전략

github flow

https://guides.github.com/introduction/flow/

https://guides.github.com/pdfs/githubflow-online.pdf

branch 생성 → commit → Pull request → 코드 토론 및 검토 → 풀 요청이 검토되고 브랜치가 테스트를 통과하면 변경 사항을 배포하여 프로덕션에서 확인 → 코드를 메인 브랜치에 병합

git 브랜칭 전략으로는 여러 가지가 있으며 (Git flow, GitHub flow, GitLab flow) 각 개발조직에서 맞는 것을 선정하여 사용하면 됨.

https://ujuc.github.io/2015/12/16/git-flow-github-flow-gitlab-flow/

github actions 이용한 CICD

사전 설정

  • Pull request (github) 를 생성할 때 Reviewers, Assignees 를 지정

    • Pull request (github) 또는 Merge request(gitlab)를 했을 때 버전 관리 프로그램에서 사전에 *명의 리뷰를 받도록 강제로 설정할 수 있음.

      • github : 해당 git repo Settings -Branches - Branch protection rules - Require pull request reviews before merging

      • gitlab : 해당 git repo Settings - Merge request (MR) approvals

  • environments 로 dev, staging, production 을 설정하여 환경을 구분하고 배포 관련한 작업을 연관시킬 수 있음.

github actions workflow

github actions를 이용하여 소프트웨어 워크 플로를 쉽게 자동화 할 수 있음. GitHub에서 바로 코드를 빌드, 테스트 및 배포

https://github.com/taejoonmoon/cicd_example/blob/main/.github/workflows/main.yml

기본조건 : main 브랜치에 push 나 pull_request가 있을 때 github actions 실행이 됨.

  • build, test 는 현재 workflow에서 모두 실행이 됨

  • Pull Request 상태 일 때만 Dev에 배포

  • 메인에 커밋하거나 병합 할 때만 스테이징에 배포

  • 스테이징 후 승인을 받아 프로덕션에 배포

 

branch 생성 → commit → Pull request → 코드 토론 및 검토 → 병합 및 배포

  • 개발자는 생성한 branch 에서 필요한 코드를 수정하고 테스팅을 함.

  • Pull request 요청

    • 코드 토론 및 검토

    • 사전에 리뷰어 설정을 해두었으면 리뷰가 끝나야 코드 병합이 가능함.

    • Pull request 를 요청한 화면에서 github actions 에 설정한 build, test 등의 조건이 통과해야 이후 진행이 가능함

    • Pull request 요청이 왔을때 github actions 에서는 deploy-dev 까지 진행.

  • 메인에 커밋하거나 병합 할 때만 스테이징에 배포

  • 스테이징 후 승인을 받아 프로덕션에 배포

  • 배포 예제를 위해서 AWS s3 bucket 에 html 파일 업로드하는 부분을 추가하였음. 사전에 s3 버킷 생성하고 정적 웹호스팅 설정을 해야함. 이 문서에서 이에 대한 설명은 생략.

    • https://github.com/aws-actions/configure-aws-credentials 참고

    • deploy-staging: name: deploy-staging if: github.event.ref == 'refs/heads/main' needs: [test] runs-on: ubuntu-latest environment: name: staging url: 'http://tjmoon-cicd-example.s3-website.ap-northeast-2.amazonaws.com/staging/' steps: - name: Checkout uses: actions/checkout@v2 - name: Configure AWS credentials from Test account uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-2 - name: Copy files to the test website with the AWS CLI run: | aws s3 rm s3://$BUCKET_NAME/staging/ --recursive aws s3 cp ./ s3://$BUCKET_NAME/staging/ --recursive --exclude "*" --include "*.html" env: BUCKET_NAME: vntg-cicd-example

github actions 예제

https://docs.github.com/en/actions/guides

gitlab 이용한 CICD

사전설정

  • Merge request(gitlab) 를 생성할 때 Reviewers, Assignees 를 지정

    • Merge request(gitlab)를 했을 때 버전 관리 프로그램에서 사전에 *명의 리뷰를 받도록 강제로 설정할 수 있음.

    • gitlab : 해당 git repo Settings - Merge request (MR) approvals

  • environments 로 dev, staging, production 을 설정하여 환경을 구분하고 배포 관련한 작업을 연관시킬 수 있음

gitlab CICD

build - test - deploy staging - deploy production

test 에서 문제가 없으면 staging 에는 자동으로 배포를 하지만 production 환경에 배포를 할 경우에는 수동으로 진행을 하도록 구성을 하였음.

각 environments 에서 배포기록을 볼 수 있고 손쉽게 ui에서 과거의 특정 git revision 으로 롤백을 할 수도 있음.

 

gitlab 예제

https://docs.gitlab.com/ee/ci/examples/README.html

기타

test의 경우 단위테스트, 성능테스트 등 다양한 테스트가 있으나 여기에서는 설명 생략

배포전략의 경우도 blue/green, 카나리, 롤링 업데이트등 다양하며 여기에서는 설명 생략