jenkins入门
1.简介
基本概念解释
1、持续集成
Continuous integration (CI)
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。s
持续集成的好处主要有两个:
快速发现错误
每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易
防止分支大幅偏离主干
如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
2、持续交付
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
3、持续部署
持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。
2.jenkins安装
由于国外网站访问较慢,推荐使用清华源,这里使用war安装
https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.223/jenkins.war
启停脚本
#!/bin/bash
######################################################
# $Name: start_stop.sh
# $Version: v1.0
# $Function: clean es log index
# $Author: Shy.Zhang
# $Create Date: 2021-05-19
# $Description: jenkins启停脚本
######################################################
APP_NAME=/data/TRS/jenkins/jenkins.war
LOG=/data/TRS/jenkins/jenkins.out
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=$(ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
echo "${APP_NAME} 正在启动!"
nohup /TRS/jdk1.8.0_181/bin/java -jar -Xms2g -Xmx2g -XX:PermSize=2g -XX:MaxPermSize=2g -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true --httpPort=7080 >$LOG 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} 正在停止!"
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 2
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
3.程序目录
cat /etc/profile
#exportJENKINS_ARGS="--prefix=/jenkins"
export JENKINS_HOME=/data/TRS/jenkins/jenkinsDB
4.系统设置
我们暂时只改变这两处设置:执行者数量:表示同时可以执行几个job,生成前等待时间:是指从你点击构建到系统执行构建需要等待多长时间,这样可以防止你点错了,可以有一个取消的时间。其他配置我们会在后面的实际使用中,根据需要逐步学习配置
5.Jenkins 升级、迁移、备份
1.下载最新war包替换即可
2.迁移、备份
Jenkins的所有的数据都是以文件的形式存放在JENKINS_HOME目录中。所以不管是迁移还是备份,只需要操作JENKINS_HOME就行。建议将JENKINS_HOME打包后在拷贝,windows上可以用zip,rar等,Linux上有zip,tar等。然后将打包的文件解压到新的JENKINS_HOME目录就行了
。
进入到主目录下,可以看到很多文件,是否需要全部打包呢?
其实我们只需要打包4个文件就可以了,
分别是config.xml文件,jobs文件夹,users文件夹和plugins文件夹。
从名称上就可以看出来各自的作用,config.xml是存放配置信息的,jobs是存放创建的工程项目的,users是存放用户账信息的,plugins是存放插件的
3.使用thinbackup插件备份
1)安装插件:
登录web页面,点击系统管理:
点击管理插件:
点击可选插件,选择你需要安装的插件
安装完成后,一般情况下不需要重启Jenkins,具体根据提示。
2)配置插件:
4)测试从备份恢复
我们删除job目录下的my-freestyle-job目录,
rm my-freestyle-job -rf
drwxr-xr-x 3 root root 38 Dec 8 15:48 accout-maven-job
drwxr-xr-x 3 root root 101 Dec 8 15:48 frontend-job
drwxr-xr-x 3 root root 101 Dec 8 15:48 pipline-demo
然后我们使用刚才的备份恢复:
6.创建一个freestyle的Job
1、执行简单命令或脚本
job配置页面:
勾选丢弃旧的构建:
由于每次构建都会生成很多构建产物,如果频繁构建会占用很多的空间,我们可以通过这几个选项控制构建产物的保留。一般建议选择保留最近5-10的构建为适宜。
点击意即构建执行一下,看看结果:
通过这个小例子,我们可以总结如下几点:
1、可以使用Jenkins在页面执行任何需要在linux命令行的操作;
2、定不要在生产环境中用root用户启动jenkins。
2、配置使用Gitlab
1、在Jenkins本地生成SSH Key:
ssh-keygen -t rsa
2、配置Gitlab Deploy Key
![](https://img2020.cnblogs.com/blog/1436424/202005/1436424-20200518152939583-897339845.png)
3、安装git并本地测试
yum install git -y
测试
git clone git@gitlab.c.com:disanfang/frontend.git
3、代码发布
上面的示例我们已经实现Gitlab拉取地Jenkins本地,下面接下上面的示例,我们实现将代码发布到我们的服务器:
1)配置免密登录
要实现无交互式的传输文件,执行命令,我们首先要保证Jenkins本机可以免密登录到目标主机。
ssh-copy-id -i .ssh/id_rsa.pub 192.168.56.11
测试连通性
ssh 192.168.56.11
exit
2)编写发布脚本
我们实现将从Git拉到的代码打包,然后发布到node1的/data/web目录下。编辑我们的Job,在构建处输入如下代码
BUILD_ID=dontkillme
find ./target/ -name "**.jar"|grep -v "jar"|xargs cp -t /application/jar/ -f
7.创建Maven项目
上面我讲述的Job都是非编译项目,也就是代码从仓库中拉下来,不经过任何操作就可以发布,这对于像Java、Android等源码需要编译的项目是不可用的,下面我们讲解如何使用Maven插件来构建Java项目。
1、Maven介绍
Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
2、安装Maven插件
我们要使用Jenkins+Maven对Java项目进行构建,需要安 Maven Integration
3、Linux下安装Maven
1)下载Maven 3安装包
官网:http://maven.apache.org/download.cgi
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/
2)安装Maven
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar xf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/
ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
cd ..
/usr/local/maven/bin/mvn -v
3)配置
编辑/etc/profile文件,在末尾添加
export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH
4、Maven 插件配置
5、创建Maven Job
6、Maven的常用命令
此部分内容了解即可,
1. 创建Maven的普通java项目:
1)创建Maven的普通java项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
2) 创建Maven的Web项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3.)清除后再编译
mvn clean install
我们Jenkins Biuld部分最常用的配置是:clean install -Dmaven.test.skip=true。
clean package -e -U -DskipTests #强制更新快照仓库
clean package -DskipTests
8.权限配置
由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,我们使用[Role-based Authorization Strategy](http://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin) 插件,
1、启用插件
插件安装后,我们先启用该插件管理Jenkins权限。
2、创建用户
我们新建一个test用户:
3、创建角色
Jenkins用户都有两种角色:全局角色和Job角色,我们先创建全局角色test,
然后赋予cs角色全局读的功能。
再创建Job角色test,并赋予Job只读权限
模糊匹配要使用 .*而不是单纯的 一个 * 切记
Pattern:用于匹配Job名称。并授权可读权限
4、用户授权
LWu24FQoRA9gm
在全局角色下添加我们的test用户,并赋予该用户我们刚才创建的全局test角色。
保存后,我们使用test用户登录:
我们只有查看的权限,而且看不到任何Job信息。接着我们再赋予test用户Job角色下的test角色:
再次使用test用户登录,我们发现匹配到的项目出现了,并且我们只能查看该Job的信息。
我们赋予Job roles下test角色 构建权限后,再次登录,发现我们可以构建Job。
9.构建一个node.js项目
1、插件安装
2.安装node.js
#下载node二进制包,此包已经包含node,不需要再编译
wget https://nodejs.org/download/release/v14.2.0/node-v14.2.0-linux-x64.tar.gz
#解压缩
tar -zxvf node-v14.2.0-linux-x64.tar.gz
#进入node文件夹
cd node-v14.2.0-linux-x64
#ln -s /opt/node-v14.2.0-linux-x64/bin/node /usr/bin/node
#/etc/profile
export PATH=$PATH:/opt/node-v14.2.0-linux-x64/bin:$PATH
#读取文件,生效PATH
source /etc/profile
#查看版本信息
npm -v
node -v
#安装淘宝cnpm
npm install -g cnpm
2.配置nodes地址
3.创建自由项目
执行shell
cnpm install
cnpm run build
9.添加maven仓库
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
tar -zxvf nexus-3.18.1-01-unix.tar.gz
#解压后又2个目录
#nexus-3.18.1-01:包含了 Nexus 运行所需要的文件。是 Nexus 运行必须的
#sonatype-work:包含了 Nexus 生成的配置文件、日志文件、仓库文件等。当我们需要备份 Nexus 的时候默认备份此目录即可
#修改环境变量
vim /etc/profile
export NEXUS_HOME=/usr/local/nexus/nexus-3.18.1
export PATH=$PATH:$NEXUS_HOME/bin
source /etc/profile
#修改启动用户
vim /usr/local/nexus/nexus-3.18.1/bin/nexus.rc
#run_as_user="" #内容就这一行,放开注释,填写用户即可
#修改端口
vim /usr/local/nexus/nexus-3.18.1/etc/nexus-default.properties #默认是8081
#最后启动nexus
cd /usr/local/nexus/nexus-3.18.1/bin
./nexus start
./nexus status
#访问http://ip:8081,登陆用户admin 密码存放在:/usr/local/nexus/sonatype-work/nexus3/admin.password 目录
#开机自启动
vim /etc/rc.d/rc.local
/usr/local/nexus/nexus-3.18.1/bin/nexus start #添加这一行内容
chmod 755 /etc/rc.d/rc.local
在setting中配置
<server>
<id>nexus</id>
<username>admin</username>
<password>QDz1</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus.com/repository/maven-public/</url>
</mirror>
</mirrors>
推送
mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=10.2.0.1.0 -Dpackaging=jar -Dfile=blade-gateway.jar -Durl=https://repo.rdc.aliyun.com/repository/127336-release-Ua0yA8 -DrepositoryId=rdc-releases
DgroupId和DartifactId构成了该jar包在pom.xml的坐标,项目就是依靠这两个属性定位。自己起名字也行。
Dfile表示需要上传的jar包的绝对路径。
Durl私服上仓库的位置,打开nexus——>repositories菜单,可以看到该路径。
-Durl中指定自己三方库地址 -DrepositoryId 和 server中配置的ID对应
DrepositoryId服务器的表示id,在nexus的configuration可以看到。
Dversion表示版本信息,怎样得到一个jar包准确的版本呢?
解压该包,会发现一个叫MANIFEST.MF的文件,这个文件就有描述该包的版本信息。
比如Manifest-Version: 1.0可以知道该包的版本了。
上传成功后,在nexus界面点击3rd party仓库可以看到这包