Jenkins入门

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

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

 

 

 

 

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

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

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

它的好处主要有两个:docker

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

2. 防止分支大幅偏离主干。若是不是常常集成,主干又在不断更新,会致使之后集成的难度变大,甚至难以集成。
vim

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

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

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

 

持续交付能够看做持续集成的下一步。它强调的是,无论怎么更新,软件是随时随地能够交付的。

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

持续部署的目标是,代码在任什么时候刻都是可部署的,能够进入生产阶段。

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

 

总的来讲,持续集成、持续交付、持续部署提供了一个优秀的 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

 

 

 

  • 访问安装:

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

 

 

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

 

 

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

 

 

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

了解Jenkins

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

 

 

 

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

 

 

 点击保存并完成

 

 

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

 

 

 提示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”没有,安装它

 

 

 安装完插件后,直接在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文件内容。

 

 

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

 

 

 接下来还须要把公钥拷贝到对应的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,以下图

 

 

 

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

 

 

 

若是有多台web server ,能够继续新增,重复以上操做,最后点击保存

  • 新建任务:

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

 

 

 点击肯定

 

 

 

描述自定义;源码管理选择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能够留空

 

 

 点击Add Server能够增长更多台服务器,在生产环境下一般也是多台服务器一块儿发布代码。点击保存

 

 

 

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

 

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

 

 

能够查看构建成功,一般构建完,不论是成功仍是失败都会有邮件通知。这里由于没有配置邮件,因此没办法接收到邮件。

到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邮件配置

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

 

 

 

 

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

 

 点击Test configuration,若是显示为“Email was successfully sent",说明邮箱配置成功

 

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

 

 

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

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

 

 

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

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

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

回到浏览器,点击当即构建,查看控制台输出

 

 到163邮箱进行查看:

 

 

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

但这样有一点很差,只有构建失败才会发邮件提示,我想让它无论构建成功仍是失败都发邮件提示。

 

更多参考:http://www.javashuo.com/article/p-hwytzxil-bk.html

相关文章
相关标签/搜索