Jenkins 를 통해 GitHub CI/CD Pipeline 구축하기

이번 포스트에서는 Jenkins를 통해 GitHub의 Continuous Integration/Continuous Deployment (CI/CD), 지속적 통합 및 지속적 배포 파이프라인을 구축하는 방법에 초점을 맞춥니다.

GitHub은 협업과 소스 코드 관리를 위한 탁월한 플랫폼이지만, 자동화된 빌드 및 배포 프로세스를 구축하기 위해서는 Jenkins 와 같은 CI/CD 도구의 도움이 필요합니다. 이 글에서는 Jenkins를 활용하여 GitHub 저장소와의 연동, 소스 코드 변경 감지, 자동 빌드 및 배포 설정 등을 설명할 것입니다.

Jenkins가 이미 설치되어 있으며 GitHub 계정이 있다고 가정합니다.

목차

1. GitHub 저장소와 Jenkins 연동 설정
 1-1. GitHub Repository에서 Token 발급
2. Jenkins에서 CI/CD 파이프라인 구성하기
 2-1. Jenkins GitHub 연동 Plugin 설치
 2-2. Jenkins Credentials 생성
 2-3. GitHub Repository Webhooks 설정
 2-4. Pipeline 작성
 2-5. Jenkins Build 테스트

1. GitHub 저장소와 Jenkins 연동 설정

1-1. GitHub Repository에서 Token 발급

Jenkins 에서 GitHub 저장소에 접근할 수 있도록 Personal Access Token을 발급합니다.

Token의 저장소 접근 권한을 설정한 뒤, 발급 받은 token은 다시 볼 수 없기에 따로 저장합니다.

2. Jenkins에서 CI/CD 파이프라인 구성하기

2-1. Jenkins GitHub 연동 Plugin 설치

Jenkins에서 아래 플러그인들을 설치합니다.

  • Generic Webhook Trigger Plugin: Jenkins의 Generic Webhook Trigger 플러그인은 외부 서비스로부터 HTTP POST 요청을 통해 Jenkins 작업을 트리거하는 데 사용됩니다. 이 플러그인을 사용하면 GitHub, GitLab, Bitbucket 등의 소스 코드 관리 시스템과 연동하여 CI/CD 파이프라인을 자동화할 수 있습니다.
  • GitHub Integration Plugin: GitHub Integration 플러그인은 Jenkins와 GitHub 간의 원활한 통합을 제공하여 CI/CD 파이프라인을 구축하는 데 도움을 줍니다. 이 플러그인은 GitHub 웹훅을 트리거로 Jenkins 작업을 실행하고, GitHub API와 상호 작용하여 소스 코드를 가져오고 빌드를 실행합니다.
  • GitHub API Plugin: GitHub API 플러그인은 Jenkins에서 GitHub API를 사용하여 GitHub 리포지토리에 대한 다양한 작업을 수행하는 데 도움을 줍니다. 이 플러그인은 Jenkins에서 GitHub API를 호출하여 코드 변경 내용을 가져오고, 빌드 상태를 GitHub에 보고하는 등의 작업을 수행할 수 있습니다.

2-2. Jenkins Credentials 생성

Jenkins Credentials는 Jenkins에서 사용되는 인증 정보를 안전하게 관리하기 위한 메커니즘입니다. 이를 통해 Jenkins에서 사용되는 비밀번호, API 토큰, SSH 키 등의 민감한 정보를 안전하게 저장하고 관리할 수 있습니다.

Jenkins에 접속하여 Credentials를 생성합니다.

Create 버튼을 누른 뒤, Credentials 생성을 확인합니다.

2-3. GitHub Repository Webhooks 설정

Push Event가 일어날 때, Jenkins와 GitHub 저장소를 연동하기 위해 WebHooks를 설정합니다.

Jenkins 서버의 URL을 작성하고, Add webhook 버튼을 클릭해 Push Trigger Webhook을 추가합니다.

2-4. Pipeline 작성

Repository Push Event 발생 시 동작 할 CI/CD의 파이프라인을 작성하기 위해 Jenkins에서 새로운 Item 추가 버튼을 클릭합니다.

생성 할 프로젝트 이름에서 Pipeline을 선택하고, Name을 작성하여 추가합니다.

GitHub 프로젝트를 체크하고, Repository의 URL 주소를 작성합니다.

Build Trigger 탭에서 GitHub Webhook Trigger 옵션을 체크합니다.

Pipeline 탭에서 Push Event 발생 시 동작할 Pipeline 스크립트를 작성합니다. 해당 파이프라인은 Jenkins가 실행되고 있는 서버 내부에서 동작하는 Script 입니다.

이 Jenkins 파이프라인 스크립트는 다음을 수행합니다:

  1. git pull 단계: ‘dev’ 브랜치에서 코드를 가져옵니다. GitHub의 자격 증명은 github-token을 사용합니다.
  2. build 단계: ‘nginx-****‘ 디렉토리로 이동하여 npm 종속성을 설치하고 빌드합니다.
  3. deploy 단계: ‘nginx-‘ 디렉토리로 이동하여 빌드된 코드를 서버로 전송하고, SSH-Key와 SSH를 사용하여 'backend@175.196.***.***' 서버에서 접속하고 ‘dev_deploy.sh’ 스크립트를 실행합니다.
pipeline {
    agent any
    tools {
        nodejs 'node18'
    }
    
    stages {
        stage('git pull') { // use 'dev' branch
            steps {
                git branch: 'dev', credentialsId: 'github-token', url: 'https://github.com/******-repo/nginx-***-*****.git/'
            }
        }
        
        stage('build') {
            steps {
                sh "pwd"
                dir('nginx-****') {
                    sh "pwd"
                    sh "npm install"
                    sh "npm run build"
                }
            }
        }
        
        stage('deploy') {
            steps {
                sh "pwd"
                dir('nginx-****') {
                    sh "pwd"
                    sshagent (credentials: ['ssh-key']) {
                        sh "scp -r dist/ backend@175.196.***.***:/home/backend/"
                        sh "ssh backend@175.196.***.*** './dev_deploy.sh'"
                    }
                }
            }
        }
        
   		// stage...
   	}
}

2-5. Jenkins Build 테스트

GitHub Repository의 ‘dev’ branch에서 Push Event를 발생 시킵니다.

작성한 스크립트로 인해 자동적으로 Pipeline이 작동하는 것을 확인할 수 있습니다.

마이크로서비스 아키텍처에서 CI/CD를 구현하는 방법에 대해 NGINX STORE에 문의하여 자세히 알아보세요.

아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required