GitHub Action으로 CI/CD 구축하기

.·2022년 3월 29일
15
post-thumbnail

개요

  • 깃허브 액션은 깃허브에서 제공하는 CI/CD 플랫폼으로 빌드,테스트,배포를 자동화 시키는 파이프라인을 만들 수 있습니다.
  • 깃허브는 리눅스, 윈도우, 맥 가상 서버를 지원하며 사용자가 원하는 환경에 self-hosted runner를 통해 자신만의 서버를 구성할 수도 있습니다.
  • 이번 글에서는 깃허브 액션을 통해 깃허브에 소스코드가 올라오면 테스트,이미지 빌드, 업로드, 이미지 교체를 자동으로 수행하는 파이프라인을 구축해보겠습니다.

GitHub Action 구성 요소

Workflow

  • 한개 이상의 job을 실행할 수 있는 자동화된 작업
  • YAML 파일로 저장되며 event에 의해 실행 됩니다.

Event

  • workflow 실행을 발동시키는 특정한 활동
  • 깃허브에 소스코드를 푸시하면 발생하는 push event, pull request event, issue event 등 깃허브에서 발생하는 대부분의 작업을 event로 정의할 수 있습니다.

Jobs

  • 한가지 러너안에서 실행되는 여러가지 step들의 모음
  • 각각의 step들은 일종의 shell script 처럼 실행이 됩니다.
  • Step들은 순서에 따라 실행되며 Step 끼리 데이터들을 공유할 수 있습니다.
  • Job은 다른 Job에 의존관계를 가질 수 있으며, 병렬 실행도 가능합니다.

Actions

  • 복잡하고 자주 반복되는 작업을 정의한 커스텀 어플리케이션
  • workflow 파일 안에서 자주 반복되는 코드를 미리 정의해 코드의 양을 줄일 수 있습니다.
  • 깃허브 마켓플레이스를 통해 공용 Action 또는 다른 사람들이 만든 Action을 사용할 수 있습니다.

예시

name: learn-github-actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v

name

  • workflow의 name을 정의
  • 선택사항이며 깃허브 저장소의 깃허브 액션 탭에서 workflow의 이름을 보여 줍니다.

on

  • 해당 workflow를 실행시키는 이벤트를 정의
  • push 이벤트가 발생했을 때 workflow가 실행되도록 정의

jobs

  • check-bats-version - job의 이름을 정의
  • runs-on : 어떤 호스트에서 실행될지 정의 - ubuntu 가상 머신에서 실행 되도록 정의

Steps

  • uses: actions/checkout@v2 - 해당 레포지토리를 pull 받고 이동하는 action 대부분의 workflow에서 사용
  • uses: actions/setup-node@v2 - 노드를 설치하는 action으로 가상머신안에는 대부분의 프로그래밍 언어가 설치되어 있지 않기 때문에 프로젝트 실행에 필요한 언어들을 action을 통해 다운
  • run: npm install -g bats - run 키워드를 통해 러너가 실행되는 서버에서 명령어를 실행

GitHub Action으로 CI/CD 구축하기

  • 깃허브에 특정 태그를 푸시하면 jib로 이미지를 빌드. 도커 허브로 푸시, 로컬 클러스터로 배포를 진행하는 workflow를 만들어 보겠습니다.
  • 코드를 수정하면 이전 글에서 만들었던 로컬 클러스터에 배포되어 있는 Deployment의 이미지를 교체하는 것을 최종 목표로 합니다.

GitHub Action 시작하기

  • 깃허브 Repository의 Actions 탭으로 가면 GitHub Action Workflow 파일을 작성 할 수 있습니다.
  • 처음 workflow를 생성할 때는 깃허브에서 적절한 Template를 제공
  • 원하는 템플릿을 선택하면 해당 템플릿을 바탕으로 workflow를 자유롭게 만들 수 있으며 저장소의 .github/workflows 에 yaml 파일이 생성

Secret 환경 변수 등록하기

  • 깃허브에서는 organization, Repository에 Secret 변수를 등록
  • 해당 변수를 workflow에서 사용하면 workflow의 로그에서는 환경변수로 나오며 해당 값을 노출 시키지 않습니다.

  • Repository Setting에서 Secert 탭으로 들어가면 환경변수 설정 가능
  • Docker Hub 접속에 필요한 username,password 클러스터 접속에 필요한 kubeconfig를 환경변수로 저장

마켓플레이스 사용하기

  • 깃허브 마켓플레이스에서 다른 사용자들이 올려놓은 깃허브 액션을 사용할 수 있습니다.
  • use 문법을 통해 다른 action들을 사용할 수 있으며 action 저장소로 들어가면 해당 action의 사용방법을 확인 할 수 있습니다.

GitHub Action Workflow

name: Gradle Build & K8S Deploy
# V를 앞글자로 가지는 태그가 push 될 때 해당 workflow 실행 - ex) V2, V3
on:
  push:
    tags: V*

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Login to Docker Hub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}
    
    - name: Grant execute permission for gradlew
      run : chmod +x gradlew
      
    - name: Build with jib
      run: |
        ./gradlew jib \
        -Djib.to.image="zxcvb5434/devopstest:${GITHUB_REF##*/}"
        
  deploy:
    
    needs: build
    runs-on: ubuntu-latest
    
    steps:
    
    - uses: actions/checkout@v2
    
    - name: update yaml file
      run: |
        sed -i s/latest/${GITHUB_REF##*/}/ ./k8s/deployment.yaml
        cat ./k8s/deployment.yaml
    
    - name: Kubectl apply
      uses: steebchen/kubectl@v2.0.0
      with: 
        config: ${{ secrets.KUBECONFIG }}
        command: apply -f ./k8s/deployment.yaml

Trigger

name: Gradle Build & K8S Deploy
on:
  push:
    tags: V*
  • Workflow의 이름을 Gradle Build & K8S Deploy로 정의
  • V를 앞글자로 가지는 태그가 푸시될 때 해당 workflow 실행

Build

    runs-on: ubuntu-latest

    steps:
    
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Login to Docker Hub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}
    
    - name: Grant execute permission for gradlew
      run : chmod +x gradlew
      
    - name: Build with jib
      run: |
        ./gradlew jib \
        -Djib.to.image="zxcvb5434/devopstest:${GITHUB_REF##*/}"
  • checkout Action을 통해 레포지토리를 다운받은 폴더로 이동
  • setup-java Action을 통해 java 11 설치
  • Docker Hub로 이미지를 푸시하기 위해 docker login action을 통해 자격정보 획득
  • ${{ secrets.DOCKERHUB_USERNAME }}를 통해 시크릿 환경 변수 사용
  • run 명령어를 통해 ubuntu에서 특정 명령 실행
  • chmod +x gradlew 명령어를 통해 권한을 조정한 후 gradlw jib 명령을 통해 이미지 빌드 후 컨테이너 레지스리로 업로드
  • 깃허브 액션은 workflow가 실행될때 기본 환경 변수가 제공 됨 - 커밋 sha, tag name 등
  • ${GITHUB_REF##*/} - 를 통해 TAG 이름을 사용

Deploy

  deploy:
    
    needs: build
    runs-on: ubuntu-latest
    
    steps:
    
    - uses: actions/checkout@v2
    
    - name: update yaml file
      run: |
        sed -i s/latest/${GITHUB_REF##*/}/ ./k8s/deployment.yaml
        cat ./k8s/deployment.yaml
    
    - name: Kubectl apply
      uses: steebchen/kubectl@v2.0.0
      with: 
        config: ${{ secrets.KUBECONFIG }}
        command: apply -f ./k8s/deployment.yaml
  • needs 문법을 통해 build job이 성공적으로 완료될 때만 수행
  • sed 명령어를 통해 Repositroy에 Deployment yaml 파일의 tag 수정
  • latest 태그를 깃허브 태그 이름으로 수정
  • kubectl action을 통해 kubectl apply 명령 실행

깃허브 액션 실행 및 결과 확인

  • V5 Tag를 붙여서 깃허브로 푸시를 하면 workflow가 실행

  • 깃허브 저장소의 Actions 탭에서 workflow 실행 결과 확인 가능

  • 각 Step들의 로그를 확인

  • 최종적으로 deployment의 이미지 태그가 수정

  • 해당 서버로 접속해보면 기존 version 1 에서 version 5로 자동으로 교체

정리

  • CI/CD를 구축하기 위해 깃허브에서 제공해주는 GitHub Action을 사용할 수 있습니다.
  • Source Code Pull, jib를 통한 컨테이너 이미지 빌드 및 업로드, kubectl를 통한 이미지 배포 3가지 과정을 지닌 CI/CD 파이프라인을 GitHub Action을 통해 구축했습니다.
  • GitHub에 V로 시작하는 태그를 푸시하면 깃허브가 제공하는 가상 머신에서 소스코드를 pull, jib를 통한 이미지 빌드, docker hub로 이미지 업로드, kubectl apply를 통한 이미지 교체 작업이 실행 됩니다.
  • 다른 서비스에 접근하기 위한 인증 정보는 Secret 변수를 통해 관리 합니다.
  • GitHub Action Marketplace와 use 문법을 통해 다른 사람들이 작성한 workflow를 사용할 수 있습니다.

Reference

profile
지금부터 공부하고 개발한것들을 꾸준하게 기록하자.

0개의 댓글