Jenkins入门

Stella981
• 阅读 717

CI/CD介绍
互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:

编码 → 构建 → 集成 → 测试 → 交付 → 部署

 Jenkins入门

正如你在上图中看到,持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)有着不同的软件自动化交付周期。

持续集成(CI)
上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。

持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。

它的好处主要有两个:

1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;

2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
Jenkins入门

持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

持续交付
持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。

持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署(CD)
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。

持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。

持续部署的前提是能自动化完成测试、构建、部署等步骤。

 Jenkins入门

总的来说,持续集成、持续交付、持续部署提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。

Jenkins介绍
Jenkins概念
Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。

官网:https://jenkins.io/ 官方文档:https://jenkins.io/doc/

Jenkins特性:

开源的java语言开发持续集成工具,支持CI,CD;

易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;

消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;

分布式构建:支持Jenkins能够让多台计算机一起构建/测试;

文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;

丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

Jenkins安装
安装最低配置:不少于256M内存,不低于1G磁盘,JDK版本>=8(openjdk也可以)。

环境:
hostname:lzx ip:192.168.33.150 role:jenkins服务器

hostname:lzx1 ip:192.168.33.160 role:部署机器

安装jenkins:
# yum install -y java-1.8.0-openjdk #安装openjdk,jenkins基于java开发

# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo #wget -O 下载文件并以指定的文件名保存

# cat /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins
baseurl=http://pkg.jenkins.io/redhat
gpgcheck=1 #为1时会检测key

# rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key #安装jenkins key

# yum install -y jenkins

启动jenkins:
# systemctl start jenkins

# ps aux |grep jenkins
jenkins 1157 84.7 10.0 2320896 100884 ? Ssl 23:28 0:08 /etc/alternatives/

# less /var/log/jenkins/jenkins.log #查看jenkins日志,截取部分
Jenkins initial setup is required. An admin user has been created and a password generated
.
Please use the following password to proceed to installation:

77faa20f2ad544f7bcb6593b1cf1436b #admin密码,初始化安装时会用到

This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword #admin密码也可以在这里查到

修改默认端口号:

vim /etc/sysconfig/jenkins

找到  JENKINS_PORT="8080" ,JENKINS_AJP_PORT="8009",分别修改成你需要的端口号。

# sudo service jenkins restart

Jenkins入门

  • 访问安装:

打开浏览器,访问ip:8089进行安装,ip为服务器ip

Jenkins入门

 提示需要输入管理员密码,输入上面查到的admin密码,点击继续,会初始化一小段时间

Jenkins入门

 这里我选择安装推荐的插件

Jenkins入门

 这里就已经开始在安装插件,我们等它安装完就好了。

了解Jenkins

上面等插件安装完后,就进入到下面界面,提示要创建第一个admin用户,并设置用户名密码

 Jenkins入门

 这里我直接创建用户名为admin,密码admin

Jenkins入门

 点击保存并完成

Jenkins入门

 提示配置jenkins URL,这里保持默认即可,继续点击保存并完成

Jenkins入门

 提示jenkins已经就绪,开始使用jenkins

Jenkins入门

 查看jenkins的配置文件:

# cat /etc/sysconfig/jenkins #查看jenkins的配置文件,定义了home、JAVA_CMD、user、port等基础配置,保持默认即可

查看程序主目录:

# ls /var/lib/jenkins/ #查看程序主目录
config.xml nodes
hudson.model.UpdateCenter.xml plugins
hudson.plugins.git.GitTool.xml queue.xml.bak
identity.key.enc secret.key
jenkins.CLI.xml secret.key.not-so-secret
jenkins.install.InstallUtil.lastExecVersion secrets
jenkins.install.UpgradeWizard.state updates
jenkins.model.JenkinsLocationConfiguration.xml userContent
jobs users
logs workflow-libs
nodeMonitors.xml
上面,

jobs 浏览器上面创建的任务都会存放在这里

logs 存放jenkins相关的日志

nodes 多节点时用到

plugins 插件所在目录

secrets 密码秘钥所在目录 #jobs和plugins目录比较重要

jenkins存放数据不依靠数据库,所以在移植时只需要拷贝整个程序主目录即可。

发布代码

查看插件:
系统管理–>插件管理,“可选插件”是未安装的插件,“已安装”是已经安装的插件,其中勾选为灰色的是不可卸载的插件。

检查是否有“Git plugin”和“Publish over SSH”两个插件,如果没有,在“可选插件”中安装。发现“Publish over SSH”没有,安装它
Jenkins入门

 安装完插件后,直接在linux机器上重启jenkins服务,而不是勾选空闲时重启

# systemctl restart jenkins

重新在浏览器上登录jenkins,并在linux机器上生成一对秘钥

# cd ~/.ssh/

# ls #如果之前有生成过密钥对,那可以直接用,不需要再生成
authorized_keys known_hosts

# ssh-keygen -f ~/.ssh/jenkins #生成密钥对
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): #直接回车,也可以设置密码
Enter same passphrase again: #直接回车
Your identification has been saved in /root/.ssh/jenkins.
Your public key has been saved in /root/.ssh/jenkins.pub.
The key fingerprint is:
SHA256:VF7nN5V6pPco5DDnm8PUeu8OEg3VMj/IkgfYkqd/Hx4 root@lzx
The key's randomart image is:
+---[RSA 2048]----+
| = . o.o|
| * = +ooo|
| . = = *=.|
| . .oooO =o|
| S .B+.+.o|
| .=ooE.|
| oo=+ o|
| *..+ |
| o ++|
+----[SHA256]-----+

# cat jenkins #查看私钥

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAu+H7NOAvrPYWwNPur64cwZYJz80MZdmQP44KJy1Zcqsfmawt
axjbgzZSPyXSM9fDqo32dR4OR8PdqFdnSDWU8gXl2tgTcsUiy+y+1TB7ZdgzmI8Z
LAAGKQsrWOFMBB9GCfBlAL6eGg4nnsnc4bDT2sJhZuzgfW/qK5AyWSCIm2wvfFw5
1m2WcaslRzNwGkg2cFK4tuY0ZkiF/UfA+YC88RAhSbjFD5FQKLzSHmkZbxbSGC09
cYtsZb3g4VwmkZUEuU/jy5nBUpxv54B6NjkvMxCVx9M/zviiTSZt+yRDaMySISxB
/3Y9FP7R/3Rcf1ZXYGK32hmQ55pDlbcM0gCEFQIDAQABAoIBAD0uSFweiMfc1unx
2W7R1sFfN1C4p8nev+9CNKIvTUpe2Qp0m9GdJZYjsUKo8Ts6jpfSZKgcom/SIzL3
S0WjVR4+t2u9IxAji8I2FKpdgEFY1uxd5MeENn1VCseFjfhlqqv/4RQN/nPjmhlG
CKxhpYs98vPOPQf70phe+1Y0ludtEztiJEM7viIsF8PLlCwf6P7S1JFIXXOAo+xQ
JAHt3AlzUj+HVfq97SbS+cbhuR/MwvIMQs54AsyPOVtt1Q7AOniDw/bnX8JpE9mU
diww6KHn/qQIB0DSWgvfyGwC6qM6C3nUv+EyybdJBcEsYAUH3SgZpBvu3smT2XN9
MCAFegECgYEA524LrSj57hPSKdGO3RT/jVReq0fHJscqSELHAl40lPSKQm+vFK2L
Z20jnQhPg9ebJQjqdkZ/J8EHuwuZjtiqYAeWUERcp5cEEm/BQZ5fB+vYlTZ+QXNa
S6Z9ex2/+qBwY8bJeZR5LPEzVN2cENH8t6FiJO1/csgS3T+KAxnGZoECgYEAz9Ri
CyGwoJs9IpEb3y9Q1AVeFvUQ47XQGJo4xD5nivJ3W/4XApajJl6hXoVp96Z0gXIR
Hhqp+/d4MOlDSeAUPeHcW6gE0h8BYl25fXbvXSpA7rSv8QU+BtQ4vMpsKF5bpRNt
vQjeJrPtHLuFJrOZ6yzov3s4EXlt0AbOBlWXW5UCgYEAvmn6zXRjfxFr3+B97UUz
pnL+mWqrXyqLjXz0BOzB0rUJdPQzV44anvRbUv7dfZrOGcCmOL50LJ9T3wACTlfS
hsR3Vn+IxJMqVIkCtxy5D+lrAAogA3YHmyrXH48wv+N11YJfjtssgF/MXk0f9W7w
wZ3VBJEsRaJ8cvGuejKg3QECgYEAzvoAun1O3mQ8OlSxoVAJ+11tGwftThofqKDO
sAJGNEbNQDyIxfcnfGr54pyTsCOCG/hxu71qVJlchbmJXeVfw1FQl6d5RZnDUyds
N9te/zW5fQFNx4clAsAP0VT26i0ur/PtcjmGpJzEI71NGgH75A7RrQEWEbERAAAG
5qAPIRECgYEAjpNyIsvDYcEtBj/oCQCa3FdPsGqRaYmBZLqJ4nCP5DolYgJkewKx
n5+AIYsXYYKB7W4a0uPKN6gMVVAkm0Icletpf9UpT51uMSR5JpqIwqOFNgI0+NkV
+jlerYcD909WjV3OqrwZm7yPqwa2RPkIfCbeHnXbkAcv+DuWn4L8RdI=
-----END RSA PRIVATE KEY-----

系统管理–>系统设置,找到之前安装的Publish over SSH插件,Passphrase填写之前生成秘钥时设置的密码,没有则留空,Path to key留空,Key粘贴/root/.ssh/jenkins文件内容。

Jenkins入门

 然后新增SSH Servers,填入对应的hostname,这就是PHP代码要发布的机器

Jenkins入门

 接下来还需要把公钥拷贝到对应的hostname机器(lzx1)上

# cat jenkins.pub

到lzx1上粘贴jenkins.pub

# cd ~/.ssh/

# ls
authorized_keys

# vim authorized_keys #写入下面内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74fs04C+s9hbA0+6vrhzBlgnPzQxl2ZA/jgonLVlyqx+ZrC1rGNuDNlI/JdIz18OqjfZ1Hg5Hw92oV2dINZTyBeXa2BNyxSLL7L7VMHtl2DOYjxksAAYpCytY4UwEH0YJ8GUAvp4aDieeydzhsNPawmFm7OB9b+orkDJZIIibbC98XDnWbZZxqyVHM3AaSDZwUri25jRmSIX9R8D5gLzxECFJuMUPkVAovNIeaRlvFtIYLT1xi2xlveDhXCaRlQS5T+PLmcFSnG/ngHo2OS8zEJXH0z/O+KJNJm37JENozJIhLEH/dj0U/tH/dFx/VldgYrfaGZDnmkOVtwzSAIQV root@lzx

lzx上登录lzx1测试

# ssh lzx1
root@lzx1's password:
Last login: Thu Sep 20 20:51:25 2018 from 192.168.33.1

#exit
logout
Connection to lzx1 closed.
[root@lzx .ssh]# #ssh登录没问题

浏览器上测试连接有没有问题,点击Test Configuration,如果没问题,左侧会显示Success,如下图

 Jenkins入门

 这就说明我们前面的配置是没问题的。点击应用,出现“已保存”

Jenkins入门

如果有多台web server ,可以继续新增,重复以上操作,最后点击保存

  • 新建任务:

回到首页,点击创建一个新任务,自定义任务名称,选择构建一个自由风格的软件项目

Jenkins入门

 点击确定

Jenkins入门

描述自定义;源码管理选择Git(如果使用SVN就选择Subversion);Repository URL选择自己公共仓库的地址,这里为了方便我使用别人的公共仓库;Branches to build默认为*/master,意思是发布代码的分支为master分支;构建触发器和构建环境留空;构建选择Send files or execute commands over SSH,Name选择对应的服务器,Source files填入**/**,表示要发布的代码为全部文件,Remote directory填入/tmp/jenkins_test(自定义一个存放PHP代码的文件夹名),Remove prefix和Exec command可以留空
Jenkins入门

 点击Add Server可以增加更多台服务器,在生产环境下通常也是多台服务器一起发布代码。点击保存

 Jenkins入门

 点击左侧立即构建,会出现构建历史,其中#1表示第一次构建

Jenkins入门

 点击#1,点击控制台输出

Jenkins入门

可以查看构建成功,通常构建完,不管是成功还是失败都会有邮件通知。这里因为没有配置邮件,所以没办法接收到邮件。

到lzx1上查看

# ll !$
ll /tmp/jenkins_test/
total 100
drwxr-xr-x 2 root root 66 Sep 21 02:42 D11Z
drwxr-xr-x 2 root root 260 Sep 21 02:42 D12Z
drwxr-xr-x 2 root root 24 Sep 21 02:42 D13Z
drwxr-xr-x 2 root root 4096 Sep 21 02:42 D14Z

和我们发布的源是一致的,如下图

 Jenkins入门

 如果在源上面做了变更,继续点击立即构建,如果构建成功,那么在目标机器上也可以看到变更的内容。

Jenkins邮件配置

系统管理 → 系统设置,找到邮件通知进行配置,这里我使用的是163邮箱

 Jenkins入门

 Jenkins入门

 发邮件的地址必须与管理员地址一致,否则发邮件会报错。同时必须在163邮箱设置授权码,并且在上面设置密码的地方填入该授权码,不然也是发送不了邮件。Jenkins入门

 点击Test configuration,如果显示为“Email was successfully sent",说明邮箱配置成功Jenkins入门

 到163邮箱查看是否收到刚刚测试的邮件Jenkins入门

收到了,邮件配置成功。点击保存,进入到之前的任务中,点击配置

找到构建后操作,选择E-mail NotificationRecipients这里填入接收邮件的邮箱地址Jenkins入门

勾选保持默认即可,点击保存

现在来测试,故意让构建不成功,看是否能接收邮件。

  • 首先lzx1上更改目标目录的权限,使之无法写入:
  • # cd /tmp/
  • # rm -rf jenkins_test/*
  • # chattr +i jenkins_test/ #加上i权限,让它无法写入

回到浏览器,点击立即构建,查看控制台输出Jenkins入门

 到163邮箱进行查看:Jenkins入门

邮件收到,邮箱配置成功。

但这样有一点不好,只有构建失败才会发邮件提示,我想让它不管构建成功还是失败都发邮件提示。

更多参考:https://blog.csdn.net/miss1181248983/article/details/82840006

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
可莉 可莉
2年前
2021年全球公有云终端用户支出将增长18% ;EMNLP 2020最佳论文:无声语音的数字发声
!(https://static001.geekbang.org/infoq/af/af9f6637b50b09be60b00a42f3812d5e.png)开发者社区技术周刊又和大家见面
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这