带有docker和git的Jenkins声明性管道

带有docker和git的Jenkins声明性管道,jenkins,continuous-integration,jenkins-pipeline,devops,continuous-delivery,Jenkins,Continuous Integration,Jenkins Pipeline,Devops,Continuous Delivery,我正在尝试使用git和dockers为NodeJS应用程序构建一个管道。我制作了一个声明性的Jenkins文件,从中一切工作都很顺利。我已将SCM Poll设置为每两分钟一次,并且它被正确调用,但问题在于旧管道仍在运行,因此新的Poll会排队等待下一个可用的执行器。我想知道我是否都做对了,我缺少了什么 我的完整代码可以找到 我已尝试使用和在deliver.sh文件中创建npm start以使其在守护程序模式下运行,并使用Jenkinsfile中的输入消息选项阻止管道完成,否则仅使用“npm st

我正在尝试使用git和dockers为NodeJS应用程序构建一个管道。我制作了一个声明性的Jenkins文件,从中一切工作都很顺利。我已将SCM Poll设置为每两分钟一次,并且它被正确调用,但问题在于旧管道仍在运行,因此新的Poll会排队等待下一个可用的执行器。我想知道我是否都做对了,我缺少了什么

我的完整代码可以找到

我已尝试使用deliver.sh文件中创建npm start以使其在守护程序模式下运行,并使用Jenkinsfile中的输入消息选项阻止管道完成,否则仅使用“npm start&”而不使用“输入消息”管道到达管道末端,创建的应用程序容器将被杀死。我相信这种做法是不对的。然后我使用了npm start,没有&和wihtout输入消息,调用时进行了scm轮询,管道也开始执行阶段,但由于最后一个容器已经发布到端口3000,显然它不会发布新的到3000,因此管道返回错误

Dockerfile

FROM node:alpine

COPY . .

EXPOSE 3000
pipeline {
    triggers {
        pollSCM 'H/2 * * * *'
    }
    agent { dockerfile {
        args '-p 3000:3000'
    }
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
                // input message: 'Finished using the web site? (Click "Proceed" to continue)'
                // sh './jenkins/scripts/kill.sh'
            }
        }
    }

}
Jenkinsfile

FROM node:alpine

COPY . .

EXPOSE 3000
pipeline {
    triggers {
        pollSCM 'H/2 * * * *'
    }
    agent { dockerfile {
        args '-p 3000:3000'
    }
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
                // input message: 'Finished using the web site? (Click "Proceed" to continue)'
                // sh './jenkins/scripts/kill.sh'
            }
        }
    }

}
deliver.sh脚本

# set -x
# npm start &
npm start
# sleep 1
# copying process ID of npm start to file name pidfile, this id will
# be used when the user press any key to stop the app
# echo $! > .pidfile
# set +x
在此方面的任何帮助都将不胜感激。

添加

disableConcurrentBuilds()
在“选项”部分中,以防止两个版本同时运行

pipeline {
    triggers {
        pollSCM 'H/2 * * * *'
    }
    agent { dockerfile {
        args '-p 3000:3000'
    }
    options {
        disableConcurrentBuilds()
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
                // input message: 'Finished using the web site? (Click "Proceed" to continue)'
                // sh './jenkins/scripts/kill.sh'
            }
        }
    }

}

我认为问题来自
agent
指令。你可以想象一个代理可以允许多少个作业并行运行。如果代理允许6个并行作业,它将提供6个执行器。如果作业在主节点上运行,请检查其设置,否则请检查具有
docker
label的节点/从属节点的设置。谢谢。但如果有任何并发应用程序正在运行,因为我的目的是只运行带有来自github的新提交代码的应用程序,并且该应用程序必须在3000时公开,这样当用户点击3000时,它将获得新的更新应用程序。有什么建议吗?如果这是您自己设置的Jenkins env,您可以使用管理员帐户从“管理Jenkins->管理节点”增加主/从节点的执行器。如果这是一家Jenkins公司,请与Jenkins管理员联系,通过增加Jenkins节点的执行者或将更多节点添加到“docker”标签组来解决此问题。更多关于Jenkins节点的详细信息,以及
docker
label的详细信息:非常感谢您为我的问题抽出时间。我正在共享一个显示完整步骤的视频链接。一切都运行顺利,最后当我将新更改推送到GitHub时,您将看到我必须手动停止最后一个管道构建,新构建将排队等待,直到我停止旧构建。。我在笔记本电脑上使用它,所以salve似乎不是我的选择。即使是这样,问题是如果创建docker容器的旧版本,使用旧代码将其发布到端口3000将与新版本冲突,docker容器将在端口3000上发布,因为Jenkinsfile有3000端口谢谢您为我的问题抽出时间。我正在共享一个显示完整步骤的视频链接。一切都运行顺利,最后当我将新更改推送到GitHub时,您将看到我必须手动停止最后一个管道构建,新构建将排队等待,直到我停止旧构建。。视频链接我唯一的问题是,每当Jenkins从GitHub收到新代码时,旧的正在运行的管道构建就会自动停止,新的管道构建就会启动。任何进一步的帮助都将不胜感激。。。我现在对这个小问题感到无助