Jenkins pipelineバックグラウンドスクリプトの実行と停止

3266 ワード

Pipelineの実行が終了すると、JenkinsはデフォルトでPipelineのサブプロセスをkillします.そのためpipelineでnohup java -jar app.jar > app.log &で起動したjavaバックグラウンドプロセスはPipeline終了後にJenkinsによって殺される.
解決策は次のとおりです.
stage('Deploy') {
	steps {
		script {
			withEnv(['JENKINS_NODE_COOKIE=background_job']) {
				sh """
					nohup java -jar app.jar > app.log &
				   """
			}

		}
	}
}

注意:
  • PipelineではJENKINS_を設定することでNODE_COOKIEはJenkinsがPipelineの後台のサブプロセスをkillしないようにし、Freestyle jobではBUILD_を設定することによってID.
  • 1 Pipelineのバックグラウンドで複数起動するのがscriptである場合、複数のnohup起動コマンドを1つのwithEnv(['JENKINS_NODE_COOKIE=background_job']) {...}に配置して
  • を起動する.
    上記のnohupコマンドは、次のように置き換えることもできます.
    nohup java -jar app.jar > app.log 2>&1 &
    

    またはログを出力しない
    nohup java -jar app.jar > /dev/null 2>&1 &
    

    Killはバックグラウンドプロセスを削除しました:
    sh '''
        if [ `ps -ef | grep runserver | grep venv  | grep python3 | grep -v grep | awk '{print $2}'` ];then
            . .venv/bin/activate
    		ps -ef | grep runserver | grep venv  | grep python3 | grep -v grep | awk '{print $2}' | xargs kill -9 
        fi
    '''
    

    または
    // Stop application through kill process
    PROCESS_ID = sh (script: "ps -ef | grep ${GIT_REPO_PROJECT} | grep java | grep jar | grep -v grep | grep -v pipeline | awk -F ' ' '{print \$2}'", returnStdout: true).trim()
    
    echo "PROCESS_ID=" + PROCESS_ID
    
    if (PROCESS_ID != "") {
        sh """
             echo "Kill process: ${PROCESS_ID}"
             sudo kill -9 ${PROCESS_ID}
            """
    }
    

    参照ドキュメント:
  • https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build
  • https://devops.stackexchange.com/questions/1473/running-a-background-process-in-pipeline-job
  • https://issues.jenkins-ci.org/browse/JENKINS-28182
  • http://excid3.com/blog/running-background-daemon-scripts-with-jenkins

  • JAva not found問題
    最近、nohup java -jar app.jar > /dev/null 2>&1 &コマンドを実行した後、プロセスが開始されなかったという奇妙な問題が発生しました.最初はJenkinsが流水線が終わった後、バックグラウンドのプロセスを殺したのではないかと疑っていたが、半日もやっていなかった.その後、java -jar app.jarを直接運転してから、java not foundであることが分かった.
    もともとこの機械のjdkは標準的な取り付けではなく、/bin/javaが存在しなかったが、Jenkinsの運転時は/binまでコマンドを探していた.
    解決方法:
    #   java    
    which java
    #   /bin/java soft link,  :
    ln -s /home/bin/jdk-13/bin/java /bin/java
    #   /bin/java    
    file /bin/java