1)Jenkins是一个开源持续集成工具。java
2)开发工具:JAVA。node
3)功能:提供了软件开发的持续集成服务。linux
4)特色:支持主流软件配置管理,配合实现软件配置管理,持续集成功能。git
1)主流的运维开发平台,兼容全部主流开发环境。github
2)插件市场可与海量业内主流开发工具实现集成。web
3)Job为配置单位与日志管理,使运维与开发人员能协同工做。shell
4)权限管理划分不一样Job不一样角色。apache
5)强大的负载均衡功能,保证咱们项目的可靠性。centos
1)表明一个任务或者项目。tomcat
2)可配置与可执行。
3)执行后的记录称之为Build。
4)日志监控与记录。
5)全部文件集中保存。
1)需在页面添加模块配置项与参数完成配置。
2)每一个Job仅能实现一个开发功能。
3)没法将配置代码化,不利于Job配置迁移与版本控制。
4)逻辑相对简单,无需额外学习成本。
匹配持续集成(CI)与持续交付(CD)的几个核心概念。
持续:“持续”用于描述遵循许多不一样流程时间。这并不意味着“一直在运行”,而是“随时可运行”。
快速失败:管道的工做之一就是快速处理变动。另外一个是监视建立发布的不一样任务和做业。因为编译失败或测试未经过的代码能够阻止管道继续运行,所以快速通知用户此类状况很是重要。快速失败指的是在管道流程中尽快发现问题并快速通知用户的方式,这样能够及时修正问题并从新提交代码以便管道在此运行。一般在管道流程中可经过查看历史记录来肯定是谁作了那次修改并通知此人及团队。
持续集成:持续集成(CI)是在源代码变动后自动检测、拉去、构建和进行单元测试的过程。持续集成是启动管道的环节。检测变动的工做一般由Jenkins负责。检测的类型有:
1)轮询:检测程序反复询问代码管理系统是否有新变动。
2)按期:检测程序配置为按期启动构建,不管代码是否有变动,但若没有变动,也不会增长额外成本。
3)推送:这与用于代码管理系统检查的检测程序相反,代码管理系统被配置为提交变动到仓库时将“推送” 一个通知到检测程序。
单元测试:单元测试是由开发人员编写的小型的专项测试,以确保新代码独立工做。所谓的独立是指不依赖或调用其余不可直接访问的代码,也不依赖外部数据或其余模块,若是必要的话能够用模拟(mock)表示。常见的单元测试框架有Java开发的JUnit。
持续交付:持续交付(CD)一般是指整个流程链(管道),它自动检测源代码变动并经过构建、测试、打包和相关操做运行它们以生成可部署的版本,基本上没有任何人为干预。
1)全部模块,参数配置均可以体现为一个pipeline脚本。
2)能够定义多个stage构建一个管道工做集。
3)全部配置代码化,方便Job配置迁移与版本控制。
4)须要pipeline脚本语法基础。
基础架构:
1)全部代码包裹在pipeline{}层内。
2)stages{}层用来包含该pipeline全部stage子层。
3)stage{}层用来包含具体咱们须要编写任务的steps{}子层。
4)steps{}层用来添加咱们具体须要调用的模块语句。 agent区域:
1)agent定义pipeline在哪里运行。
可使用any,none,或具体的Jenkins node主机名等。
例如要特指在node1上执行,能够写成agent {node{label 'node1'}}
environment区域:
1)”变量名称=变量值“定义咱们的环境变量。
2)能够定义全局环境变量,应用全部stages任务。
3)能够定义stage环境变量,应用单独的stage任务。
script区域(可选):
1)在steps内定义script{}。
2)groovy脚本语言。
3)用来进行脚本逻辑运算。
经常使用steps区域:
1)echo:打印输出。
2)sh:调用Linux系统shell命令。
3)git url:调用git模块进行git相关操做。
pipeline{
agent any
environment{
host='test.example.com'
user='deploy'
}
stages{
stage('build'){
steps{
sh "cat $host"
echo $deploy
script{
def servers = ['node1','node2']
For(int i=0;i<server.size();i++){
echo "testing ${servers[i]} server"
}
}
}
}
}
}
复制代码
安装git的目的是在自动化部署前实时从git远程仓库中拉取最新的代码。在linux(centos7系统)安装git: yum install git
使用命令: ssh-keygen -t rsa -C "youremail@abc.com"
能够不用设置密钥密码,连续按三次回车,如图所示。
将/root/.ssh/id_rsa.pub中生成的密钥添加到github上去。具体步骤以下:
1)打开github,点击右上角我的头像,点击setting。
2)找到Personal settings的SSH AND GPG KEYS一栏,点击New SSH key。
3)将刚刚在服务器生成的ssh字符串复制黏贴进文本框,点击Add SSH key便可,如图3所示。
安装maven的目的是经过项目中的pom.xml文件自动解决项目依赖问题,构建项目。将本地已下载好的maven压缩包上传至服务器解压便可。
1)将本地maven包拖进XShell框内,进行上传。如图所示。
2) 使用命令进行解压:tar -zxvf apache-maven-3.3.9-bin.tar.gz
3)配置环境变量。编辑etc/profile文件,添加环境,添加完毕后保存退出,source使其生效:
vi etc/profile
//在文件中加入下述字符串
export MAVEN\_HOME=/usr/local/maven/maven
export PATH=\$MAVEN\_HOME/bin:\$PATH
//使其生效
source /etc/profile
复制代码
4)检查版本号,检查环境是否已正确配置:mvn -v
,结果如图所示:
使用命令,关闭防火墙,防止防火墙影响jenkins的工做:
systemctl stop firewalld
systemctl disable firewalld
复制代码
关闭防火墙后,使用yum命令,安装jenkins:
//下载YUM源
wget -O /etc/yum.repos.d/jenkins.repo
http://pkg.jenkins-ci.org/redhat/jenkins.repo
//添加YUM源
rpm \--import https://jenkins-ci.org/redhat/jenkins-ci.org.key
//YUM安装
yum install -y jenkins
复制代码
因为使用yum源安装较慢,故直接使用官网提供的war包,如图所示,复制至tomcat目录下的webapps中。
1)点击manage jenkin中的Configure System,如图所示。
填写git plugin信息,如图所示。
2)添加凭据。首先点击主页面凭据,随后点击Jenkins,如图所示,在全局凭据中加入我的信息。用户名与密码为github邮箱与github密码。
1)首先点击新建Item,如图所示。
2)填写名称,并点击自由风格项目,最后点击肯定,如图所示。
4)填入描述与git仓库地址和Credentials,如图所示。
\#!/bin/sh
export
PATH=\"/bin:/sbin:/user/bin:/user/sbin:/user/local/bin:/usr/local/sbin\"
\# Print env variable
echo \"The build is \$version\" \>\> test.properties
echo \"\[INFO\] Done\...\"
\# Check test properties
echo \"\[INFO\] Check test properties\"
if \[ -s test.properties\]
then
cat test.properties
echo \"\[INFO\] Done\...\"
else
echo \"test.properties is empty\"
fi
echo \"\[INFO\] Build finished\...\"
复制代码
6)点击增长构建步骤,点击调用顶层Maven目标,添加信息如图所示。
8)点击左下角的小圆圈能够看见控制台的日志输出,能够查看构建已经成功。生成的Jar包能够在/root/.jenkins/workspace/maven-freestyle-job/target中查看。如图所示。
9)此外,jenkins还能够提供定时与轮询构建。
1:轮询:检测程序反复询问代码管理系统是否有新变动。
2:按期:检测程序配置为按期启动构建,不管代码是否有变动,但若没有变动,也不会增长额外成本。
设定定时任务如图所示。
设定轮询任务如图20所示。
定时任务与轮询任务能够兼容,同时该字段遵循cron的语法(略有不一样)。具体来讲,每行包含由TAB或空格分隔的5个字段:
字段 | 范围 |
---|---|
分钟 | 一小时内(0-59) |
小时 | 一天中的小时(0-23) |
DOM | 每个月的某一天(1-31) |
月 | 月(1-12) |
DOW | 星期几(0-7),其中0和7是星期日。 |
要为一个字段指定多个值,可使用如下运算符。按优先顺序排列。
为了容许按期计划的任务在系统上产生均匀负载,H应尽量使用符号("哈希")。例如,使用0 0 * * *十几个平常工做将致使午夜大幅飙升。相比之下,使用H H * * *仍然会天天执行一次,但不能同时执行,更好地使用有限的资源。
所述H符号能够与范围内使用。例如,H H(0-7) * * * 表示从凌晨12:00(午夜)到早上7:59之间的某个时间段。还可使用H带有或不带范围的步长间隔。
该H符号能够被认为是在必定范围内的随机值,但它其实是做业名称,而不是随机函数的哈希值,因此该值仍然是任何项目稳定。
请注意,对于月份字段的日期,因为月份长度可变,短时间周期(例如*/3或H/3将不会在大多数月份结束时始终如一地工做)。例如,*/3将在一个月的第1天,第4天,第31天,而后在下个月的次日再次运行。哈希老是在1-28范围内选择,所以H/3在月底之间产生3到6天之间的差距。(更长的周期也会有不一致的长度,但效果可能相对不太明显。)
以句号开头的空行和#行将被忽略。
此外,@yearly,@annually,@monthly, @weekly,@daily,@midnight,而且@hourly也支持方便的别名。这些使用哈希系统进行自动平衡。例如,在一小时内的任什么时候间@hourly都是相同的H * * * *而且可能意味着。 @midnight其实是指在凌晨12:00到凌晨2:59之间的某个时间段。
例子:
每十五分钟一次(也许在:07:,22,:37,:52):
H / 15 * * * *
每小时上半场每十分钟一次(三次,也许是:04,:14,:24):
H(0-29)/ 10 * * * *
每小时一次,每小时45分钟,从上午9:45开始,每一个工做日下午3:45结束:
45 9-16 / 2 * * 1-5
每一个工做日上午9点到下午5点每两小时一次(多是上午10点38分,下午12点38分,下午2点38分,下午4点38分):
H H(9-16)/ 2 * * 1-5
每个月1日和15日天天一次,12月除外:
H H 1,15 1-11 *
按期任务一般在Jenkins主JVM(目前为亚洲/上海)的时区中的预约时间执行。经过在字段的第一行中指定备用时区,能够选择更改此行为。时区规范以TZ=,后跟时区的ID开头。
具备时区规范的计划的完整示例:
TZ =欧洲/伦敦
#这项工做须要在伦敦时间早上开始
H 8 * * *
#Butlers没有五点钟,因此咱们再次开始工做
H(0-30)17 * * *
1)首先点击新建Item,如图所示。
3)将事先准备好的shell代码填入流水线,如图所示。
pipeline{
agent {node{label 'master'}}
environment{
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
}
parameters {
choice(
choices:'dev\nprod',
description:'choose deploy environment',
name:'deploy_env'
)
string (name:'version',defaultValue:'1.0.0',description:'build version')
}
stages{
stage("Checkout test repo"){
steps{
sh 'git config --global http.sslVerify false'
dir ("${env.WORKSPACE}"){
git branch:'master',credentialsId:"c1b21f21-edf9-44fb-9da6-c32169ffe2d9",url:'https://github.com/lamarsan/background-program.git'
}
}
}
stage("Print env variable"){
steps{
dir("${env.WORKSPACE}"){
sh """
echo "[INFO] Print env variable"
echo "Current deployment environment is $deploy_env" >> test.properties
echo "The build is $version" >> test.properties
echo "[INFO] Done..."
"""
}
}
}
stage("Check test properties"){
steps{
dir("${env.WORKSPACE}"){
sh """
echo "[INFO] Check test properties"
if [ -s test.properties ]
then
cat test.properties
echo "[INFO] Done..."
else
echo "test.properties is empty"
fi
"""
echo "[INFO] Build finished..."
}
}
}
}
}
复制代码
4)保存退出,点击当即构建,结果会失败,如图所示。
sh 'git config --global http.sslVerify false'
一行。