官网
Jenkins是开源的,使用Java编写的持续集成的工具,Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而更早的进入测试阶段,更早的发现问题。
持续集成,就是通常所说的CI(Continues Integration),持续集成是一种软件开发实践,开发成员经常集成他们的工作,每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
项目开发完毕
—>使用Maven构建Jar/war
—>上传到Linux服务器
—>使用命令运行服务
—>测试最新版本项目
项目开发完毕
—>提交至GitLab
—>启动Jenkins自动化部署
—>Jenkins自动从GitLab拉取到最新的代码进行打包,打包完成后自动上传到Linux服务器,并启动项目
—>测试最新版本项目
官网
官方安装教程
安装硬件要求
Gitlab是一个基于git实现的在线代码仓库软件,提供web可视化管理界面,通常用于企业团队内部协作开发。
Gitlab
和GitHub
的区别:
相同点
:二者都是基于web的Git仓库,在很大程度上Gitlab是仿照GitHub来做的;
它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布
和合作开发项目的中心化云存储的场所。
不同点
:GitHub如果要使用私有仓库,是需要付费的。Gitlab可以在上面创建私人的免费仓库。
注:安装GitLab的服务器内存最小为4G
1.安装依赖
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
2.配置镜像
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash
3.开始安装
sudo EXTERNAL_URL="当前服务器的IP或域名,供后续访问web界面时使用" yum install -y gitlab-jh
例:
sudo EXTERNAL_URL="http://192.168.44.103" yum install -y gitlab-jh
4.登录
浏览器访问步骤3中配置的服务器IP,http://192.168.44.103
,如果提示502可以稍等一会儿,尝试再次刷新界面,因为gitlab启动后需要一定时间进行初始化。
输入账号:root
密码通过以下命令进行查看
cat /etc/gitlab/initial_root_password
除非在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password
文件中(出于安全原因,24 小时后,此文件会被第一次 gitlab-ctl reconfigure
自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。
5.gitlab常用命令
gitlab-ctl start # 启动所有 gitlab 组件;
gitlab-ctl stop # 停止所有 gitlab 组件;
gitlab-ctl restart # 重启所有 gitlab 组件;
gitlab-ctl status # 查看服务状态;
gitlab-ctl reconfigure # 启动服务;
vi /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-ctl tail # 查看日志;
1.拉取镜像并运行
docker run --detach \ #在后台启动镜像
--hostname 当前服务器的IP或域名,供后续访问web界面时使用 \ #指定名称设置为容器主机名
--publish 443:443 --publish 80:80 \ #容器映射的端口号
--name gitlab \ #容器名称
--restart always \ #启动容器后自启
--volume $GITLAB_HOME/config:/etc/gitlab:Z \ #容器卷的映射目录
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \ #容器卷的映射目录
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \ #容器卷的映射目录
--shm-size 256m \ #虚拟磁盘使用的空间大小
registry.gitlab.cn/omnibus/gitlab-jh:latest #启动的镜像名称
例:
docker run --detach \
--hostname 192.168.44.103 \
--publish 443:443 --publish 80:80 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
2.查看是否启动成功
docker ps -a
docker start gitlab
3.登录
使用步骤1当中配置的IP进行访问,http://192.168.44.103
,同理,如果访问不到可以稍微等一会,尝试再次刷新
账号:root
密码查看,进入容器内部
docker exec -it gitlab /bin/bash
查看存储密码的文件
cat /etc/gitlab/initial_root_password
注:机器要求256 MB 内存,建议大于 512 MB,10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)需要安装Java 8 ( JRE 或者 JDK 都可以)
检索可用包
yum search java|grep jdk
安装JRE
yum install java-1.8.0-openjdk
安装JDK
yum install -y java-devel
3.将下载的 jenkins.war 包上传的Linux服务器,并使用如下命令进行启动
java -jar jenkins.war
首次启动war包会在/root/.jenkins
生成配置文件
待完全启动成功后 访问服务器8080端口完成配置
初始化后的密码:
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
4e67bbe261da476abdc63c5b51311646
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
密码文件使用后会自动删除
4.访问Jenkins
服务器IP+8080
密码即为步骤3中的密码
1.创建 Jenkins 挂载目录
#创建容器卷映射目录
mkdir -p /usr/local/jenkins
#给该目录配置权限 777,避免权限不足目录挂载失败导致无法启动 Jenkins 容器。
chmod 777 /usr/local/jenkins
2.使用如下命令启动容器
docker run -d \
-p 8888:8080 \
-p 50000:50000 \
-v /usr/local/jenkins:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--restart=always \
--name=jenkins \
jenkins/jenkins:latest-jdk8
此处使用的Jenkins版本是基于 JDK8 的最新版本,其他版本可参考Docker官网
3.查看是否启动成功
docker ps
4.访问Jenkins
服务器IP+8888(此处为自己设定的映射端口,可更换)
查看密码:
cat /usr/local/jenkins/secrets/initialAdminPassword
5.选择安装推荐的插件,创建用户
用户名:root
密码:wangfei1234
apache-maven-3.6.3-bin.tar.gz
上传到Linux服务器/usr/local/maven
目录tar zxvf apache-maven-3.6.3-bin.tar.gz
4.配置阿里云镜像
修改/usr/local/maven/apache-maven-3.6.3/conf/settings.xml
文件,在
标签下添加如下内容
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
yum install -y git
1.新建一个Item
2.创建任务
3.配置GitLab
4.配置Maven
5.配置项目的pom文件位置
获取配置
6.远程服务地址配置
安装Publish over SSH
插件
配置服务器地址
配置全局服务器信息(此处配置的是全局的服务器,如果针对于某个任务进行配置,也需要先配置全局,在进行选择
)
为指定任务配置服务器
执行后效果
错误效果:
正确效果
切换到目标服务器的/usr/local/jenkins_project/usr/local/jenkins_project/target
目录下就可以看到上传的文件
注:此处因为并没有配置
Remove prefix所以传过去的是一个文件夹
nohup java -jar /root/xxoo/demo*.jar >mylog.log 2>&1 &
此处的 >
表示对日志进行覆盖写
>>
表示对日志进行追加写
mylog.log
是日志输出的文件
2>&1
中的2表示标准错误输出,1表示标准输出,连起来就表示,将错误日志和标准日志全部输入到该文件中
访问项目
vi test.sh
脚本内容
:
#告诉执行器需要调用/bin/bash来执行当前脚本
#!/bin/bash
#删除first 文件夹历史数据
rm -rf first
appname=$1
#echo 表示输出打印,"arg:$1" 表示打印的内容,相当于是用arg:这个变量拼接了一个变量进行打印,$1表示运行脚本时传入的第一个变量,例如
# 在linux中执行 ./test.sh aaa 命令时,此处的$1就是传入的aaa
echo "arg:$1"
#获取正在运行的jar包pid
#此处的pid是一个声明的变量,接收查找到的jar的pid便于后续执行kill命令
#此处的awk '{printf $2}'表示,打印ps -ef命令筛查出来的结果中的第二个变量,也就是pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
#输出当前声明的变量pid
echo $pid
#如果查找的pid为空,提示一下,否则,执行kill命令
#此处的if语句的书写格式为 if [ -z 变量]; 注意中间的空格
#使用 -z 做空值判断
if [ -z $pid ];
#如果if中条件为真,就会进入then中的逻辑
then
echo "$appname not started"
#if中条件为假,就会进入else
else
#杀死进程id为$pid的运行程序
kill -9 $pid
#打印接收到的变量和字符串
echo "$appname stoping...."
#用变量check 接收ps -ef命令精确匹配的结果
check=`ps -ef | grep -w $pid | grep java`
#判断check变量是否为空
if [ -z $check ];
then
echo "$appname pid:$pid is stop"
else
echo "$appname stop failed"
#当前if语句的结束语句
fi
#最外层if语句的结束语句
fi
linux执行脚本进行测试
./test.sh jenkins
Jenkins可以在Git中的webhooks进行配置,从而实现每提交一次代码就构建一次任务,或者可以配置为合并代码时构建任务,每合并一次代码就会构建一次任务
注:jenkins cron不是标准的cron表达式
cron解析地址
示例:
*/5 * * * *
:每隔5分钟执行一次
*/5 2 * * *
:每天2点开始每隔5分钟执行一次
*/5 2 1 6-8 *
:每年的6到8月份的每天2点开始每隔5分钟执行一次
*/5 2 1 6-8,9-10*
:每年的6到8月份或者9到10月份的每天2点开始每隔5分钟执行一次
*/5 * * * 2-6
:从周二到周六每隔5分钟执行一次
解析:
/
表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟
H
表示hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间
意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * *
,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *
,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。
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 * * 1-6 * * 1-6
0点开始,每间隔2小时执行一次 0:45、2:45、4:45