GitHub Action을 이용해 GitOps 구성하기

Hoone·2021년 5월 28일
1

GitOps

GitOps는 클라우드 네이티브 애플리케이션을 위한 지속적인 배포를 구현하는 방법입니다.

제가 이해한 바로는
Kubernetes 환경에서 지속적인 배포를 자동화 하기 위해 git과 배포도구(ArgoCD 등)를 이용하는 방법이라고 생각합니다.
Kubernetes 배포를 위한 설정 파일들을 git에 올려놓고 git의 내용이 변경되면 자동으로 배포가 이루어지는 방식입니다.

gitops_cd_pipeline

출처: https://www.weave.works/technologies/gitops/

자동 배포를 위한 도구

  • ArgoCD
  • flux

ArgoCD

git 저장소의 설정파일이 수정되면 Kubernetes에 배포를 해주는 자동화 도구입니다.

GitHub Action

GitHub 저장소에서 CI/CD 자동화를 할 수 있게 해주는 도구입니다.

예를들어 Push에 대해 Build, Test, Deploy 작업 코드를 작성해 놓으면 개발자가 작업물을 Push할 때 자동으로 작성된 스크립트가 실행이 됩니다.

GitHub Action을 이용해서 PR(pull request)가 생성이 되면 Build와 Test를 진행하고
Merge가 되면 배포 이미지 Build 와 Push 그리고 Kubernetes 설정파일 업데이트가 이루어지고
자동으로 배포가 되는것까지 구성을 해보았습니다.

물론 이것은 테스트를 위한 구성이고 실무 환경에서는 달라질 것 입니다.
그것은 이후에 추가로 구성해보겠습니다.

Workflow

  1. 개발자가 코드 수정 후 저장소로 push 한다.
  2. PR(Pull Request)를 생성한다.
  3. CI Action이 실행된다.
    A. 애플리케이션 build
    B. 코드 test
  4. Main 브랜치에 merge한다.
  5. CD Action이 실행된다.
    A. 애플리케이션을 이미지로 build한다.
    B. 이미지 저장소로 push 한다.
    C. 설정파일을 내려받고 수정한다.
    D. 설정파일 저장소로 push한다.
  6. ArgoCD에서 설정파일 저장소의 수정 내용을 kubernetes에 apply한다.

CI 구성하기

GitHub에 샘플로 올려놓은 Laravel project에 CI를 구성해보겠습니다. 샘플 코드

GitHub Action 등록

Action 탭을 누르면 아래와 같은 화면이 나옵니다.
처음에 구성할때는 내 환경과 맞는 미리 구성된 workflow를 가져와서 수정해도 됩니다.
하지만 이미 구성을 했기 때문에 set up a workflow yourself 를 눌러서 들어갑니다.
github-action-register

기본적인 코드들이 들어있습니다. 코드를 수정하고 파일명을 넣고 Start commit을 눌르면 등록이 됩니다.
github-action-register-new

제가 작성할 CI의 내용은 다음과 같습니다.
.github/workflows/ci.yml

# Workflow 이름
name: CI

# pull request가 생성되면 작동
on:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      fail-fast: true
      matrix:
        php: [8.0]
        laravel: [^8.0]

    # 작업 이름
    name: PHP ${{ matrix.php }} - Laravel ${{ matrix.laravel }}

    services:
      # mysql 서비스 생성
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: example_app
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    steps:
      # 애플리케이션에 필요한 PHP 확장 모듈 설치
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip
          tools: composer:v2
          coverage: none
      
      # 코드 checkout
      - uses: actions/checkout@v2

      # .env 파일 생성
      - name: Copy .env
        run: php -r "file_exists('.env') || copy('.env.example', '.env');"
      # 애플리케이션 의존성 패키지 설치
      - name: Install Dependencies
        run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
      # 애플리케이션 npm 패키지 설치
      - name: Install NPM Dependencies
        run: npm install
      # 애플리케이션 Key 생성
      - name: Generate KEY
        run: php artisan key:generate
      # public 저장소 연결
      - name: Create symbolic storage link
        run: php artisan storage:link
      # Test 실행
      - name: Execute tests (Unit and Feature tests) via PHPUnit
        run: php artisan test

작성 후 commit을 합니다. 이때 새 브랜치를 같이 생성합니다.
github-action-ci-commit

PR(pull request) 생성

PR이 생성될 때 작동하기 때문에 PR(pull request)를 생성합니다.
github-pull-request-write
Create pull request을 눌러서 생성이 되면 아래와 같이 CI가 실행됩니다.
CI가 완료되기 전에는 Merge pull request가 비활성화 됩니다.
github-pull-request
CI가 성공으로 통과가 되어야 Merge pull request가 활성화가 됩니다.
github-pull-request-complete

Next

여기까지 CI 구성을 해보았고 다음글에서 Merge 이후 배포작업이 이루어지는 CD 구성을 해보겠습니다.

References:

GitOps: https://www.weave.works/technologies/gitops/
GitHub Action: https://docs.github.com/en/actions

profile
도움이 되고픈 개발자

6개의 댓글

comment-user-thumbnail
2023년 2월 6일

example gitops pipeline 그림에서 updater가 git config 로 화살표 가는게 어떤 의미인가요?
레포는 기본적으로 개발자가 올리는 어플리케이션 repo 그리고 관리자가 올리는 쿠버라면 쿠버 메니페스트 레포 두개인가요? 근데 저 화살표 의미를 모르겠습니다.
그리고 ci.yaml에서 소스 통합 CI인데...안에 내용은 뭘 설치하고 그러는데.....
ci.yaml 용도를 모르겠습니다. CI 소스통합인데 ....어플리케이션 개발자가 깃 레포에 올리면 그걸 이미지로 만드는 과정을 적는 파일이 ci.yaml인지요? npm install이 있고,,,저걸 어디에다 설치하겠다는건지... 소스코드는 어디있는데 어떻게 머지하고 이미지로 만드는코드는 어딨는지..
ci 샘플코드가 깃허브에 있던데 그렇게 다 모여있으면 ci는 끝이 아닌가요? 왜 어디에다 install을 하고 ci.yaml은 대체 왜 필요한건지..벌써 서버에 배포를 하겠다는건지...ㅠㅠ ..대체 이해가 안가네요 ㅠㅠ

1개의 답글