Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins是一个广泛用于持续构建的可视化Web工具,持续构建就是将项目自动化编译、打包、部署。通过规范化来完成,简单,繁琐,浪费时间的重复工作。
1、开发人员提交代码到git仓库
2、Jenkins手动/定时构建项目
3、Jenkins拉取git仓库代码-》代码编译-》打包镜像-》推送到镜像仓库
4、Jenkins执行脚本/Dodckerfile在Docker主机上创建容器并发布
5、测试人员浏览项目进行测试
用户手册:
https://jenkins.io/zh/doc/
下载:
https://www.jenkins.io/zh/download/
或者使用本人提供的
https://download.csdn.net/download/weixin_39218464/27377641
# 注意我们需要安装java环境
yum install -y java
yum localinstall -y /root/jenkins/jenkins-2.222.1-1.1.noarch.rpm
systemctl start jenkins
查看jenken服务是否开启与端口
netstat -lnpt
在C:\Windows\System32\drivers\etc目录下修改hosts文件
192.168.10.101 jenkins.liuyuanshan.top
cat /var/lib/jenkins/secrets/initialAdminPassword
http://jenkins.liuyuanshan.top:8080/login
1、在$JENKINS_HOME/hudson.model.UpdateCenter.xml文件中,默认内容如下/var/lib/jenkins/hudson.model.UpdateCenter.xml
xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins-ci.org/update-center.json
</site>
</sites>
这个地址在外国的服务器,因为墙的原因,下载初始化界面所需插件不了,就一直处于等待状态
把url改为http://mirror.xmission.com/jenkins/updates/update-center.json就解决了
重启服务
systemctl restart jenkins
导入扩展
扩展来源:
https://download.csdn.net/download/weixin_39218464/27377641
# 解压插件扩展
tar -zxvf jenkins_plugins.tar.gz
# 删除原有插件删除
rm -rf /var/lib/jenkins/plugins/*
# 拷贝解压后的插件并移动
mv plugins/ /var/lib/jenkins/
# 停止服务
systemctl stop jenkins
# 查看所有插件
ls /var/lib/jenkins/plugins/
# 递归设置文件所有者是谁
chown -R jenkins.jenkins /var/lib/jenkins
# 启动服务
systemctl start jenkins
# 查看进程
ps aux | grep jenkins
# 查看日志
tail -f /var/log/jenkins/jenkins.log
新建任务-》testshell-》创建一个自由风格的软件项目-》确定-》构建-》执行 shell-》编写脚本内容-》保存
jenkins为何要集成gitlab
因为我们需要托管Jenkins将gitlab上项目获取到本地,为后续网站的代码发布工作做准备。
jenkins是如何集成gitlab的
由于Jenkins只是一个调度平台,所有需要安装与gitlab相关的插件既可以完成集成。
jenkins与gitlab的集成步骤
1)开发提交代码到Gitlab上
2)jenkins安装gitlab对应的插件
3)jenkins创建yzm项目,然后配置gitlab仓库项目对应的地址
配置ssh
在开发机上执行 ssh-keygen,把公钥放入到gitlab中
系统管理-》插件管理-》已安装
插件名称 | 插件作用 |
---|---|
Credentials | 允许在Jenkins中存储认证的凭据 |
Git Client | 允许Jenkins使用git |
Git Plugin | 允许Jenkins集成git |
Gitlab | 允许Gitlab触发Jenkins构建并在Gitlab中显示 |
GitLab Hook | 允许gitlab自动触发jenkins构建项目 |
Gitlab Authentiaction | gitlab身份验证插件 |
上文直接导入的扩展包以配置好,这里不再配置
1) 在Jenkins服务器上安装git环境
# 安装git
yum -y install git
# 重启Jenkins服务
systemctl restart jenkins
2)Jenkins服务中完善git的配置信息
系统管理-》全局工具配置-》git-》配置git程序执行目录位置
找到git在Jenkins服务器的安装位置
which git
新建任务-》yzm -》创建一个自由风格的软件项目-》确定-》编辑项目git配置
General
填写描述、丢弃旧的构建-》保持构建的最大个数10个
源码管理
选择-》Git-》填写Repository URL
配置host文件
如果是内网搭建的gitlab则需要在Jenkins服务器中配置解析的gitlab对应IP与域名解析配置
在Jenkins服务器中执行 ssh-keygen获取配置在Gitlab上的公钥,私钥配置在Jenkins中
1)生成公钥配置在Gitlab上
进行项目初始化构建
1、立即构建yzm项目
2、通过该控制台输出可以查看最近提交的信息
3、通过工作区可以查看代码
真实拉取gitlab的项目在
/var/lib/jenkins/workspace/
1、搭建3台Nginx服务器
2、映射host文件
使用192.168.10.102 www.liuyuanshan.top做映射域名,负载分发器
3、为192.168.10.102~104服务器安装nginx服务
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的CentOS-Base.repo 到/etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 或者
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 运行 yum makecache
yum makecache
# 运行yum install epel-release -y
yum install epel-release -y
yum install nginx -y
# 查找nginx.conf路径
find / -name 'nginx.conf'
# 重启nginx
systemctl restart nginx
4、编辑负载均衡分发器
vi www.liuyuanshan.top.conf
upstream html {
server 192.168.10.103:80;
server 192.168.10.104:80;
}
server {
listen 80;
server_name www.liuyuanshan.top;
location / {
proxy_pass http://html;
proxy_set_header Host $http_host;
}
}
重启nginx服务
# 重启nginx
systemctl restart nginx
访问查看是否否成功将请求分发
http://www.liuyuanshan.top/?name=test
cd /var/lib/jenkins/workspace/yzm
scp -r ./* root@192.168.10.103:/usr/share/nginx/html
为jenkins服务下的服务器生成密码:ssh-keygen
将Jenkins服务下的pub公钥传递到nginx服务下上,进行免密登录,使得拷贝文件时避开密码校验问题
# jenkins的密钥在配置gitee时候就已经生成过,无需再次生成,看上文中的操作
#进入到ssh文件夹拷贝pub公钥
cd /root/.ssh
# 将公钥拷贝至目标服务器下-生成的文件名为authorized_keys
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.103
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.104
查看拷贝到目标主机的公钥内容
cat authorized_keys
写一个shell脚本
1)进入项目目录,将内容进行打包
2)将内容通过scp拷贝分发到web集群组中
在jenkins服务器中进行shell脚本编写
# 进入项目目录
cd /var/lib/jenkins/workspace/yzm
# 创建shell脚本目录存放脚本文件
mkdir scripts
# 创建并编写脚本
vi html_deploy.sh
# 赋予文件读写执行的权限
chmod 777 html_deploy.sh
html_deploy.sh脚本内容
#!/usr/bin/bash
# 初始化时间变量
DATE=$(date +%Y-%m-%d-%H-%M-%S)
# 移动代码的目标服务器IP
web_serer="192.168.10.103"
# WORKSPACE
get_code(){
# WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
# WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
cd ${WORKSPACE} && \
tar czf /opt/web-${DATE}.tar.gz ./../*
}
scp_web_server(){
# 循环遍历拷贝到目标主机
for host in ${web_serer}
do
# 从opt中将压缩的文件拷贝到目标主机的opt目录下
scp /opt/web-${DATE}.tar.gz root@${host}:/opt
ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${DATE} && \
tar -zxf /opt/web-${DATE}.tar.gz -C /usr/share/nginx/html_back/web-${DATE} && \
rm -rf /usr/share/nginx/html && \
ln -s /usr/share/nginx/html_back/web-${DATE}/yzm /usr/share/nginx/html"
done
}
//方法
deploy(){
//执行get_code方法
get_code
//执行scp_web_server方法
scp_web_server
}
//触发方法
deploy
WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
修改jenkins执行权限由jenkins转为root用户
查看当前jenkins服务用户权限
ps aux |grep jenkins
vi /etc/sysconfig/jenkins
# 完成修改后记得重启服务
systemctl restart jenkins
进入jenkins系统yzm项目设置shell执行脚本
sh -x /var/lib/jenkins/workspace/yzm/scripts/html_deploy.sh
由于之前上线方式直接拉取最新代码,会造成后期回退变得困难,如果采用采用tag的方式,比如第一次上线v1.1,第二次上线v1.2,如果上线v1.2出现问题,那么可以快速回退到v1.1
1.开发如果需要发布新版本,必须将当前的版本打上一个标签tag。
2.jenkis需要让其脚本支持传递,比如用户传递v1.1 拉取v1.1标签
安装git 参数插件,引入的扩展包有,这里只是说明,没有的自行加入
在项目中配置-》勾选参数化构建过程
添加参数-》Git Parameter
修改执行脚本
sh -x /var/lib/jenkins/workspace/yzm/scripts/html_deploy_bytag.sh
在项目中配置-》勾选参数化构建过程
添加文本参数、选择参数
添加参数-》文本参数
测试上边添加的参数变量
测试传值
设置rollback为2.0-》开始构建
修改tag的脚本: html_deploy_bytag.sh
增加版本信息
cp /var/lib/jenkins/workspace/yzm/scripts/html_deploy.sh /var/lib/jenkins/workspace/yzm/scripts/html_deploy_bytag.sh
#!/usr/bin/bash
# 初始化时间变量
DATE=$(date +%Y-%m-%d-%H-%M-%S)
# 移动代码的目标服务器IP
web_serer="192.168.10.103 192.168.10.104"
Name=${DATE}-${git_version}
# WORKSPACE
get_code(){
# WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
# WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
cd ${WORKSPACE} && \
tar czf /opt/web-${Name}.tar.gz ./../*
}
scp_web_server(){
# 循环遍历拷贝到目标主机
for host in ${web_serer}
do
# 从opt中将压缩的文件拷贝到目标主机的opt目录下
scp /opt/web-${Name}.tar.gz root@${host}:/opt
ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${Name} && \
tar -zxf /opt/web-${Name}.tar.gz -C /usr/share/nginx/html_back/web-${Name} && \
rm -rf /usr/share/nginx/html && \
ln -s /usr/share/nginx/html_back/web-${Name}/yzm /usr/share/nginx/html"
done
}
//方法
deploy(){
//执行get_code方法
get_code
//执行scp_web_server方法
scp_web_server
}
//触发方法
deploy
1、将本地修改好的代码提交到远程仓库
2、在本地打标签后推送到远程上
# 修改前对当前版本进行版本定义
git tag -a "v1.1" -m 'v1.1版本'
git push origin v1.1
# 将修改后的文件提交到远程仓库
git add .
git commit -m "v1.2"
git push
# 对推送的代码进行打标签,以便于版本回退
git tag -a "v1.2" -m "v1.2版本"
git push origin v1.2
在Build with Parameters可以查看提交的tag版本
构建指定版本代码
#!/usr/bin/bash
DATE=$(date +%Y-%m-%d-%H-%M-%S)
web_serer="192.168.10.216 192.168.10.217"
Name=${DATE}-${git_version}
get_code(){
cd ${WORKSPACE} && \
tar czf /opt/web-${Name}.tar.gz ./../*
}
scp_web_server(){
for host in ${web_serer}
do
scp /opt/web-${Name}.tar.gz root@${host}:/opt
ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${Name} && \
tar -zxf /opt/web-${Name}.tar.gz -C /usr/share/nginx/html_back/web-${Name} && \
rm -rf /usr/share/nginx/html && \
ln -s /usr/share/nginx/html_back/web-${Name}/yzm /usr/share/nginx/html"
done
}
deploy(){
get_code
scp_web_server
}
back(){
back_file=$(ssh root@192.168.10.216 "find /usr/share/nginx/html_back/ -maxdepth 1 -type d -name "web-*-${git_version}"")
for host in $web_serer
do
ssh root@${host} "rm -rf /usr/share/nginx/html && \
ln -s ${back_file}/yzm /usr/share/nginx/html"
done
}
if [ $deploy_env == "deploy" ];then
deploy
elif [ $deploy_env == "rollback" ];then
back
fi