Jenkins部署与自动化构建

Jenkins笔记

文章目录

  • Jenkins笔记
    • @[toc]
    • 一、安装Jenkins
      • docker 安装 Jenkins
      • Java启动war包直接安装
    • 二、配置maven+Git自动构建jar包
    • 三、自动化发布到测试服务器运行
      • 超时机制
      • 数据流重定向
      • 编写清理Shell脚本
    • 四、构建触发器
      • 1. 生成API token
      • 2. Jenkins项目配置触发器
      • 3. 远程Git仓库配置WebHooks
      • 4. 几种构建方式
      • 5. 定期构建cron表达式
      • 6. Poll SCM(轮询)
    • 五、配置邮箱接收构建信息
      • 1. 设置管理员邮箱(发件邮箱)
      • 2. Jenkins邮件设置配置
      • ==**3.邮件设置中的坑**==

一、安装Jenkins

docker 安装 Jenkins

  1. 拉取稳定版Jenkins镜像

    注意: docker拉取镜像的时候要拉取 jenkins/jenkins 而不是jenkins 要装稳定版,否则后面会有很多插件装不上

    docker pull jenkins/jenkins:lts
    
  2. 挂载对应的容器卷

    #给需要挂载的文件夹授权
    mkdir jenkins_home
    chmod 777 /docker/jenkins_home/
    
    #启动容器
    docker run -d -p 8090:8080 -p 8091:50000 --privileged=true --name jenkins_8090 -v /docker/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime 55860ee0cd73
    
    -d 后台运行镜像
    -p 8090:8080 将镜像的8080端口映射到服务器的8090端口。
    -p 8091:50000 将镜像的50000端口映射到服务器的8091端口
    -v /data/jenkins_home:/var/jenkins_home /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /data/jenkins_home目录
    -v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
    –name jenkins_8090 给容器起一个别名
    http://mirror.esuni.jp/jenkins/updates/update-center.json
    
  3. 修改插件下载镜像源为清华镜像(可以先直接尝试一下是否可以安装成功)

    # 修改xml
    vim jenkins_home/hudson.model.UpdateCenter.xml 
    #将 https://updates.jenkins.io/update-center.json替换为 http://mirror.esuni.jp/jenkins/updates/update-center.json
    http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
    
    # 修改jenkins/updetes/default.json文件
    ①把:“http://www.google.com/” 改成 “http://www.baidu.com/”
    ②把:“https://updates.jenkins.io/download” 全部替换成 “http://mirrors.tuna.tsinghua.edu.cn/jenkins”
    
    sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json
    sed -i 's#https://www.google.com#https://www.baidu.com#g' default.json
    
    sed -i 's#https://updates.jenkins.io/download#https://mirrors.huaweicloud.com/jenkins#g' default.json && sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json 
    
    http://ip:9090/pluginManager/advanced
    https://cdn.jsdelivr.net/gh/jenkins-zh/update-center-mirror/tsinghua/current/update-center.json
    
    
    # 重启服务
     docker stop jenkins_8090
     docker start jenkins_8090 
    
    
  4. 访问web页面 http://IP:8090/

    Jenkins部署与自动化构建_第1张图片

  5. 去查看第一次登录的密码

    #查看输出日志
    docker logs jenkins_8090
    
    #在日志中会有一段密码
    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:
    
    800c8b5201284979a1ea16c1893358d5
    
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
    
    #或者也可以去它上面给的地址中查看密码
    将密码填入上面的文本框中
    
  6. 等待一会后,开始安装插件

    我这里选择的是按照推荐安装Jenkins部署与自动化构建_第2张图片

  7. 后续需要通过maven来构建我们的项目,所以需要在容器内安装mavne

    # 将maven下载好后解压
    unzip /mavne/apache-maven-3.8.6 -d ./
    
    # 修改maven的镜像源
    vim /mavne/apache-maven-3.8.6/conf/setting.xml
    
    #将里面的镜像换为阿里云镜像
    <mirror>  
    <id>alimaven</id>              
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
    <mirrorOf>central</mirrorOf>          
    </mirror>
    
    #增加软连接 (不需要进入到原来的路径也可以验证Maven安装)
    ln -s /maven/apache-maven-3.8.6/bin/mvn /usr/local/bin/mvn
    
    #验证是安装成功
    mvn -v 
    
    

Java启动war包直接安装

  1. 下载适合的war包 https://mirrors.jenkins.io/war-stable/

    我这里用的jdk1.8 所以下载的版本为jenkins 2.346.1

  2. 利用java命令启动

    touch temp.txt
    # 这种方式会在后台运行 不会被关闭
    nohup java -jar jenkins.war --httpPort=8090 >temp.txt &
    
  3. 访问 ip:8090 后续操作同上4⃣️

二、配置maven+Git自动构建jar包

  1. 安装maven插件

    Jenkins部署与自动化构建_第3张图片

    安装好后进入新增item,出现小猫头鹰即安装成功

Jenkins部署与自动化构建_第4张图片

  1. 创建一个任务

    Jenkins部署与自动化构建_第5张图片

  2. 选择Git ,此时下面会提示git连接错误

    Jenkins部署与自动化构建_第6张图片

    可以配置下凭证

    Jenkins部署与自动化构建_第7张图片

  3. 安装git

    yum install -y git
    # 安装完毕后验证一下
    git --verison
    
  4. 设置需要构建的分支

    Jenkins部署与自动化构建_第8张图片

  5. 配置maven路径

    Jenkins部署与自动化构建_第9张图片

    配置安装的maven路径

    Jenkins部署与自动化构建_第10张图片

  6. 设置需要构建的pom文件路径

    Jenkins部署与自动化构建_第11张图片

  7. 保存后开始构建

    Jenkins部署与自动化构建_第12张图片

    可以在构建中看到控制台输出(记得将maven的镜像地址换成阿里云地址

    Jenkins部署与自动化构建_第13张图片

三、自动化发布到测试服务器运行

  1. 安装服务器连接插件 Publish Over SSH

    Jenkins部署与自动化构建_第14张图片

  2. 进入配置后管理界面

    Jenkins部署与自动化构建_第15张图片

    Jenkins部署与自动化构建_第16张图片

    选择这个选项

    Jenkins部署与自动化构建_第17张图片

  3. 配置测试服务器连接

    因为我们需要增加一台远程服务器,所以我们需要做一些配置信息

    在这里插入图片描述

    Jenkins部署与自动化构建_第18张图片

  4. 添加一台远程服务器

    Jenkins部署与自动化构建_第19张图片

  5. 此时在原先的地方就有了我们刚添加的服务器

    Jenkins部署与自动化构建_第20张图片

    配置相关数据

    1. 构建前Pre Steps

    Jenkins部署与自动化构建_第21张图片

    构建后Post Steps

    Jenkins部署与自动化构建_第22张图片

超时机制

  1. 启动脚本问题会导致超时,从而导致启动不成功

    可以设置超时时间为0 这样就可以不会因为超时而不成功

nohup java -jar /jenkins/build_jar/first1/*.jar &
# 这条语句会超时,原因是因为没有指明日志输出到哪里,控制台会一直等待

#修改为如下
nohup java -jar /jenkins/build_jar/first1/*.jar >/jenkins/build_jar/first1/mylog.log 2>&1 &

# 也可以简化为
nohup java -jar /jenkins/build_jar/first1/*.jar &>/jenkins/build_jar/first1/mylog.log  &


数据流重定向

数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方

# 标准输入:代码为0,使用<或者<<
# 标准输出:代码为1,使用>或者>>
# 标准错误输出:代码为2,使用2>或者2>>
# 若以>输出到一个已存在的文件中,那么这个文件会被覆盖
# > 覆盖写
# >> 追加写

编写清理Shell脚本

jps|grep -v Jps|awk '{print $1}'

#将 xxxx写入xxx.txt
echo "xxxx">xxx.txt

#!/bin/bash

#获取程序运行的pid
ps -ef|grep jenkins_demo #会获取到两条记录 有一条是grep的数据

#利用grep -v 再次过滤 grep -v 需要过滤掉的信息
ps -ef|grep jenkins_demo|grep -v grep

#利用grep '需要的信息' 进行过滤
ps -ef|grep jenkins_demo|grep 'SNAPSHOT'

#获取打印出来的信息的第二列数据PID
`ps -ef|grep jenkins_demo|grep 'SNAPSHOT'|awk '{printf $2}'`


部署前shell操作(删除原来的包,同时关闭上一次运行的pid)

#!/bin/bash
#删除原来的包
rm -rf /jenkins/build_jar/first1

#传入一个参数
appname=$1
if [ -z $appname ]
then
  appname='jenkins_demo'
fi
echo $appname

#获取pid
pid=`ps -ef | grep $appname | grep 'java -jar' | awk  '{printf $2}'`

echo $pid

#如果pid为空的话,提示一下,否则执行kill命令
if [ -z $pid ]
#使用-z来判断是否是空值
then
  echo "$appname not started"
else
  kill -9 $pid
  echo "$appname stoping..."
fi

#再次精准匹配 查看是否已经kill完 -w是精准匹配
check=`ps -ef|grep -w $pid |grep java`
if [ -z $check ]
then
  echo "$appname pid:$pid is stop"
else
  echo "$appname stop Failed"
fi
  1. 配置构建前执行shell脚本

    Jenkins部署与自动化构建_第23张图片

  2. 此时构建的话,Jenkins会自动帮我们删除以前的版本数据,同时kill掉以前运行的pid

    Jenkins部署与自动化构建_第24张图片

四、构建触发器

触发器可以通过一些事件触发Jenkins的自动构建,如:上传代码,合并代码等。

1. 生成API token

  • 1.1 进入jenkins安全设置,开启安全域及授权策略

    Jenkins部署与自动化构建_第25张图片

    配置开启

    Jenkins部署与自动化构建_第26张图片

  • 1.2 生成api token

    Jenkins部署与自动化构建_第27张图片

2. Jenkins项目配置触发器

  • 2.1 选择测试项目-配置-构建触发器,选择触发远程构建,将token粘贴在身份验证令牌处,保存

    Jenkins部署与自动化构建_第28张图片

  • 2.2 通过访问 JENKINS_URL/job/first/build?token=TOKEN_NAME 观察项目是否进入构建队列

    Jenkins部署与自动化构建_第29张图片

3. 远程Git仓库配置WebHooks

(GitLab GitHub)同理

  • 3.1在Jenkins中安装Gitee插件(同上)

  • 3.2在项目设置中配置Gitee令牌地址等

    Jenkins部署与自动化构建_第30张图片

    Jenkins部署与自动化构建_第31张图片

  • 3.3增加webHooks管理

    Jenkins部署与自动化构建_第32张图片

  • 3.4添加post地址和token 这里的地址直接用上面Jenkins的链接,token则是刚才生成的密码

    Jenkins部署与自动化构建_第33张图片

  • 3.5尝试重新上传代码,可以发现现在会自动触发构建

    Jenkins部署与自动化构建_第34张图片

4. 几种构建方式

Jenkins部署与自动化构建_第35张图片

1、快照依赖构建/Build whenever a SNAPSHOT dependency is built

  • 当依赖的快照被构建时执行本job

2、触发远程构建 (例如,使用脚本)

  • 远程调用本job的restapi时执行本job

3、job依赖构建/Build after other projects are built

  • 当依赖的job被构建时执行本job

4、定时构建/Build periodically

  • 使用cron表达式定时构建本job

5、向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling

  • Github-WebHook出发时构建本job

6、定期检查代码变更/Poll SCM

  • 使用cron表达式定时检查代码变更,变更后构建本job

5. 定期构建cron表达式

在构建中Build periodically与Poll SCM接收的参数都是cron表达式

与标准的cron表达式不同,没有秒字段

cron表达式网站

第一个 * 表示每个小时的第几分钟,取值0~59

0 */1 * * *
H:每小时0分执行一次

第二颗 * 表示小时,取值0~23

* 15 * * * 表示每天下午3点
* 1 * * *  表示每天凌晨1点

第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * *  表示每月5日凌晨1点

第四颗 * 表示第几月,取值1~12
* 15 5 1 *  表示每年一月5日15时的每一分钟执行

第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日

H (hash散列)

  • hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间。

  • 意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * * ,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行减轻同一时间拉起的Job太多

  • H的值也可以设置范围

  • H * * * *表示一小时内的任意时间
    
    */10 * * * *每10分钟
    
    H/10 * * * *每10分钟,可能是7,17,27,起始时间定hash,后续不会变
    
    45 3 * * 1-6 每个周一至周六,凌晨3点45 执行1次
    
    45 3-5 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次
    
    H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上
    
    45 3-5/2 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次
    
    45 0-6/2 * * * 0点开始,6点结束,每间隔2小时执行一次 0:45、2:45、4:45、6:45
    
    
  • 如图 配置后会每天凌晨两点的某一分钟为我们构建 H 2 * * *

    Jenkins部署与自动化构建_第36张图片

6. Poll SCM(轮询)

​ 这个是由Jenkins服务发起对远程git仓库的访问,比较配置的分支上是否有新的内容,如果有则会发起一次构建,轮询频率控制是通过cron表达式控制。

Jenkins部署与自动化构建_第37张图片

五、配置邮箱接收构建信息

1. 设置管理员邮箱(发件邮箱)

  • 1.1 登录163邮箱,进入邮箱协议设置

    Jenkins部署与自动化构建_第38张图片

  • 1.2 获取授权密码(ZSJRNM*********)

    Jenkins部署与自动化构建_第39张图片

2. Jenkins邮件设置配置

  • 在管理界面Configure System中

    Jenkins部署与自动化构建_第40张图片

    Jenkins部署与自动化构建_第41张图片

    Jenkins部署与自动化构建_第42张图片

    Jenkins部署与自动化构建_第43张图片

    此时可以点击下面的发送邮件测试是否能成功发送

    Jenkins部署与自动化构建_第44张图片

  • 在项目管理里配置构建后邮件通知

    Jenkins部署与自动化构建_第45张图片

  • 重新构建项目,可以看到已经有短信通知了

3.邮件设置中的坑

  1. 点击发送测试信息的时候,提示**AuthenticationFailedException: 550 User has no permission**错误

    那就是授权出现了错误,此时就需要重新获取授权码再授权一次,但记得邮箱设置页面中已获得授权的设备一定要记得删除,防止自己的邮箱账号被盗

  2. 点击发送测试信息的时候,提示MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout 60000;

    这个话是因为可能你使用的是Linux服务器,防火墙25端口没有开,有两种解决办法

    1.开启防火墙25端口

    注意:如果你和我一样使用的为阿里云服务器的话,阿里云为了安全考虑默认是关闭25端口的,如果你想要开启的话需要提交申请审批,大概需要3-5天

    2.使用SSL协议号

    • 下面配上网易163邮箱的相关服务器信息:

      Jenkins部署与自动化构建_第46张图片

    我这里使用的是465端口,同时启用SSL协议

  3. 点击发送测试信息的时候,提示MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF],则查看使用的端口是否需要使用SSL协议

    Jenkins部署与自动化构建_第47张图片

  4. 用来发送的邮箱要和管理员设置的邮箱一致

    Jenkins部署与自动化构建_第48张图片

    这样就可以开开心心的发邮件啦!以上这些坑不幸的我都踩到了

Jenkins部署与自动化构建_第49张图片

你可能感兴趣的:(云原生,jenkins,自动化)