Jenkins将Docker代理与环境声明管道一起使用

时间:2019-12-13 10:34:09

标签: jenkins jenkins-pipeline

我想使用Jenkins声明式管道通过docker agent安装maven和npm。但是,当我想在下面的脚本中使用时,詹金斯会抛出如下错误。可能没有使用代理,而是如何通过声明性管道詹金斯将节点与docker代理一起使用。

  

错误:尝试执行一个需要节点上下文的步骤,同时   指定了“无代理人”。确保指定自己的“节点{...}”   使用“无代理”时阻止。

我尝试设置任何座席,但这次我收到错误消息“仍在等待计划任务 等待下一个可用的执行程序”

 pipeline {
    agent none
    // environment{

            proxy = https://
    //      stable_revision = sh(script: 'curl -H "Authorization: Basic $base64encoded" 
    // }

    stages {
        stage('Build') {
            agent {
                docker { image 'maven:3-alpine'}
            }
            steps {
                sh 'mvn --version'       
                echo "$apigeeUsername"
                echo "Stable Revision: ${env.stable_revision}"   
            }
        }
        stage('Test') {
            agent { docker { image 'maven:3-alpine' image 'node:8.12.0' } }
            environment {
                 HOME = '.'
                 }
            steps {
                script{
                    try{
                        sh 'npm install'
                        sh 'node --version'
                        //sh 'npm test/unit/*.js'                
                    }catch(e){
                        throw e
                    }        
                }
            }
        }
        // stage('Policy-Code Analysis') {
        //     steps{
        //         sh "npm install -g apigeelint"
        //         sh "apigelint -s wiservice_api_v1/apiproxy/ -f codeframe.js"
        //     }
        // }
         stage('Promotion'){
            steps{
                timeout(time: 2, unit: 'DAYS') {
                input 'Do you want to Approve?'
                }
            }
        }
        stage('Deployment'){
            steps{
                 sh "mvn -f wiservice_api_v1/pom.xml install -Ptest -Dusername=${apigeeUsername} -Dpassword=${apigeePassword} -Dapigee.config.options=update"
                 //sh "mvn apigee-enterprise:install -Ptest -Dusername=${apigeeUsername} -Dpassword=${apigeePassword} " 
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

基本上,您的错误消息会告诉您所有您需要了解的内容:

  

错误:尝试执行一个需要节点上下文的步骤,同时   指定了“无代理人”。确保指定自己的“节点{...}”   使用“无代理”时阻止。

那么这里的问题是什么?您将agent none用于管道,这意味着您没有为所有stages指定特定的代理。代理执行特定的stage。如果stage没有agent,则无法执行,这是您的问题。

以下2个stage没有agent,这意味着没有docker-container /服务器或任何可以执行的地方。

     stage('Promotion'){
        steps{
            timeout(time: 2, unit: 'DAYS') {
            input 'Do you want to Approve?'
            }
        }
    }
    stage('Deployment'){
        steps{
             sh "mvn -f wiservice_api_v1/pom.xml install -Ptest -Dusername=${apigeeUsername} -Dpassword=${apigeePassword} -Dapigee.config.options=update"
             //sh "mvn apigee-enterprise:install -Ptest -Dusername=${apigeeUsername} -Dpassword=${apigeePassword} " 
        }
    }

因此您必须分别向两个agent { ... }中添加stage或像下面这样使用global agent并从agent中删除stages

 pipeline {
    agent {
        docker { image 'maven:3-alpine'}
    } ...

有关更多信息,请参见guide to set up master and agent machinesdistributed jenkins buildsofficial documentation

答案 1 :(得分:0)

我认为您打算添加agent any而不是agent none,因为每个阶段至少需要一个代理(在管道的顶部或每个阶段都声明)。

此外,我还看到了其他一些问题。 您的Test阶段为同一阶段指定了两个图像。 尽管agent { docker { image 'maven:3-alpine' image 'node:8.12.0' } },您的阶段仅执行npm命令。我相信只会下载其中一张图片。

要进一步阐明mkemmerz答案,请正确设计您的Promotion阶段。如果您打算在管道中包含输入步骤,请不要为管道添加代理,因为输入步骤会阻塞执行程序上下文。看到此链接https://jenkins.io/blog/2018/04/09/whats-in-declarative/