CI/CD with Minikube

(2) GitHubAction-Jenkins

Younghoon Yun
KLleon
9 min readSep 2, 2022

--

들어가며

프로그램 실행에 필요한 환경을 이미지로 만들어 컨테이너 환경에서 애플리케이션을 운영하는 방식이 주류를 이루게 되면서, 컨테이너 오케스트레이션 시스템이 중요하게 여겨지기 시작했습니다. 또한 코드를 업데이트할 때 거쳐야 하는 테스트 및 빌드를 자동화하는 파이프라인 역시 컨테이너 레벨에서 진행할 수 있게 되었습니다.

이번 글에서는 Minikube에 Jenkins와 GitHub Actions Runner를 배포하여, GitHub Actions와 Jenkins로 CI를 구축하는 방법을 다루도록 하겠습니다.

CI란?
CI란 Continuous Integration의 약자입니다. 새로운 코드가 기존 코드에 병합된 후 프로덕션에 적용되기 이전에 진행되어야 하는 코드 테스트나 이미지 빌드 등의 과정을 자동화하여, 코드에 업데이트가 있을 때마다 자동화된 파이프라인이 트리거 되게 하는 것을 의미합니다.

jenkins & github action

다양한 CI 구축 툴 중, 이번 CI 구축에서 사용할 툴인 GitHub Actions와 Jenkins를 파이프라인 순서대로 다루도록 하겠습니다.

GitHub Actions

GitHub Actions는 GitHub에서 관리되고 있는 레파지토리에서 사용 가능한 서비스로, 특정 이벤트가 레파지토리에 발생했을 때 파이프라인을 트리거 시키는 방식으로 작동합니다.
GitHub Actions를 원하는 레파지토리에 적용하기 위해서는 해당 레파지토리에 workflow 파일을 작성하여야 하고, 파이프라인을 실행할 프로그램인 github actions runner를 준비해야 합니다.

1. Work flow
GitHub Actions를 적용하고자 하는 레파지토리에 생성해야 하는 파일로, .github/workflows/ 경로의 디렉토리에 yaml 파일로 생성하게 됩니다.

name: example
on:
pull_request:
types: [opened, synchronize]
branches:
- main
- develop
jobs:
test:
runs-on: self-hosted
steps:
- name: Checkout
uses: actions/checkout@v2

- name: Run Test
run: python3 test.py

위와 같이 작성하며 on에는 파이프라인을 트리거 하는 이벤트의 타입과 브랜치를 기입하고 jobs에 파이프라인의 구성을 정의합니다.

jobs는 크게 runs-on과 steps로 나뉘는데 runs-on에서는 파이프라인을 실행할 runner를 어떤 runner로 할지 기입하는 부분입니다. runner는 뒤에서 더 자세히 다루도록 하겠습니다.

steps는 파이프라인에서 실행되는 작업들을 의미합니다. 위 예시에서는 actions/checkout@v2를 통해 코드를 가져오고, python3 test.py를 통해 테스트를 실행하는 것을 볼 수 있습니다.

2. GitHub Actions Runner
위에서 정의한 workflow의 작업들은 runner에서 실행하게 되는데, 크게 두 가지 방식으로 runner를 설정할 수 있습니다.

첫 번째는 github에서 제공하는 github hosted runner를 사용하는 것입니다. github에서는 runner를 실행할 수 있도록 VM을 제공하고 있습니다. 커스텀한 환경에서 파이프라인을 실행하지 못한다는 단점이 있지만, 별도로 runner를 사용자가 직접 실행해둬야 하는 등의 번거로움이 없어 이용이 용이합니다.

두 번째는 사용자가 직접 환경을 구성한 머신( 또는 컨테이너)에서 runner를 실행시키는 self hosted runner를 사용하는 것입니다. github hosted runner와 달리 사용자가 직접 구성한 환경에서 파이프라인을 진행할 수 있다는 장점이 있지만, runner 관리와 환경을 직접 구성해야 하기 때문에 이용이 보다 복잡합니다.

하지만 작업의 특성상 프로그램 실행에 필요한 패키지를 설치해야 하는 경우가 많으므로 두 번째 방법인 self hosted runner를 이용하는 것을 기본으로 진행하도록 하겠습니다.

create runner(1)
create runner(2)

self hosted runner는 setting 탭의 actions/runners에서 생성 가능하며, 위 커맨드를 입력하여 생성 및 실행할 수 있게 됩니다.

Jenkins

Jenkins는 CI 서비스의 제공을 메인으로 하고 있는 툴로, Jenkins를 사용자에 맞게 배포하고 GUI를 통해 이용할 수 있도록 합니다. Jenkins 파이프라인 생성에 필요한 Jenkinsfile 및 과정에 대해 이야기하도록 하겠습니다.

1. Deploy

Jenkins는 공식적으로 지원하고 있는 Helm Chart를 이용하여 Minikube에 배포할 수 있습니다. 고정 url 없이 localhost로도 배포가 가능하며, 고정 ip:port나 도메인으로도 배포가 가능합니다.

배포는 Jenkins 공식 사이트의 도큐먼트를 따라 진행하면 되기 때문에 별도로 다루진 않겠습니다.

2. Jenkinsfile

Jenkins에는 GitHub Actions의 workflow 파일과 동일한 역할을 하는 Jenkinsfile 이 존재합니다. 파이프라인 대한 정보를 Jenkinsfile로 작성하게 되며 이를 원하는 레파지토리에 업로드함으로써 적용할 수 있습니다.

pipeline {
agent any
stages {
stage('Clone repository') {
steps {
checkout scm
script {
}
}
}
stage('Example 1') {
steps{
script {
}
}
}
stage('Example 2') {
steps {
}
}
}
}

Jenkinsfile은 위와 같은 형식으로 작성하며, script 안에 원하는 작업을 작성하여 파이프라인을 구성합니다.

3. Pipeline

Jenkinsfile까지 레파지토리에 업로드 완료하였다면, Jenkins GUI에서 파이프라인을 생성함으로써 Jenkins 세팅은 마무리됩니다.

jenkins create pipeline

Jenkins GUI 홈에서 새로운 item 생성을 하면 위와 같은 페이지로 넘어가게 되는데, 여기서 Pipeline 생성을 누르면 다음과 같은 페이지로 넘어가게 됩니다.

Pipeline

위 페이지는 파이프라인 생성과 관련된 설정 페이지로, 특이사항이 없다면 Pipeline 탭에 정보를 입력하는 것만으로도 생성을 완료할 수 있습니다.

set pipeline info

위 사진과 같이 Jenkinsfile을 업로드한 GitHub 레파지토리의 url을 입력하고 파이프라인을 트리거 하는 브랜치들을 입력한 후 저장을 누르면, Jenkins 파이프라인 생성이 완료됩니다.

GitHub Actions와 Jenkins에서 진행할 파이프라인은 구축하였지만, 앞서 언급했던 것과 같이 구축하고자 하는 CI는 Github Actions-Jenkins로 이루어져 있습니다. 이를 위해선 workflow에 Jenkins의 파이프라인을 트리거 하는 step을 추가해야 합니다.

- name: jenkins trigger
uses: appleboy/jenkins-action@master
with:
url: ${{ secrets.JENKINS_WEBHOOK }}
user: "admin"
token: ${{ secrets.JENKINS_API_TOKEN }}
job: "test"

추가 양식은 위와 같습니다. url은 배포한 jenkins의 url을 기입해야 하고, token에는 user의 API Token을 입력해야 합니다.
user의 API Token은 Jenkins GUI의 User 탭에서 원하는 user를 선택 후, 설정 탭에 있는 API Token에서 발행할 수 있습니다.

GitHub Actions와 Jenkins에 각각 필요한 파이프라인을 구성하고, GitHub Actions에 위 스텝을 추가함으로써 CI 구축을 마무리합니다.

마치며

이번 글에서는 GitHub Actions와 Jenkins를 이용하여 CI를 구성하는 방법에 대해서 다루었습니다. 기존에는 사람이 일일이 처리해야 했던 작업들을 자동화함으로써 보다 효율적으로 일을 진행할 수 있는 만큼 진행하고 계신 프로젝트에 적용해 보시면 좋을 듯합니다.

다음 글에서는 서비스 배포로 이어지는 CD를 ArgoCD를 이용하여 구축하는 방법에 대해 다루도록 하겠습니다.

채용공고

저희 Infra 파트는 함께 할 다양한 인재를 기다리고 있습니다.
자격요건, 우대사항 등의 자세한 내용은 채용 페이지에서 확인하실 수 있으며, 이메일(Joinus@klleon.io)로 지원서를 받고 있으니 많은 지원 부탁드립니다.

또, LinkedIn을 통해 R&D Center의 소식을 올리고 있습니다.
앞으로 MLOps Infra 파트의 활동도 자주 올릴 예정이니 많은 관심 부탁드립니다.

궁금하신 것이 있으실 경우 댓글이나 이메일(Joinus@klleon.io)로 연락 주세요.

감사합니다 :)

--

--