当前位置: 首页 > 知识库问答 >
问题:

Jenkins使用docker代理和环境声明管道

程谭三
2023-03-14

我想使用 Jenkins 声明式管道通过 docker 代理安装 maven 和 npm。但是当我想使用以下脚本时,詹金斯会抛出如下错误。它可能使用代理无,但我如何通过声明式管道 jenkins 将节点与 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个答案

严修德
2023-03-14

我认为您的意思是添加agent any而不是agentnone,因为每个阶段至少需要一个代理(要么在管道的顶部声明,要么在每个阶段声明)。

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

为了进一步澄清 mkemmerz 答案,您的晋升阶段设计正确。如果计划在管道中包含输入步骤,请不要为管道添加代理,因为输入步骤会阻止执行程序上下文。请参阅此链接 https://jenkins.io/blog/2018/04/09/whats-in-declarative/

贾成天
2023-03-14

基本上,您的错误消息会告诉您您需要知道的一切:

错误:在指定“代理无”时尝试执行需要节点上下文的步骤。使用“代理无”时,请务必指定您自己的“节点{…}”块。

那么这里的问题是什么?您对管道使用代理 none,这意味着您不会为所有阶段指定特定的代理。代理执行特定阶段。如果一个阶段没有代理,则无法执行,这是您的问题。

下面的2个阶段没有agent,这意味着没有docker容器/服务器或任何可以执行它的地方。

     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} " 
        }
    }

因此,您必须将代理 { ... } 单独添加到两个阶段,或者使用全局代理,如下所示并从阶段中删除代理

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

有关更多信息,请参见设置主计算机和代理计算机或分布式jenkins版本的指南或官方文档。

 类似资料:
  • 问题内容: 我正在尝试获得一个如下所示的声明性管道: 问题是,我希望能够基于任意条件覆盖ENV1或ENV2的值。我目前的需求只是将其作为分支机构的基础,但我可以想象更复杂的情况。 有没有理智的方法来实现这一目标?我在网上看到了一些类似的示例: 但是我相信这并没有设置实际的环境变量,而是设置了一个局部变量,该局部变量将覆盖以后对ENV1的调用。问题是,我需要由nodejs脚本读取这些环境变量,而这些

  • 问题内容: 我正在尝试这样做 结果: null / build / 如何使用全局环境创建环境? 问题答案: 我认为您应该使用: 就像在“环境”步骤中一样,您正在定义环境变量,以后可以通过 env.your-variable-name访问

  • 问题内容: 我正在使用声明性管道语法在Docker容器中执行一些CI工作。 我注意到,用于Jenkins的Docker插件使用主机中jenkins用户的用户ID和组ID运行一个容器(即,如果jenkins用户具有用户ID 100和组ID 111,它将运行管道以创建带有命令)。 我遇到了一些问题,因为该容器将以不存在的用户运行(特别是我遇到了用户没有主目录的问题)。所以我想到了创建一个Dockerf

  • 我对Bitbucket管道(Beta版)和Docker很陌生,以前没有配置项集成的经验 我遵循了这个问题,但是对于初学者没有明确的描述 我正在尝试使用docker容器为Android项目在Bitbucket管道中设置持续集成(CI) 我遵循的步骤 步骤1.已安装Docker软件工具。已成功安装。 第二步。已成功创建虚拟机 错误出现: Docker-机器详细信息 码头机环境

  • 我刚开始使用Jenkins声明性管道。在我支持一些类似的项目时,我考虑将类似的管道步骤(甚至阶段)放入可重用的构建块中。这些区块应保持在一个中心点,然后由单独的管道包括在内(例如:干燥)。 我将共享库视为脚本化管道的一个选项,但我不确定它是否也适用于声明性管道。 你知道在Jenkins声明性管道中使用像构建块这样的东西的方法吗? 举例说明: 如果您有一个用于Maven项目的标准管道(例如Sprin

  • 问题内容: 我 又 通过詹金斯声明管道运行的泊坞权限问题。我想通过Docker容器中的Jenkins作业构建和发布Python包: 但是,由于以下原因,我不被允许: + python -m pip install -r requirements.txt –user –no- cache要求已经满足:/usr/local/lib/python3.7/site-packages中的setuptools

  • 问题内容: 我有一个在Jenkins主服务器上运行过的Jenkins声明式管道,并且运行良好。但是,既然我已经尝试在从属节点上执行此操作,则在管道中调用的常规脚本无法访问工作空间中的文件。 我的jenkinsfile看起来像这样… 我可以在从站上看到它正在创建工作区,从git进行检出并正确执行脚本。但是,如果脚本中的某些内容尝试与工作空间中的文件进行交互,它将失败。 如果我有这样简单的事情… …它

  • 我有一个Jenkins声明性管道,我一直在Jenkins master上运行,它工作得很好。但是,现在我已经开始尝试在从属节点上执行此操作,管道中调用的groovy脚本无法访问工作区中的文件。 我的文件看起来像这样。。。 我可以在从机上看到它正在创建工作区,从git执行签出,并正确执行脚本。但是,如果脚本中的某些内容尝试与工作区中的文件交互,则会失败。 如果我有像这样简单的东西... ...它说找