Jenkins pipeline+Docker SpringBootプロジェクトSSHAgentに配備(+欠落通知)


https://velog.io/@mooh 2 j/jenkins-pipeline-Docker SpringBootプロジェクト-導入
以前のブログではjenkins pipelineを使用してjenkinsをインストールしたインスタンスにjenkinsを配備していました.
今回は,SSHを介してリモートAWS EC 2インスタンスにリモート配備する操作を実施した.

jenksnの実行


既存のインストールjenkinsインスタンスでdockerイメージを使用してjenkinsを実行します.
docker run -d -p 8080:8080 --name=jenkinscicd -v /jenkinsDir:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock mooh2jj/myjenkins
チェック
  • Jenksn実行ログ
  • docker logs [jenkins 컨테이너ID]

    Jenkins pipelineの設定


    jenkinsのホームページに入り、pipeline設定を使用してItemを作成します.
    以前のブログでjenkinsfileをPipeline>Pipleline script from SCMに設定した場合
    パイプライン構文を使用したPipleline scriptの作成から開始します.

    これはPipeline Syntaxを使用するためです.Pipeline Syntaxは、SSHまたは他のCredentailの設定におけるパイプ構文に非常に有用である.
    パイプを作成する順序は次のとおりです.
  • Jenkins例:git clone -> gradle build -> docker build -> docker push
  • ssh例:docker pull -> docker run
  • 順番に操作する.
    Jenkinsfileはspringprojectの真下にあります.Dockerfileも同じ位置に置くべきです.

    Jenkins pipeline順序

    # 다음과 같은 순서로 동작하는 파이프라인이 완성된다.
    
    1. jenkins인스턴스 git clone
    2. jenkins인스턴스 gradle build
    3. jenkins인스턴스 docker build
    4. jenkins인스턴스 docker push
    5. jenkins인스턴스 -> server인스턴스 ssh접속
    6. server인스턴스 docker pull
    7. server인스턴스 docker run
    Jenkinsfile
    pipeline{
        agent any
    
        stages {
    
            stage('Prepare') {
                agent any
    
                steps {
                    git credentialsId: 'git-creds', url: 'https://github.com/mooh2jj/docker-jenkins-pipleline-test.git'
                }
    
                post {
    
                    success {
                        echo 'prepare success'
                    }
    
                    always {
                        echo 'done prepare'
                    }
    
                    cleanup {
                        echo 'after all other post conditions'
                    }
                }
            }
    
            stage('Build Gradle') {
                steps{
                    sh 'chmod +x gradlew'
                    sh  './gradlew clean build'
    
                    sh 'ls -al ./build'
                }
            }
            stage('Docker build image'){
                steps{
                    sh 'docker build . -t mooh2jj/docker-jenkins-pipeline-test'
                }
            }
            stage('Docker push image') {
                steps {
                    withCredentials([string(credentialsId: 'docker-pwd', variable: 'dockerHubPwd')]) {
                        sh "docker login -u mooh2jj -p ${dockerHubPwd}"
                    }
                    sh 'docker push mooh2jj/docker-jenkins-pipeline-test'
                }
    
                post {
                    success {
                        echo 'success'
                    }
    
                    failure {
                        echo 'failed'
                    }
                }
            }
            stage('Run Container on SSH Dev Server'){
                steps{
                    echo 'SSH'
                    sshagent (credentials: ['ubuntu-server']) {
                        sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker pull mooh2jj/docker-jenkins-pipeline-test'"
                        sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker ps -q --filter name=docker-jenkins-pipleline | grep -q . && docker rm -f \$(docker ps -aq --filter name=docker-jenkins-pipleline)'"
                        sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker run -d --name docker-jenkins-pipleline -p 8080:8080 mooh2jj/docker-jenkins-pipeline-test'"
                    }
    
                }
    
            }
    
        }
    }

    Jenkins build



    画面で、「Build Now」をクリックしてjenkins buildを実行します.Stage Viewの進捗状況は、次のように表示されます.
    失敗した場合は、左下のBuild Historyで詳細ログを表示したり、コンソールoutでログを表示したりできます.
    パイプラインが失敗していない場合は、docker hubで画像が更新されていることがわかります.

    SSHをEC 2インスタンスに接続する


    sshでjenkinsインスタンスからサーバインスタンスに接続してdockerイメージの引き出しと実行を実行するには、まず
    jenkinsにsshagent pluginをインストールする必要があります.
    以前と同様、Dashboard->Jenkins 관리->플러그인 관리ssh agent를 검색」ボタンと「今すぐチェックしてダウンロードしてインストール」ボタンをクリックし、再起動します.

    サーバインスタンスにsshを接続するためにCrementailを登録する必要があります.
    この画面は、前のPipeline Syntaxウィンドウに入ると、対応する設定に入ることができます.

    Kind DropboxからSSH Username with private keyを選択します.
    IDはサーバインスタンスのユーザ名である(ec 2 ubuntuはubuntu)
    Usernameは、パイプラインコードで識別されるキー値(私はubuntu-serverと呼ぶ)である.
    Private Keyで書くのは
    私は狦狦です!
    -----BEGIN RSA PRIVATE KEY----- 
    
    ~~~~~ ssh 인스턴스의 pem 파일을 클릭하면 나옵니다
    
    -----END RSA PRIVATE KEY-----
    これらの内容をすべて入力し、「Add」をクリックします.

    ここでpipeline構文でgenerateの内容を直接jenkinfileに入れればいいです
    このように整理されたssh接続pipeline stageは以下のようになります.
     pipeline {
        agent any
        stages { 
            stage('SSH SERVER EC2') {
              steps {
                echo 'SSH'
                
                sshagent(['credentail 식별 값']) {
                    sh 'ssh -o StrictHostKeyChecking=no [user name]@[ip address] "whoami"'
                    sh "ssh -o StrictHostKeyChecking=no [user name]@[ip address] 'docker pull [이미지 이름]:[태그 이름]'"
                    sh "ssh -o StrictHostKeyChecking=no [user name]@[ip address] 'docker run [이미지 이름]:[태그 이름]'"
                }
              }
           }
        }
    }
    jenkinsパイプが稼働している場合
    docker psコマンドを使用して、sshインスタンスでサービスが実行されていることを確認できます.

    その後、server인스턴스의 pem 파일내용に登録され、springfootプロジェクトpipeline script from SCMに設定されます.

    Jenkins Snake Notification設定


    Jenkins pipeline scriptでは、Jenkinsfileを設定できます.
    Jenkinsでは、slack Notificationslack 플러그인には、次のブログが含まれています.
    https://velog.io/登録
    「」を参照してください.
    Jenkins pipeline
    ### jenkins pipeline stage 추가
    stage("Slack Notification") {
                steps {
                    echo 'slack test'
                }
                post {
                    success {
                        slackSend channel: '#프로그래밍', color: 'good', message: "success deploy"
                    }
                    failure {
                        slackSend channel: '#프로그래밍', color: 'danger', message: "failure deploy"
                    }
                }
            }
    結果

    リファレンス


  • ソース:https://github.com/mooh2jj/docker-jenkins-pipleline-test.git

  • https://kanoos-stu.tistory.com/55?category=1024343

  • https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#string-interpolation

  • https://www.jenkins.io/doc/book/pipeline/syntax/

  • https://www.youtube.com/watch?v=gdbA3vR2eDs