持续集成(CI)是当下最为流行的应用程序开发实施方式
是由java编写的一款开源软件
是一款非常流行的CI(持续集成)工具
1)安装Jenkins包
[root@localhost~]#wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhatstable/jenkins-2.222.1-1.1.noarch.rpm
[root@localhost ~]# yum install -y java-1.8.0-openjdk
[root@localhost ~]# rpm -ihv jenkins-2.222.1-1.1.noarch.rpm
[root@localhost ~]# systemctl start jenkins
[root@localhost ~]# systemctl enable Jenkins
2)对页面进程初始化
访问http://x.x.x.x:8080进行初始化配置
在/var/lib/jenkins/secrets/initialAdminPassword取出密码 -> 选择插件来安装 -> 点击中间上面的“无”,不安装任 何插件,点击右下角的“安装” -> 点击右下角的“使用admin继续” -> 点击“保存并完成” -> 点击"开始使用jenkins"
3)修改密码
进入jenkins首页后,改admin密码
4)安装国内站点插件
[root@localhost ~]# ls /var/lib/jenkins/updates/default.json
[root@localhost ~]# sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
[root@localhost ~]# systemctl restart jenkins
ps:如果/var/lib/jenkins/updates/default.json不存在,可以 Manage Jenkins -> Manage Plugins -> Advanced 选项卡 -> Update site : https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json -> 点 击submit提交。
5)安装插件
Manage Jenkins -> Manage Plugins -> Available选项卡,按ctrl+f进行搜索并勾选Git Parameter / Localization Chinese(Simplified) / DingTalk / GitLab -> 点击Install without restart -> 勾选Restart Jenkins when installation is complete and no jobs are running
1、在jenkins服务器上安装git
[root@ecs-9787 ~]# yum -y install git
2、新建项目并设置仓库地址
首页 -> 新建Item -> myweb / Freestyle project -> 确定 -> 源码管理 => git / Repository URL: http://192.168.113.101/devops/myweb.git -> 保存
3、构建项目
点击项目页面左边栏的Build Now(立即构建) -> Build History 下面的#1 -> 左边栏的控制台输出
4、Jenkins上查看代码目录
[root@localhost ~]# ls /var/lib/jenkins/workspace myweb
1、jenkins上修改
修改jenkins项目配置 -> 构建触发器 -> 勾选Build when a change is pushed to GitLab. GitLab webhook URL: http://192.168.113.102:8080/project/myweb -> 点击 高级 -> 点击generate生成Secret token并复制它 -> 保存
2、gitlab修改
修改gitlab配置 -> 点击项目,如myweb -> 左边栏 设置 / 集成 -> 链接url http://192.168.113.102:8080/project/myweb / 安全令牌填写jenkins中生成的Secret token -> 点击增加web 钩子。在页面中间部分找到创建的web钩子,点击test -> Push events测试,返回Hook executed successfully: HTTP 200表示成功。
3、测试
程序员推送代码到gitlab服务器后,jenkins项目将会自动构建,并通过机器人发送构建消息。
使用参数git parameter构建某一版本的代码
配置jenkins通过tag标签构建 首页 -> 新建Item -> 名字myweb2 / Freestyle project -> 勾选This project is parameterized参数化构建 => 添加参 数 => Git Parameter (Git参数) => Name: webver / Parameter Type: Branch or Tag / Default Value: origin/master -> 源码管理 => Git => Repositories => Repository url: http://192.168.113.101/devops/myweb.git / Branches to build: $webver -> 保存
构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建 检出代码到子目录
1)在jenkins服务器上删除构建目录
[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/*
2)程序员推送代码给gitlab
[root@localhost ~]# ls /var/lib/jenkins/workspace/
myweb
[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb/
index.html issue login.defs README.md
[root@localhost ~]# cat /var/lib/jenkins/workspace/myweb/index.html
<h1>My Test Web Site</h1> <h2>my site 2.0</h2> <p>tedu nsd1911</p>
1、配置jenkins通过tag标签构建
首页 -> 新建Item -> 名字myweb2 / Freestyle project -> 勾选This project is parameterized参数化构建 => 添加参 数 => Git Parameter (Git参数) => Name: webver / Parameter Type: Branch or Tag / Default Value: origin/master -> 源码管理 => Git => Repositories => Repository url: http://192.168.113.101/devops/myweb.git / Branches to build: $webver -> 保存
2、构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建
3、测试
删除jenkins服务器上的代码目录
[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/myweb2/
在jenkins的web页面上点击配置 -> 在源码管理下面找到Addtional Behaviours -> 新增 -> Checkout to a subdirectory(检出到子目录): myweb-$webver -> 保存
构建测试:构建两次,每次使用不同版本
点击 Build with Parameters -> 选择版本 -> 开始构建
[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb2/ myweb-1.0 myweb-2.0
jenkins服务器通过http协议共享打包后的软件
jenkins服务器发布当前软件版本和前一版本
计算压缩包的md5值
在jenkins服务器上安装httpd
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
# /var/www/html/deploy/live_ver:保存当前版本号
# /var/www/html/deploy/last_ver:保存前一版本的版本号
# /var/www/html/deploy/pkgs:保存软件的压缩包和它的 md5值
[root@localhost ~]# mkdir -p /var/www/html/deploy/pkgs
[root@localhost ~]# chown -R jenkins:jenkins /var/www/html/deploy
myweb2项目 -> 配置 -> 构建 -> 增加构建项目 -> Execute shell
pkgs_dir=/var/www/html/deploy/pkgs # 将下载目录拷贝到web服务器目录
cp -r myweb-$webver $pkgs_dir
cd $pkgs_dir
rm -rf myweb-$webver/.git # 删除不必要的版本库文件
# 打包
tar czf myweb-$webver.tar.gz myweb-$webver
rm -rf myweb-$webver # 删除软件目录
# 计算压缩包的md5值
md5sum myweb-$webver.tar.gz | awk '{print $1}' > myweb-$webver.tar.gz.md5 cd .. # 将live_ver的版本号写到last_ver中
[ -f live_ver ] && cat live_ver > last_ver echo -n $webver > live_ver # 将最新版本号写入live_ver
构建测试
点击 Build with Parameters -> 选择版本 -> 开始构建
访问http://jenkins服务器ip/deploy
1)在web服务器上安装htppd(再第五步时,Jenkins的HTTP服务已经开启)
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web1 ~]# mkdir /var/www/{download,deploy}
2)编写应用服务器自动上线代码
import os
import requests
import wget
import hashlib
import tarfile
def has_new_ver(ver_fname, ver_url):
"有新版本返回True,没有返回False"
# 如果本地没有版本文件则有新版本
if not os.path.isfile(ver_fname):
return True
# 比较本地版本文件和远程版本
r = requests.get(ver_url)
with open(ver_fname) as fobj:
local_ver = fobj.read()
if local_ver != r.text:
return True
else:
return False
def file_ok(fname, md5_url):
"如果本地与远程md5值一致返回True,否则返回False"
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while 1:
data = fobj.read(4096)
if not data:
break
m.update(data)
r = requests.get(md5_url)
if m.hexdigest() != r.text.strip(): # 去除r.text尾部的\n
return False
else:
return True
def deploy(app_fname, deploy_dir, dest):
"用于部署程序"
# 解压缩
tar = tarfile.open(app_fname)
tar.extractall(deploy_dir)
tar.close()
# 拼接出解压目录的绝对路径
app_dir = os.path.basename(app_fname)
app_dir = app_dir.replace('.tar.gz', '')
app_dir = os.path.join(deploy_dir, app_dir)
# 判断dest是否存在,存在先将其删除
if os.path.exists(dest):
os.remove(dest)
os.symlink(app_dir, dest)
if __name__ == '__main__':
# 判断是否有新版本,没有则退出
ver_fname = '/var/www/deploy/live_ver' #web服务器路径地址
ver_url = 'http://192.168.113.102/deploy/live_ver' #Jenkins服务器路径地址
if not has_new_ver(ver_fname, ver_url):
print('没有发现新版本。')
exit(1)
# 下载新版本程序
r = requests.get(ver_url)
pkg_url = 'http://192.168.113.102/deploy/pkgs/myweb-%s.tar.gz' % r.text
#Jenkins服务器路径地址
app_fname = '/var/www/download/myweb-%s.tar.gz' % r.text
#web服务器路径地址
wget.download(pkg_url, app_fname)
# 检查程序是否损坏,如果损坏则删除它
md5_url = pkg_url + '.md5'
if not file_ok(app_fname, md5_url):
print('文件已损坏。')
os.remove(app_fname)
exit(2)
# 部署程序
deploy_dir = '/var/www/deploy'
dest = '/var/www/html/nsd1911'
deploy(app_fname, deploy_dir, dest)
# 更新本地软件版本
if os.path.exists(ver_fname):
os.remove(ver_fname)
wget.download(ver_url, ver_fname)
运行该代码后,web会指向最新的代码