본문 바로가기
IT/etc

jenkins 원격지 배포 환경 구축

by honeybear 2023. 3. 7.

이전 포스팅에서 젠킨스 구축을 완료하였고, 이번에는 로컬 PC에서 GitHub에 커밋하면 자동으로 웹서비스 서버(웹서버)의 소스 파일을 업데이트하고 빌드 및 배포하는 작업을 생성해 보려고 합니다.

 

젠킨스가 설치된 서버와 웹서버가 별도로 구축되어 있으며, GitHub에 소스 코드가 push 되면 자동으로 젠킨스에서 웹서버로 SSH를 통해 접속하여 빌드 및 배포하는 작업을 수행합니다.

 

소스코드 변경 확인

소스 코드가 변경될 때마다 실시간으로 젠킨스에 알림을 보내기 위해 GitHub에서 제공하는 webhook 기능을 활용하였습니다. webhook은 프로젝트에 변경 사항이 있을 때 특정 서버에 알림(Trigger)을 줄 수 있는 기능으로 젠킨스의 GitHub plugin을 통해 이러한 알림을 수신할 수 있습니다.

 

Github webhook 설정

Repository - Settings - Webhook 메뉴

  • Payload URL : 젠킨스 서버 URL/github-webhook/
  • Content Type : Application/json

 

젠킨스 github plugin 설치

 

 

서버 접속을 위한 자격 증명 추가

Github과 웹서버에 SSH로 접속할 수 있는 자격 증명을 추가하여 줍니다.

 

SSH 자격 증명

젠킨스에 SSH agent Plugin을 추가하여 줍니다. 해당 Plugin은 private key를 통해 ssh 접속을 할 수 있는 기능을 제공하고 있습니다.

$ sudo ssh-keygen -t rsa -b 4096

위 명령어로 생성된 pub 확장자를 가진 public key는 웹서버의 ~/.ssh 폴더에 등록 하고 private key는 젠킨스 관리 - Manage Credientials 에 추가 하여 줍니다.

 

  • Kind : SSH username with private key
  • ID : 사용자 지정 ID (pipeline 작성 시 필요)
  • Private Key : Private Key 파일 내용 붙여 넣기

 

 

Github Token 생성

사용자 계정 - Settings - Developer Settings - Personal access tokens 에서 New personal access token (Classic) 을 선택하여 access token을 생성합니다. Note에는 이름을 입력하고, Scope에는 repo와 admin:repo_hook를 선택하여 줍니다.

 

Generate Token을 클릭하면 비밀번호가 표시 되는데 이 내용을 잘 복사하여 젠킨스에 등록을 합니다. 

젠킨스 관리 - Manage Credientials - New credentials 에서 Username with password 를 선택 후 내 GitHub ID와 이전 생성한 Token의 비밀번호를 입력하여 줍니다.

 

 

 

자동화 작업 생성

젠킨스에서 제공하는 pipeline을 통해 웹서버 접속 → 소스 업데이트 → 빌드 → 배포 할 수 있는 작업을 생성할 수 있습니다. pipeline은 여러 작업(빌드, 테스트, 배포 등)을 수행하는 단계를 정의해놓은 작업의 묶음 입니다.

 

메인 화면의 새로운 Item을 클릭한 뒤, 사용할 이름과 Pipeline을 선택 후 OK를 클릭합니다.

 

 

항목 중 Github Project에 Project에 URL을 입력하고 GitHub hook trigger for GITScm pooling 을 체크하여 줍니다.

 

마지막으로 webhook trigger를 수신 받으면 실행 할 Script를 작성 합니다.

pipeline {
    agent any
    
    environment {
        CREDENTIAL_ID = 'github credential ID'
        PROJECT_URL = 'Project URL'
        BRANCH = 'main'
    }
    
    stages {
        stage('Checkout') {
            steps {
                git url: "$PROJECT_URL",
                branch: "$BRANCH",
                credentialsId: "$CREDENTIAL_ID"
            }
        }
        stage('Build') {
            steps {
                sshagent (credentials:['ssh Agent ID']) {
                    sh """
                    ssh -o StrictHostKeyChecking=no root@127.0.0.1 '
                    cd ~/workspace && git pull && npm run build && pm2 restart myproject
                    '
                    """
                }
            }
        }
    }
}

 

스크립트는 두 단계의 stage로 구성되어 있으며 첫번째 stage에서는 github의 소스 코드를 젠킨스에 다운 받는 단계로 이전 입력한 GitHub Token의 Credential ID와 Project URL, branch 정보를 입력하여 줍니다.

 

두번째 stage에서는 ssh agent plugin 을 통해 웹서버에 접속하여 쉘 스크립트를 실행 하며 SSH 자격 증명 단계에서 생성한 Credientials ID를 입력하여 줍니다. 다음 서버에 접속하여 실행할 명령어들을 작성하여 줍니다. 저는 git pull, npm run build, pm2 restart 명령을 통해 소스 업데이트, 빌드, 배포 하는 방식으로 설정을 하였습니다.

 

댓글