logo头像
Snippet 博客主题

使用Jenkins进行持续集成

本文于639天之前发表,文中内容可能已经过时

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

安装Jenkins

首先我们去Jenkins官方网站下载最新的部署包(.war):Jenkins.
因为我是在Linux平台部署,需要注意的是Jenkins是基于Java构建的,所以我们必须安装好JDK系列的依赖才行.
Linux安装JDK时候先卸载本身自带的OpenJDK再进行安装,并配置好环境变量.JDK安装我不在累述,读者可自行百度.

1
2
# 通过wget方式下载Tomcat和Jenkins安装包
[root@localhost bin]# wget http://mirrors.jenkins.io/war/latest/jenkins.war

下载完成后会在当前目录出现jenkins.war,因为Jenkins内嵌Jetty服务器(也可以部署在Tomcat容器里),可以执行如下命令启动.

1
[root@localhost bin]# java -jar jenkins.war

执行以下命令,会打印出如下日志信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Running from: /usr/local/bin/jenkins.war
webroot: $user.home/.jenkins
二月 06, 2018 11:19:44 上午 Main deleteWinstoneTempContents
警告: Failed to delete the temporary Winstone file /tmp/winstone/jenkins.war
二月 06, 2018 11:19:44 上午 org.eclipse.jetty.util.log.Log initialized
信息: Logging initialized @1303ms to org.eclipse.jetty.util.log.JavaUtilLog
二月 06, 2018 11:19:44 上午 winstone.Logger logInternal
信息: Beginning extraction from war file
二月 06, 2018 11:19:47 上午 org.eclipse.jetty.server.handler.ContextHandler setContextPath
警告: Empty contextPath
二月 06, 2018 11:19:47 上午 org.eclipse.jetty.server.Server doStart
信息: jetty-9.4.z-SNAPSHOT
二月 06, 2018 11:19:47 上午 org.eclipse.jetty.webapp.StandardDescriptorProcessor visitServlet
信息: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
二月 06, 2018 11:19:48 上午 org.eclipse.jetty.server.session.DefaultSessionIdManager doStart
信息: DefaultSessionIdManager workerName=node0
二月 06, 2018 11:19:48 上午 org.eclipse.jetty.server.session.DefaultSessionIdManager doStart
信息: No SessionScavenger set, using defaults
二月 06, 2018 11:19:48 上午 org.eclipse.jetty.server.session.HouseKeeper startScavenging
信息: Scavenging every 600000ms
Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins
二月 06, 2018 11:19:49 上午 org.eclipse.jetty.server.handler.ContextHandler doStart
信息: Started w.@f9b7332{/,file:///root/.jenkins/war/,AVAILABLE}{/root/.jenkins/war}
二月 06, 2018 11:19:49 上午 org.eclipse.jetty.server.AbstractConnector doStart
信息: Started ServerConnector@2baa8d82{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
二月 06, 2018 11:19:49 上午 org.eclipse.jetty.server.Server doStart
信息: Started @6419ms
二月 06, 2018 11:19:49 上午 winstone.Logger logInternal
信息: Winstone Servlet Engine v4.0 running: controlPort=disabled
二月 06, 2018 11:19:52 上午 jenkins.InitReactorRunner$1 onAttained
信息: Started initialization
二月 06, 2018 11:19:52 上午 jenkins.InitReactorRunner$1 onAttained
信息: Listed all plugins
二月 06, 2018 11:19:56 上午 jenkins.InitReactorRunner$1 onAttained
信息: Prepared all plugins
二月 06, 2018 11:19:56 上午 jenkins.InitReactorRunner$1 onAttained
信息: Started all plugins
二月 06, 2018 11:19:56 上午 jenkins.InitReactorRunner$1 onAttained
信息: Augmented all extensions
二月 06, 2018 11:19:59 上午 jenkins.InitReactorRunner$1 onAttained
信息: Loaded all jobs
二月 06, 2018 11:19:59 上午 hudson.eureka1-server.AsyncPeriodicWork$1 run
信息: Started Download metadata
二月 06, 2018 11:20:00 上午 jenkins.InitReactorRunner$1 onAttained
信息: Completed initialization
二月 06, 2018 11:20:02 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@fabd330: display name [Root WebApplicationContext]; startup date [Tue Feb 06 11:20:02 CST 2018]; root of context hierarchy
二月 06, 2018 11:20:02 上午 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@fabd330]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1452b2bc
二月 06, 2018 11:20:02 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1452b2bc: defining beans [authenticationManager]; root of factory hierarchy
二月 06, 2018 11:20:02 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@1a724d6e: display name [Root WebApplicationContext]; startup date [Tue Feb 06 11:20:02 CST 2018]; root of context hierarchy
二月 06, 2018 11:20:02 上午 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@1a724d6e]: org.springframework.beans.factory.support.DefaultListableBeanFactory@7be61840
二月 06, 2018 11:20:02 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7be61840: defining beans [filter,legacy]; root of factory hierarchy
二月 06, 2018 11:20:03 上午 jenkins.install.SetupWizard init
信息:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

00caaea4ac874d4db11cb31c27e5c7ce

This may also be found at: /root/.jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
二月 06, 2018 11:21:34 上午 hudson.eureka1-server.UpdateSite updateData
信息: Obtained the latest update center data file for UpdateSource default
二月 06, 2018 11:21:37 上午 hudson.eureka1-server.UpdateSite updateData
信息: Obtained the latest update center data file for UpdateSource default
二月 06, 2018 11:21:37 上午 hudson.WebAppMain$3 run
信息: Jenkins is fully up and running
二月 06, 2018 11:21:37 上午 hudson.eureka1-server.DownloadService$Downloadable load
信息: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller

启动成功后,浏览器输入http://192.168.64.128:8080,则会进入以下界面:
启动界面
获取口令有好几种方式:

  1. 上述启动日志里,这里口令为:00caaea4ac874d4db11cb31c27e5c7ce
  2. /root/.jenkins/secrets/initialAdminPassword
    复制口令填充进去并点击继续则进入下列界面:
    安装界面
    这里我们选择安装推荐的默认安装方式,Jenkins就自动配置好了一些常用插件.最后,创建一个admin用户,完成安装.
    首页

    Jenkins配置

    安装完成后,我们需要手动配置一些插件.如JDK,Maven,Git,Gradle等常用插件.
  3. 首页——>系统管理—-> 全局工具管理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 下载maven-Dmaven.test.skip=true
    vi seting
    <localRepository>/usr/local/bin/apache-maven-3.5.2/repository</localRepository>
    <mirrors>
    <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    </mirrors>

配置全局的maven配置
配置全局的maven
Git我们选择默认安装,JDK手动去配置.

  1. 首页——>系统管理—-> 管理插件—–>可选插件—->过滤——>输入:Maven Integration plugin或者Git plugin—–>选择性安装插件
    插件配置

构建自动化部署

Git项目地址: https://gitee.com/ltalex/GitCeShi.git
在Jenkins首页选择新建任务,如下
部署1
部署2
部署3
部署4
部署5
部署6

以下配置表示maven构建结束后执行的脚本(Execute shell)

1
2
3
4
/usr/local/eureka/stop.sh
/usr/local/eureka/replace.sh
# 理论来说可以这样写nohup java -jar xxx.jar &,但是这种配置在jenkis是无效的
BUILD_ID=dontKillMe nohup /usr/local/eureka/startup.sh &

停止脚本

1
2
3
4
5
6
7
8
9
# 将应用停止
#stop.sh
#!/bin/bash
echo "Stopping SpringBoot Application"
pid=`ps -ef | grep eureka1-server.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill -9 $pid
fi

备份脚本

1
2
3
4
5
6
7
8
9
#replace.sh 用于将上次构建的结果备份,然后将新的构建结果移动到合适的位置
#!/bin/bash
# 先判断文件是否存在,如果存在,则备份
file="/usr/local/eureka/eureka1-server.jar"
if [ -f "$file" ]
then
mv /usr/local/eureka/eureka1-server.jar /usr/local/eureka/backup/eureka1-server.jar.`date +%Y%m%d%H%M%S`
fi
mv /root/.jenkins/workspace/Test/target/eureka1-server.jar /usr/local/eureka/eureka1-server.jar

启动脚本

1
2
3
4
5
6
# startup.sh 启动项目
#!/bin/sh
echo "授予当前用户权限"
chmod 777 /usr/local/eureka/eureka1-server.jar
echo "执行....."
java -jar /usr/local/eureka/eureka1-server.jar

点击立即构建,Console会出现如下信息:
部署7
部署8

部署成功后,访问http://192.168.64.128:8099/,如下图:
成功1
成功2

遇到的问题

  1. 在部署的时候会出现java -jar出现没有主清单属性的问题,那是因为项目中Pom文件没有配置SpringBoot插件,导致在jar包中MANIFEST.MF文件没有启动信息
    1
    2
    java -jar eureka1-server.jar
    eureka1-server.jar中没有主清单属性

解决方案:

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

  1. 构建成功后的脚本,即Execute shell尽量执行远程的shell脚本,不要直接在里面启动项目,因为项目启动后会一直停留,Jenkins就是构建成功也不会停止当前项目的构建状态.
  2. 可以定制构建出发器,当我们希望push一些东西能够立马构建项目时,可在构建触发器中勾选Poll SCM日程表表填写表达式:* * * * *
支付宝打赏 微信打赏

请作者喝杯咖啡吧