[컴] jenkins pipeline 예시

젠킨스 파이프라인 사용법 / 예시 / 예제 / example /

jenkins pipeline 예시

  • git plugin / ssh-agent plugin 이 필요하다.
  • ssh -f 를 사용해야 한다. 그렇지 않으면 java application 을 실행하고, agent 가 return 을 하지 못하고 계속 떠있게 된다.
  • 아래 pipeline 은 대략적으로 다음과 같은 일을 한다.
    1. git checkout / ssh credential (참고로 이를 위해서, public/private key 를 만들어서 이 키를 git site 에 deploy key 를 추가하고, jenkins 에도 git credential 을 추가한다.)
    2. gradle clean assemble
    3. sshagent 를 이용해서 remote server 로 file 전송
    4. remote server 에서 kill / java 실행
// ref: https://www.jenkins.io/doc/book/pipeline/
pipeline {
    agent any
    environment {
        DEPLOY_HOST = 'my.host.co.kr'
        DEPLOY_HOST_DIR = '/home/myuser/apiserver'
    }
    stages {
        stage('Build') {
            steps {
                // Get some code from a GitHub repository
                // ref: https://www.jenkins.io/doc/pipeline/steps/git/
                checkout scmGit(
                    branches: [[name: '*/master']],
                    userRemoteConfigs: [[
                        credentialsId:  'my-git-id',
                        url: 'https://mygitrepo.com/myrepo_url']])


                // Run gradle on a Unix agent.
                sh "chmod +x ./gradlew"
                sh "cd \$WORKSPACE && ./gradlew -PbuildProfile=prod clean assemble"

            }
        }
        stage('Deploy') {
            steps {
                sh """#!/bin/bash
                echo ${env.DEPLOY_HOST}
                """
                // https://plugins.jenkins.io/ssh-agent/
                sshagent(credentials: ['my-credential']) {
                    //
                    // `pidMyApp` variable :
                    //   ps aux --sort=-pid | grep "[M]yApp" | grep -v zsh | sed -n '1p' | awk '{print $2}'
                    //

                    sh """#!/bin/bash
                    echo ${env.DEPLOY_HOST}

                    cd \$WORKSPACE/build/libs/

                    jarfilename=\$(ls -t *.jar | head -n 1)
                    filenameNoExt=\${jarfilename%.*}
                    newJarFilename=\$filenameNoExt-\$(date +%Y%m%d.%H%M%S).jar
                    echo \$newJarFilename

                    # --------
                    # send to the remote server
                    # --------
                    scp -oStrictHostKeyChecking=no \$jarfilename ${env.DEPLOY_HOST}:${env.DEPLOY_HOST_DIR}/\$newJarFilename

                    # --------
                    # run command in the remote-server
                    #
                    # -f option:
                    #     https://stackoverflow.com/questions/19996089/use-ssh-to-start-a-background-process-on-a-remote-server-and-exit-session/22364328#22364328
                    # '\$var' : varialbe of this script
                    # '\\\$var' : variable of the script for the remote-server
                    # --------
                    ssh -f -oStrictHostKeyChecking=no ${env.DEPLOY_HOST} \"
                        echo \"remote-server actions\"
                        pwd
                        pidMyApp=\\\$(ps aux --sort=-pid | grep \\\"[M]yApp\\\" | grep -v zsh | sed -n '1p' | awk '{print \\\$2}')

                        # --------
                        # restart
                        # --------
                        sudo kill \\\$pidMyApp
                        sudo nohup java -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -jar ${env.DEPLOY_HOST_DIR}/\$newJarFilename --spring.profiles.active=prod &
                    \"

                    """
                    
                }
            }
            post {                
                success {
                    sh "echo SUCCESS"
                }
            }
        }
    }
}

jenkins directory

  • Backing-up/Restoring Jenkins

  • $JENKINS_HOME/workspace: build 나 build 에 필요한 파일등을 설치 하는 것들은 이곳에서 작업하게 된다.

  • $JENKINS_HOME/jobs

See Also

  1. Pipeline NPM Integration | Jenkins plugin : npm build 를 위한 plugin, 이 plugin 은 단순히 node 설정을 사용할 수 있게 해주는 역할인듯 하다. 실제적으로 jenkins 서버에 node는 따로 설치를 해야 하는 듯 하다.(불확실)
  2. 쿠...sal: [컴] github 는 어떻게 ssh:// 를 지원할까?

댓글 없음:

댓글 쓰기