构建伟大,无所不能

Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

安装工具

  • Git
  • Maven
  • JDK
  • Ubuntu

说明

我主要使用Jenkins来构建Java的Maven项目,可能覆盖面只限于Java项目,但后面的Jenkins基本安装过程基本可以通用

确认需求

  • 你要用Jenkins来构建什么
  • 构建你的项目会用到那些构建工具
  • 搜索那些构建工具在Jenkins上的配置
  • 搜索相关构建工具的自动化Shell脚本

准备

  • Ubuntu

我所使用的系统,我觉得还是挺好用的。如果不喜欢的换可以的。当然系统安装并不是我所涉及的范围。

  • 系统的更新

当你安装好系统后,你的系统软件包不一定是最新的,所以需要执行一下更新

sudo apt-get update
sudo apt-get upgrade
  • Git
apt install git
  • Maven
cd /opt
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
tar zxvf apache-maven-3.6.1-bin.tar.gz
mv apache-maven-3.6.1 maven
cd ~
vi .bashrc
  • Maven 环境变量
export MAVEN_HOME=/opt/maven
export PATH=${MAVEN_HOME}/bin:${PATH}
  • Maven配置本地仓库
cd /opt
mkdir localrepo
cd /opt/maven/conf
vi settings.xml
<!-- localRepository
 50    | The path to the local repository maven will use to store artifacts.
 51    |
 52    | Default: ${user.home}/.m2/repository
 53   <localRepository>/path/to/local/repo</localRepository>
 54   -->
 55   <localRepository>/opt/localrepo</localRepository>
 56   <!-- interactiveMode
 57    | This will determine whether maven prompts you when it needs input. If set to false,
 58    | maven will use a sensible default value, perhaps based on some other setting, for
 59    | the parameter in question.
 60    |
 61    | Default: true
 62   <interactiveMode>true</interactiveMode>
 63   -->
  • 配置Maven国内源
<mirrors>

    <mirror>
        <id>aliyun-public</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun public</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

    <mirror>
        <id>aliyun-central</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun central</name>
        <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

    <mirror>
        <id>aliyun-spring</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun spring</name>
        <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>

    <mirror>
        <id>aliyun-spring-plugin</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun spring-plugin</name>
        <url>https://maven.aliyun.com/repository/spring-plugin</url>
    </mirror>

    <mirror>
        <id>aliyun-apache-snapshots</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun apache-snapshots</name>
        <url>https://maven.aliyun.com/repository/apache-snapshots</url>
    </mirror>

    <mirror>
        <id>aliyun-google</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun google</name>
        <url>https://maven.aliyun.com/repository/google</url>
    </mirror>

    <mirror>
        <id>aliyun-gradle-plugin</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun gradle-plugin</name>
        <url>https://maven.aliyun.com/repository/gradle-plugin</url>
    </mirror>

    <mirror>
        <id>aliyun-jcenter</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun jcenter</name>
        <url>https://maven.aliyun.com/repository/jcenter</url>
    </mirror>

    <mirror>
        <id>aliyun-releases</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun releases</name>
        <url>https://maven.aliyun.com/repository/releases</url>
    </mirror>

    <mirror>
        <id>aliyun-snapshots</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun snapshots</name>
        <url>https://maven.aliyun.com/repository/snapshots</url>
    </mirror>

    <mirror>
        <id>aliyun-grails-core</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun grails-core</name>
        <url>https://maven.aliyun.com/repository/grails-core</url>
    </mirror>

    <mirror>
        <id>aliyun-mapr-public</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun mapr-public</name>
        <url>https://maven.aliyun.com/repository/mapr-public</url>
    </mirror>

  </mirrors>
  • JDK

Jenkins的JDK推荐使用1.8 编译用的JDK只要是正式发布的应该都可以,OracleJDK和OpenJDK选哪个看个人喜好。

Oracle JDK1.8

OpenJDK11.2

Jenkins的安装

Jenkins的安装有三种方式

第一种

  • 直接运行
    • 下载Jenkins的WAR包
    • 在终端执行命令
java -jar jenkins.war --httpPort=8080
  • 存在问题

当你运行这条命令时你会发现终端上会打印一堆日志这时你访问localhost:8080时可以访问但是你关闭终端时就无法访问了

  • 解决方法
nohup java -jar jenkins.war --httpPort=8080 >output 2>&1 &
  • 关闭Jenkins进程
ps -aux|grep java
kill -9 PID

第二种

安装Tomcat把WAR包直接放到Tomcat webapps工作目录里,然后启动Tomcat

  • Tomcat 安装
cd ~
vi .bashrc
export CATALINA_HOME=/opt/tomcat9
export PATH=${CATALINA_HOME}/bin:${PATH}

第三种

第三种也是我比较推荐的一种就是利用Ubuntu的源进行安装

  • 优点

    • 非常方便
    • apt包管理
    • 开机重启自动启动更省心
  • 将自动安装升级的密匙添加到储存库

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

  • 将源添加到源列表

    • vi /etc/apt/sources.list
    • 添加deb https://pkg.jenkins.io/debian-stable binary /
  • 更新系统源列表

sudo apt-get update

  • 安装

sudo apt-get install jenkins

配置

  • 当你看到如下图片时你就安装成功了

首页

最初始的管理员密码就在首页上写着的路径的文件里vi /Users/shellming/.jenkins/secrets/initialAdminPassword

  • 默认安装推荐的插件就可以

安装推荐的插件

  • 创建新的管理员用户保存并继续

创建新的管理员用户

  • 填写你往出映射的地址(公网/内网)

填写你往出映射的地址

  • 把浏览器彻底关闭Chrome把后台也关掉再打开localhost:8080

Jenkins自带的主题感觉有些丑具体配置从换主题开始

主题配置

  • 安装Simple Theme插件
Manage Jenkins > Manage Plugins > 可选插件 > 搜索Simple Theme
  • 选择喜欢的主题

jenkins-material-theme

Manage Jenkins > Configure System > Theme > 新增CSS URL > 粘贴你选好的主题URL > 保存

插件的安装

  • Localization: Chinese (Simplified) //中文
  • GitHub Authentication plugin
  • GitHub Integration Plugin
  • Mail Watcher Plugin
  • Publish Over SSH
  • Timestamper
  • Workspace Cleanup Plugin
  • Email Extension Template
  • SSH
  • SSH Agent

全局工具配置

  • 默认 Maven settings文件
  • 默认全局settings文件
    • 这两个填写此电脑上Maven目录conf下的settings.xml文件位置
  • JDK填写你编译用的JDK HOME路径 取消自动安装的勾
  • git Default就可以
  • Maven 填写本机MavenHome路径 取消自动安装的勾

添加GitHub服务器

添加

打开GitHub Setting

Developer Settings

Personal access tokens

new token

勾选如图

生成 token

添加凭证

⚠️ 凭证类型选择 Secret Text

如图

选择刚才添加的凭证

新建项目配置

新建一个Maven风格的项目

General

Git源码管理

添加Github凭证

选择配置好的凭证

构建触发器配置

远程执行部署脚本配置

SSH Server:选择系统设置中配置的应用服务器
Source files:war包的相对路径(相对于项目根目录)
Remove prefix:war包的相对目录
Remote directory:应用服务器的目录(Windows服务器默认为C盘用户目录下)
Exec command:应用服务器对应的脚本
  • 我的部署脚本
#!/bin/bash
DATE=`date +%F-%H-%M`

PROJECT="$1" # 传进来的是v1
PROJECT_TARGET="$2" # 传进来的是v1

ROOTDIR='/opt/deploy'
TOMCAT_HOME='/opt/tomcat9'

#停止tomcat服务
echo '停止tomcat9'
sh ${TOMCAT_HOME}/bin/shutdown.sh
ps -ef | grep ${TOMCAT_HOME}/ | grep -v grep| awk '{print $2}' | xargs kill -9

cp ${ROOTDIR}/${PROJECT}.war ${ROOTDIR}/backups/${PROJECT}-${DATE}.war

rm -rf ${TOMCAT_HOME}/webapps/${PROJECT_TARGET}.war
rm -rf ${TOMCAT_HOME}/webapps/${PROJECT_TARGET}

mv ${ROOTDIR}/${PROJECT}.war ${TOMCAT_HOME}/webapps/${PROJECT_TARGET}.war

#启动tomcat服务
echo '启动tomcat9'
sh ${TOMCAT_HOME}/bin/startup.sh

构建完成邮件通知

配置管理员邮箱

⚠️管理员邮箱必须和发通知邮件的邮箱为同一邮箱

配置邮件提醒

Default Content Type: HTML(text/html)
Default Recipients:默认收件人
Default Subject:邮件标题
Default Content:默认模版
Default Triggers:什么时候发出邮件
  • 我的邮件模版
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
 
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本邮件是程序自动下发的,请勿回复!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">构建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称&nbsp;:&nbsp;${PROJECT_NAME}</li>
                    <li>构建编号&nbsp;:&nbsp;第${BUILD_NUMBER}次构建</li>
                    <li>触发原因:&nbsp;${CAUSE}</li>
                    <li>构建日志:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>构建&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目录&nbsp;:&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>项目&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">Changes Since Last
                        Successful Build:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}
            </td>
        </tr>
        <tr>
            <td><b>Failed Test Results</b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><pre
                    style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
                <br /></td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <!-- <tr>
            <td>Test Logs (if test has ran): <a
                href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
                <br />
            <br />
            </td>
        </tr> -->
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>

Default Triggers

配置发送邮件的邮箱

Publish Over SSH

Publish Over SSH

返回项目配置构建后的操作

构建后的操作

构建后的操作

⚠️️关闭E-mail Notification

更多细节请参考

Jenkins Doc

Jenkins自动化部署JavaWeb项目

jenkins+springboot+ssm(jar)自动部署学习总结

Jenkins中的项目打包部署到远程Tomcat

环境部署(八):jenkins配置邮件通知

使用Jenkins配合Github hook持续集成

Jenkins系列之—04 email-ext邮件通知模板