2 분 소요

GitHub 를 사용하여 단순한 CI(Continuous Integration)를 구성하는 방법을 소개하는 글입니다.


Prerequisite

이 문서는 다음 환경을 기반으로 작성했습니다.




GitOps 소개

GitOps 는 쿠버네티스에서 실행되는 앱을 유지 관리하고 업데이트 하는 빠르고 안전한 방법입니다.

GitOps 의 주요 구성요소는 다음과 같습니다:

GitOps = IaC + MRs + CI/CD
  • IaC: Infrastructure as code
  • MRs: uses Merge Requests
  • CI/CD: GitOps automates infrastructure updates using a Git workflow with continuous integration and continuous delivery

GitOps CI/CD 파이프라인.




파이프라인 소개

elio 프로젝트를 사용하여 파이프라인을 설명하겠습니다.
먼저, 샘플 프로젝트 elio 를 소개하겠습니다.


elio

elio 는 epoll 기반의 네트워크 라이브러리 입니다.
elio/app/herald 는 라이브러리를 사용한 샘플 앱으로
emqx 메시지 브로커의 pub/sub 을 테스트할 수 있습니다.

  • 실행하기
    $ git clone https://github.com/cppis/elio-state
    $ cd elio-state
    $ helm install herald herald
    
  • 테스트하기
    $ telnet localhost 33133
    

    NodePorts are in the 30000-32767 range by default.



파이프라인 구조

elio 파이프라인.



저장소




CI(Continuous Integration)

GitHub Action 을 사용하여 GitHub 저장소에서 직접 사용자 지정 CI(지속적 통합) 및
CD(지속적 배포) Workflow 를 만들 수 있습니다.


Action Secret 저장하기

Action 을 실행할 때 필요한 정보를 저장합니다.
Settings > Secrets > Actions 에 Docker Hub 계정과 비밀번호를 저장합니다.

  • DOCKER_USERNAME: Docker Hub 계정
  • DOCKER_PASSWORD: Docker Hub 계정 비밀번호



GitHub Action Workflow

GitHub 저장소만 있으면 GitHub Action Workflow 를 만들고 실행할 수 있습니다.

Workflow 는 저장소의 .github/workflows 에 있는 파일입니다.

Workflow 에 대한 소개는 GitHub Actions 를 위한 빠른 시작을 참고하세요.


elioWorkflow 확인하기

  • build-app.yml:
    dev 브랜치에 push 하면, ./app 내의 모든 프로젝트를 Go 1.16 버전으로 빌드합니다.
    name: Build App
    
    on:
      push:
        branches: [dev]
      pull_request:
        branches: [dev]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
    
          - name: Set up Go
            uses: actions/setup-go@v2
            with:
              go-version: 1.16
    
          - name: Build
            run: go build -v ./app/...
    
          - name: Test
            run: go test -v ./...
    
  • publish-app.yml:
    tagspush 하면, app/herald 를 도커허브 cppis/herald 에 배포하고,
    소개 문서를 업데이트합니다.

    name: Publish App
    
    on:
      push:
        # Sequence of patterns matched against refs/tags
        tags:
          - "v*" # Push events to matching v*, i.e. v1.0
    
    jobs:
      push_to_registry:
        name: Push Docker image to Docker Hub
        runs-on: ubuntu-latest
        steps:
          - name: Check out the repo
            uses: actions/checkout@v2
    
          - name: Log in to Docker Hub
            uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
            with:
              username: $
              password: $
    
          - name: Extract metadata (tags, labels) for Docker
            id: meta
            uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
            with:
              images: cppis/herald
    
          - name: Build and push Docker image
            uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
            with:
              context: .
              file: app/herald/k8s-resources/Dockerfile
              push: true
              tags: $
              labels: $
    
          - name: Image digest
            run: echo $
    
          - name: Docker Hub Description
            uses: peter-evans/dockerhub-description@v2
            with:
              username: $
              password: $
              repository: cppis/herald
              readme-filepath: app/herald/hub.md
    


Workflow 확인하기

  • GitHub 저장소 이름 아래에서 Actions 를 클릭합니다.
  • 왼쪽 사이드바에서, 원하는 Workflow 를 선택합니다.
  • 만약 수동으로 실행하기 원한다면, Run workflow 를 선택합니다.
  • 브랜치 드롭다운에서 workflow 브랜치를 선택하고, 파라미터를 입력한 후. Run workflow 를 클릭합니다.


Workflow 생성하기(선택)

.github/workflows 에 새 Workflow 파일을 추가하려면, GitHub: 새 파일 생성하기를 참고하세요.

GitHub Action 의 상태를 뱃지로 쉽게 추가할 수 있습니다.


도커 허브 확인하기

Workflow 가 성공하면, 도커 허브에서 cppis/herald 를 확인합니다.

elio 파이프라인.

peter-evans/dockerhub-description GitHub Action 을 사용하여 소개 문서도 확인할 수 있습니다.




참고자료

GitOps

GitHub

댓글남기기