Jenkins 安装自动化部署教程

安装

Jenkins支持Tomcat安装、yum安装以及Docker安装,任选一即可。

Tomcat安装

1、下载

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

2、将项目放入tomcat中webapps文件夹下,启动运行即可。

卸载
1、关闭tomcat:./shutdown.sh

2、删除/webapps/jenkins下所有文件:rm -rf jenkins

3、删除配置文件:rm -rf /root/.jenkins/

yum安装

1、获取软件安装源

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

2、安装jenkins

yum -y install jenkins

如果在yum安装的时候出现下面这段信息是因为安装的时候检查了公钥,而本地没有生成相应的公钥

Public key for jenkins-2.263.1-1.1.noarch.rpm is not installed

解决办法:

新增 --nogpgcheck 参数,实现不检查Public Key而强制安装, 命令如下

yum install jenkins --nogpgcheck

3、配置

打开jenkins的配置文件

vim /etc/sysconfig/jenkins

修改端口号、用户,启动

# 修改 JENKINS_USER 的值为root
JENKINS_USER="root"

# 修改 JENKINS_PORT 的值为启动端口号
JENKINS_PORT="8080"

修改Jenkins相关文件夹用户权限

chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins

4、启动jenkins

systemctl start jenkins

查看Jenkins进程所属用户,若显示为root用户,则表示修改完成。

ps -ef | grep jenkins

重启Jenkins

systemctl restart jenkins

至此,Jenkins就安装好了,接下来是进来启动配置Jenkins。

卸载

1、rpm卸载

rpm -e jenkins

2、检查是否卸载成功

rpm -ql jenkins 

3、彻底删除残留文件:

find / -iname jenkins | xargs -n 1000 rm -rf

启动(准备工作)

等待Jenkins启动成功,打开浏览器输入ip:端口打开Jenkins管理界面。

1、解锁 Unlock Jenkins

按照提示查看服务器的密码,并复制到输入框即可。如下:

cat /var/lib/jenkins/secrets/initialAdminPassword

2、安装插件 Customize Jenkins

选择第二个选项“选择插件来安装”,下一步,点击“无”,安装。(不安装插件,用的时候再安装)

3、设置登录用户密码以及管理地址登录。

4、汉化

  • 选择 Manage Jenkins -> Manager Plugin -> Available
  • 输入框中输入Local,勾选 LocaleLocalization: Chinese (Simplified)
  • 点击下方的 Download now and install after restart 按钮,安装后重启;
  • 等待下载,并勾选Restart Jenkins when installation is complete and no jobs are running 意思安装完成后在空闲时间重启;
  • 重启后,依次进入 Manage Jenkins -> Configure System,找到Local标签,输入 zh_cn并勾选下方多选框强制使用保存即可;

5、加速

使用默认的镜像在国内下载插件是会很慢,可以将jenkins 的baseurl修改为华为云镜像地址。

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

vi /etc/yum.repos.d/jenkins.repo

修改baseurl的值为:

baseurl=https://mirrors.huaweicloud.com/jenkins/redhat-stable

插件管理 -> 高级 -> 升级站点

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

版本升级

1、下载war包,Java版本匹配Jenkins版本。历史版本

2、进入 /usr/lib/jenkins 目录,替换war包后重启即可。

实际操作时,提示“Job for jenkins.service failed because the control process exited with error code.”,通过“systemctl status jenkins.service”排查原因。提示“Unable to access jarfile /usr/lib/jenkins/jenkins.war”,执行“chmod 777 /usr/lib/jenkins/jenkins.war”。

系统管理

全局工具配置

Maven配置
选择 文件系统中的setting文件, 并输入maven的setting.xml路径。

JDK
如果服务器已经安装JDK,填写名称、JAVA_HOME,并去除自动安装标签,yum安装的jdk一般在/usr/lib/jvm目录下。

Git
同上,填写名称、及git路径,并去除自动安装标签。

Maven
同上,填写名称、及MAVEN_HOME,并去除自动安装标签。

系统配置

系统配置中主要配置系统设置及下载安装的插件。

Jenkins Location

Jenkins URL 默认Jenkins管理地址

系统管理员邮件地址 填写管理员邮箱,与发送邮件的地址一致

邮件配置

Jenkins系统自带邮件配置,但内容不够丰富,不能够进行个性化设置,建议安装 Extended E-mail Notification 插件。

配置:

依次进入 Manage Jenkins -> Configure System,找到Extended E-mail Notification标签,以QQ邮箱为例填写以下信息:

SMTP服务器 smtp.qq.com
用户默认邮件后缀 @qq.com
使用SMTP认证
用户名 xxxxx@qq.com
密码 生成的授权码
SMTP端口 587
Default Content Type HTML
Default Recipients 默认收件人
Default Subject 默认主题
Default Content 默认内容
Default Triggers 何时发送邮件,推荐勾选 Failure-Any 和 Success

Default Content 推荐使用以下模板:

<!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>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>    
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                </ul>    

<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>

<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

            </td>    
        </tr>    
    </table>    
</body>    
</html>

自带的邮件设置跟上面的设置类似,可以发送测试邮件测试。

构建项目(Jenkins + SpringBoot + Maven + Git + Githooks + Docker)

Docker

使用阿里云 容器镜像服务 创建个人版实例,新建命名空间。

SpringBoot

src/main/docker/Dockerfile

FROM openjdk:8
VOLUME /tmp
ENV profiles=$profiles
ENV port=$port
ADD exam.jar app.jar
ENTRYPOINT ["sh","-c","java -Xms64m -Xmx1024m -Duser.timezone=GMT+8 -Djava.security.egd=file:/dev/./urandom -jar /app.jar --server.port=$port --spring.profiles.active=$profiles "]

pom.xml

  <!-- docker -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>dxh/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>

                </configuration>
            </plugin>

需要的插件

  • Git Parameter(参数化构建)
  • Email Extension Template(邮件模板)
  • Git\Gitee(拉取Git项目)
  • Publish Over SSH(SSH服务器、远程传输文件及执行Shell命令)

新建任务

点击首页新建任务,输入任务名称(项目名称),勾选构建一个Maven项目,如果没有此项需要安装 Maven Integration插件;

General

1、构建策略,勾选 Discard old builds,输入保存构建的天数和最大个数,一般写7天就够;

2、参数化构建,勾选 This project is parameterized,添加参数,选择 Git Parameter,如果没有此选项需要安装 Git Parameter 插件;

源码管理

勾选Git,输入Repository URL项目的Git地址,更改指定分支,即可。

如果是私有仓库还需要以下的设置:

点击 Credentials 后面的添加,添加Git的账号密码。

构建触发器

选择 GitHub hook trigger for GITScm polling

需要以下额外设置,注意保存。

系统配置中找到 GitHub标签,选择高级,勾选为 Github 指定另外一个 Hook URL,复制输入框中的内容;
打开github的项目中的设置,添加 Webhooks
在Payload URL 中输入刚复制的地址
Content type 选择json
勾选Just the push event. 意思有新的提交的通知。

完成这些设置后,当你向git提交新的代码是就会触发改选项进行自动化部署。

Pre Steps

1、Maven targets,Add下拉框中选择 Invoke top-level Maven targets,选择Maven版本,目标中填写 clean install -Dmaven.test.skip=true

2、Execute shell,Add下拉框中选择 Execute shell,填写:

mvn docker:build
echo "当前dcoker镜像:"
docker images

5、Post Steps

1、Execute shell

勾选 Run only if build result

Add post-build step 选择 Execute shell,然后在命令中输入以下shell命令:

#服务名称 项目打出来的jar包的名称
SERVICE_NAME="demo"
#镜像名称,maven配置的imageName
IMAGE_NAME="wisdomebook/demo"
#仓库地址
REGISTRY_URL="registry.cn-hangzhou.aliyuncs.com"

echo '================开始推送镜像================'
docker login --username=用户名--password=密码 "$REGISTRY_URL"
docker tag "$IMAGE_NAME":latest "$REGISTRY_URL"/命名空间/"$SERVICE_NAME":${Tag}
docker push "$REGISTRY_URL"/命名空间/"$SERVICE_NAME":${Tag}
echo '================删除本地临时镜像================'
docker rmi -f "$IMAGE_NAME":latest
docker rmi -f "$REGISTRY_URL"/命名空间/"$SERVICE_NAME":${Tag}

2、SSH Publishers(需要安装SSH Publishers插件)

Add post-build step 选择 Send files or execute commands over SSH

SSH Server Name中选择目标服务器(需要提前在Configure System 中配置Publish over SSH项,填写目标服务器账号密码端口SSH Servers),勾选Verbose output in console打开日志。

Transfers -> Exec command中填写:

#!/usr/bin/env bash
source /etc/profile
#defined

#服务名称 项目打出来的jar包的名称
SERVICE_NAME="demo"

#容器对外端口
CONTAINER_PORT="8082"
#应用的端口,一般是springBoot jar自身的端口
APP_PORT="8082"
#环境
PROFILES=test

#容器名称  加容器端口号是防止有同名应用多次部署  
CONTAINER_NAME="$SERVICE_NAME""_""$CONTAINER_PORT"



#健康检查地址
HEALTH_CHECK_URL="http://127.0.0.1:""$CONTAINER_PORT/demo/hello/"

#镜像地址
IMAGE_NAME="registry.cn-hangzhou.aliyuncs.com/命名空间/"$SERVICE_NAME":"${Tag}


# 删除Docker容器
echo '================停止并删除正在运行的容器镜像================'
docker stop `docker ps -a| grep $CONTAINER_NAME | awk '{print $1}' `
docker rm   `docker ps -a| grep $CONTAINER_NAME | awk '{print $1}' `

# 下载镜像
echo '================开始下载新最新的镜像======================='
docker login --username=账号--password=密码 registry.cn-hangzhou.aliyuncs.com(docker地址)
docker pull $IMAGE_NAME


# 启动Docker容器 
echo '================启动容器================================='
docker run   -d -e profiles=$PROFILES -e port=$APP_PORT  -e JAVA_OPTS="-Xms64m -Xmx1024m"  -v /home/logs/"$CONTAINER_NAME":/logs   --net=host    --restart=always --name $CONTAINER_NAME $IMAGE_NAME


# 检查端口
echo '================开始检查容器是否启动正常==================='
sleep 30
new_service_pid=`lsof -n -P -t -i :$CONTAINER_PORT`
if [ -n "$new_service_pid" ]
then
  echo "启动成功"
else
  echo "启动失败"
  set -e
  exit 1
fi

#检查服务是否启动正常
echo '================开始检查服务是否启动正常==================='
status=`curl -I -m 5 -s -w "%{http_code}" -o /dev/null "$HEALTH_CHECK_URL"`
echo $status 
if [ $status = "200" ]
then
   echo "服务启动正常"
else
  echo "服务启动失败"
  set -e  #注意,这句最重要,一定要先设置这个
  exit 1  #然后再退出
fi

构建后操作

添加 Extended Email Notification,内容使用默认即可,可在系统设置中更改收件人等信息,也可以在当前输入框中更改该项目的收件人等信息;

以下是各项的意思:

①Disable Extended Email Publisher:勾选后,邮件就不发送,看自己的情况喽,如果你想调试某些东西,又不想发邮件出去就可以勾选这个。 
②Project Recipient List:收件人地址;多个收件人邮件地址用逗号进行分割;想使用全局默认配置的话,可以使用$DEFAULT_RECIPIENTS。 
③Project Reply-To List:允许回复人的地址;想使用系统设置中的默认值的话,可以使用$DEFAULT_REPLYTO; 
④Content Type:邮件文档的类型,可以设置HTML等格式; 
⑤Default Subject:默认主题,也就是邮件标题;同理可以使用$DEFAULT_SUBJECT 
⑥Default Content:默认邮件内容;这里是关键;我这里使用的是模板${SCRIPT, template="groovy-html.template"};后面会讲;当然不想使用模板的话,可以通过使用jenkins自身提供的变量来自己定义; 
⑦Attach Build Log:发送的邮件是否包含日志; 

此处有一个系统的 坑点 需要注意,Triggers中默认的收件人都为 Developer List,我们未曾设置该项,

一定要自己再添加一个 Recipient List 方可接收到邮件!!!

否则构建日志就会显示:

An attempt to send an e-mail to empty list of recipients, ignored.

保存构建

启动方式:

(1)手动选择Build with Parameters

(2)向github提交代码是自动触发构建;

参考文章

Jenkins权限配置失误后导致登录失败(Access Denied)的解决办法
Jenkins 自动化部署
jenkins 邮件配置之良心之作
Jenkins与Github集成 webhook配置
springBoot集成Jenkins,实现自动化部署
Jenkins修改语言为中文
Jenkins 忘记登录密码解决办法
Linux安装Jenkins
Centos7 部署Jenkins环境配置jdk1.8+maven3.6.3
Jenkins怎么发邮件,自动化大老手把手教你
Jenkins+jdk1.8安装教程
使用Jenkins、Docker、GitLab 部署SpringBoot项目

本文链接: https://jianz.xyz/index.php/archives/137/

1 + 4 =
快来做第一个评论的人吧~