GitHub Action으로 CI/CD 구축하기
개요
- 깃허브 액션은 깃허브에서 제공하는 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/[email protected]
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/[email protected]
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
Author And Source
이 문제에 관하여(GitHub Action으로 CI/CD 구축하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sgwon1996/GitHub-Action으로-CICD-구축하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)