基于Jenkins实现项目部署

Jenkins 有很多中创建任务的方式,这里,我只测试了常用的三种方式,来实现简单的自动化部署,分别是 Freestyle、Pipeline、Open Blue Ocean。

假设,我们有一个项目,放在 Git 上维护,部署在 slave-web-1、slave-web-2 两台服务器上,基于 Jenkins , 来实现自动化部署。

服务器信息说明:

域名IP作用
master192.168.1.1部署 jenkins、 maven 服务
slave-web-1192.168.1.2业务部署服务器
slave-web-2192.168.1.3业务部署服务器
scm172.31.2.189git 等项目仓库服务器

下面,我们用三种不同的方式来实现自动化部署。

1、自由风格(Freestyle)

首先,进入新建任务页,填写项目名称,选择 “Freestyle project”,点击 “确定”,进入构建配置页面。

然后,在 “源码管理” 区域,填写项目在 Git 的信息。(需要 Jenkins 服务器拥有从 Git 服务拉取项目的权限)

下一步,在 “构建” 区域,可以编写项目构建的脚步。例如:mvn clean package。(这里的项目是一个静态脚本项目,构建操作是将项目打包)

最后,选择 “Send files or execute commands over SSH”,点击 “Add Server”,配置部署节点 “SSH Server” 信息。多少部署节点就对应多少配置信息。

SSH Server 配置:

  • Name: 部署节点IP或Host(配置Host,需要在 Jenkins 服务器上配置 Host 信息)
  • Source files: 需要发送的源文件地址,该地址是相对路径(相对于 {jenkins_home}/workspace/{JOB_NAME}
  • Remove prefix: 排除的目录或文件
  • Remote directory: 源文件在远程节点存放的相对目录(相对于 “节点管理” 中 “远程工作目录” 的路径,详细请看 持续集成工具 — Jenkins
  • Exec command: 在远程部署节点需要执行的脚本命令(可是解压项目、停止服务,重启服务等操作)

这样,执行任务构建操作(或者在 Open Blue Ocean 界面执行运行操作),就可以将项目发送到部署节点。

2、流水线(Pipeline)

相对于 FreestylePipeline 更加灵活,尤其是有很多部署节点时,Pipeline 更加适用。使用 Pipeline,需要先了解 Pipeline 的语法,可以看 Pipeline Syntax 和 Pipeline 入门

首先,进入新建任务页,填写项目名称,选择 “Pipeline”,点击 “确定”,进入构建配置页面。

根据需要,可以选择构建触发器。

然后,编写 Pipeline 脚本。

Pipeline 脚本分 Declarative Pipeline 和 Scripted Pipeline。这里采用的是 Scripted Pipeline

node('master') {
    def mvnHome
    def jdkHome
    def workspace = pwd()

    def clusterNodes="web-1,web-2,web-3,web-4"
    def clusterNodesArray = clusterNodes.split(",")

    stage('Ready') {
        mvnHome = tool 'MAVEN_HOME'
        jdkHome = tool 'JAVA_HOME'

        echo "------------------------------------------"
        sh "'${mvnHome}/bin/mvn' -v"

        echo "------------------------------------------"
        sh "'${jdkHome}/bin/java' -version"

        echo "------------------------------------------"
        echo "current path: ${workspace}"

        echo "------------------------------------------"
        echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
        echo "BUILD_DISPLAY_NAME: ${env.BUILD_DISPLAY_NAME}"
        echo "JOB_NAME: ${env.JOB_NAME}"
        echo "NODE_LABELS: ${env.NODE_LABELS}"
        echo "WORKSPACE: ${env.WORKSPACE}"
        echo "JOB_URL: ${env.JOB_URL}"
        echo "BRANCH_NAME: ${env.BRANCH_NAME}"

        timeout(time: 60, unit: 'SECONDS') {
            input message: "this action will stop service, are you sure you want to execute?", ok: "yes"
        }        

    }

    stage('Build') {
        git 'git@scm-git:/home/git/repo/spring-boot-test.git'

        sh "'${mvnHome}/bin/mvn' -DshipTests clean package"
        echo "build number: ${currentBuild.number}"
        echo "build result: ${currentBuild.result}"
        echo "build currentResult: ${currentBuild.currentResult}"
        echo "build displayName: ${currentBuild.displayName}"

        sh "cd ${env.WORKSPACE} && true"

        if (currentBuild.currentResult == 'SUCCESS') {
            echo "BUILD SUCCESS"

        }else {
            echo "BUILD FAILED"
        }
    }

    stage('Deploy') {
        timeout(time: 60, unit: 'SECONDS') {
            for (slave in clusterNodesArray) {
                echo "publish project to ${slave}"
                sh """
                    scp -r target/spring-boot-test.tar.gz user@${slave}:/work/app/jenkins/upload

                    ssh user@${slave} "service tomcat stop && cd /work/app/auto-deploy && sh +x ./bin/service-dubbo-common.sh"
                """
            }
        }

        echo "all slave node are deployed."
    }

    stage('Verify') {
        echo "verify service."
        for (slave in clusterNodesArray) {
            timeout(time: 5, unit: 'SECONDS') {//超时设置
                echo "verify ${slave} url"
            }
        }
    }
}

脚本说明:

  • 第一步(Ready):构建准备工作,查看构建环境,让操作者进行操作任务,防止误操作。
  • 第二步(Build):构建项目,通过 git 获取最新项目,通过 maven 打包构建。
  • 第三步(Deploy):遍历所有节点,将打包项目发布到所有节点,并执行相关命令。
  • 第四部(Verify):验证所有节点服务。

3、Open Blue Ocean

BlueOcean 重新考虑了 Jenkins 的用户体验。BlueOcean 由 Jenkins Pipeline 设计,但仍然兼容自由式工作,减少了团队成员的混乱,增加了清晰度。

我们模仿 Pipeline 构建项目的方式,来创建一个 BlueOcean 任务。

首先,在 BlueOcean 界面,点击 “创建流水线”,进入构建页面。选择代码仓库,并填写相关信息(可能会生成一个认证key,需要将 key 加到 代码仓库服务器上)。

进入 Pipeline 构建页面,默认会有一个 Start 阶段,在这里,可以配置 Pipeline 的全局变量和参数。

点击 Start 后面的 “+”,可以添加阶段。填写阶段名称,然后添加该阶段包含的步骤,步骤类型有很多种,根据需要进行选择。

例如,我们选择 “Shell Script” 类型。

添加完所有阶段后,最终图形如下:

以上三种方式,更倾向于采用 Pipeline 。BlueOcean 虽然方便、简介,但是还需要完善。

运行

在 BlueOcean 主界面或任务列表界面,都可以运行任务。

例如:在 BlueOcean 界面运行任务,可以查看详细的信息输出。

如果执行失败,会终止运行,并提示错误信息。

也可以直接在任务列表点击 “构建” 来运行。在 “Stage View” 可以查看每一阶段的执行时间和结果。

除此之外,还有许多其它高级应用,在今后的使用过程中,逐步学习。

4、注意事项

4.1、从节点环境变量问题

使用 ssh 启动 Tomcat 项目时,可能会遇到下面错误信息。

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

At least one of these environment variable is needed to run this program

这个错误是因为环境变量是通过 /etc/profile 配置的原因导致。

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置

/etc/bashrc: 为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc)

查看 /etc/bashrc 代码,发现它会引用 /etc/profile.d/ 下的所有 .sh 文件。所以,解决这个问题有两种方式:

  • 1、将环境变量配置到 /etc/bashrc
  • 2、将环境变量配置到 /etc/profile.d/ 下(推荐)

注意:
如果是服务自启动脚本,通过 rc.local 调用 shell,也会出现无法找到环境变量的错误,因为系统的任何一个用户都没有登录过,这种情况下,可以在 rc.local 调用 shell 前,加载用户环境变量 source /etc/profile

4.2、进程问题

通过 SSH 远程运行从节点脚本时,远程会话结束以后会把 SSH 下的所有子进程干掉。这时,就可能出现 Tomcat 启动成功了,过一会进程消失了,但是在节点服务器运行脚本又不会消失的现象。

有两种解决方法:

1、在脚本中加入 nohup 来执行关键命令;

nohup ${TOMCAT_HOME}/bin/startup.sh > /dev/null 2>&1 &

2、在 Jenkins 的节点管理中增加变量。

key=BUILD_ID
value=DONTKILLME

参考

9 Replies to “基于Jenkins实现项目部署”

  1. Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Enjoy Watching Free Teen Sex Video Clips And Hot Teen Porn Movies. Browse Teen Anal, Amateur, Asian, Hardcore, Lesbian And Many Others Young Xxx Brynne Heinrick Houlberg

  2. Have you ever thought about creating an e-book or guest authoring on other blogs?
    I have a blog based on the same information you discuss and would love to have you share some stories/information. I know my audience would
    value your work. If you’re even remotely interested,
    feel free to send me an e mail.

发表评论

邮箱地址不会被公开。