[Jenkins] Jenkins 활용하여 자동으로 배포 해보기

Posted on May 24, 2022

관련 글 묶음

우선 에이전트에 hugo가 없으므로 직접 다운로드 후 설치해야한다. 데비안 계열은 apt에 있어서 설치하면 됐는데 dnf에는 없어서 직접 설치해주었다.

$ wget https://github.com/gohugoio/hugo/releases/download/v0.99.1/hugo_0.99.1_Linux-64bit.tar.gz
$ tar -xvzf hugo_0.99.1_Linux-64bit.tar.gz
# mv hugo /usr/local/bin/

플러그인 설치

이제 자동으로 배포하기 위한 Jenkinsfile을 작성해야 하는데 그 전에 플러그인으로 hugo와 ssh pipeline steps를 설치해야한다. 사실 휴고는 sh ‘hugo’ 해도 상관없을 것 같긴 하다

Jenkinfile

node {
    stage('Checkout SCM') {
      checkout([
        $class: 'GitSCM',
        branches: [[name: 'master']],
        extensions: [[$class: 'SubmoduleOption',
                      disableSubmodules: false,
                      parentCredentials: false,
                      recursiveSubmodules: true,
                      trackingSubmodules: false]],
        userRemoteConfigs: [[
          url: 'git@git.bumpsoo.dev:bumpsoo063/hugo_blog.git',
          credentialsId: 'bumpsoo',
        ]]
      ])
    }

    stage('Build') {
        hugo baseUrl: 'https://bumpsoo.dev/', destination: 'public', environment: ''
    }
    def remote = [:]
    remote.name = "bumpsoo.dev"
    remote.host = "bumpsoo.dev"
    remote.port = 포트
    remote.allowAnyHosts = true
    withCredentials([sshUserPrivateKey(credentialsId: 'hugo-ssd', passwordVariable: 'password', usernameVariable: 'username')]) {
        remote.user = username
        remote.password = password
        stage("Deploy") {
            sshCommand remote: remote, command: 'rm -rf /blog'
            sshPut remote: remote, from: 'public', into: '/'
            sshCommand remote: remote, command: 'mv /public /blog && nginx -s reload'            
        }
    }
}

테스트 단계는 없어서 3단계로 나눌 수 있다. 우선 깃 소스에서 확인한 후 빌드하여서 배포를한다. 확인할 때는 credential의 ssh키를 사용하여서 하였고, 빌드는 hugo 플러그인으로 하는데 기본 destination값이 .public으로 되어 있어서 익숙한 값으로 수정해주었다. 이때 테마를 위해 서브모듈을 가져올 수 있게끔 해주었다.(recursiveSubmodules: true) 배포단계에서는 remote라는 변수를 하나 생성해서 값을 넣어주었고 sshDelete가 아니라 Command를 사용한 이유는 blog 디렉토리가 없을 경우에는 exception을 내뿜어서 제대로 배포할 수 없기 때문에 이런 식으로 해주었다.