[root@node7 ~]# yum install -y jenkins-2.177-1.1.noarch.rpm
[root@node7 ~]# systemctl start jenkins
[root@node7 ~]# systemctl enable jenkins
访问jenkins的8080端口
注意,在安装插件页面,选择“选择插件来安装”,然后点击“无”。因为此时安装插件将会访问国外站点安装,速度慢。将来改成国内镜像站点安装。
“创建第一个管理员用户”页面,点击右下角的“使用admin”
进入页面后,先点击右上角的“admin”三角号的下接菜单选configure。在此页面改密码。
(一) 程序员编写代码,并推送到服务器
(1) 程序员创建软件项目
root@node5 ~]# git init myweb
(2) 初始化空的 Git 版本库于 /root/myweb/.git/
[root@node5 ~]# cd myweb
[root@node5 myweb]# echo 'my web site
' > index.html
[root@node5 myweb]# git add .
[root@node5 myweb]# git commit -m "my web 1.0"
[root@node5 myweb]# git tag 1.0 # 添加标记,标记为1.0版本
[root@node5 myweb]# git tag # 查看所有标记
1.0
(3) 在gitlab上创建名为myweb的项目
(4)程序员将代码上传到gitlab服务器
[root@node5 myweb]# git remote rename origin old-origin
error: 不能重命名配置小节 'remote.origin' 到 'remote.old-origin'
[root@node5 myweb]# git remote add origin [email protected]:devops/myweb.git
[root@node5 myweb]# git push -u origin --all
[root@node5 myweb]# git push -u origin --tags # 推送标记
(二)jenkins服务器下载代码
(1) 在jenkins服务器上安装git
[root@node7 ~]# yum install -y git
(2)在jenkins上创建一个自由风格的项目
[root@localhost ~]# cd /var/lib/jenkins/workspace/
[root@localhost workspace]# ls
wpbuild
[root@localhost workspace]# ls wpbuild/
wpress_v1.0
(3) 为下载的每个版本创建一个子目录
[root@node7 ~]# rm -rf /var/lib/jenkins/workspace/build_myweb/
Additional Behaviours -> 新增 -> checkout to a sub-directory: myweb-$webver
(4) jenkins服务器为了方便最终的应用服务器下载,把软件打包压缩放到web目录下
[root@node7 ~]# yum install -y httpd
[root@node7 ~]# systemctl start httpd
[root@node7 ~]# systemctl enable httpd
dest=/var/www/html/deploy/packages
cp -r myweb-$webver $dest # 拷贝版本文件到web目录
cd $dest
rm -rf myweb-$webver/.git # 删除版本库文件
tar czf myweb-$webver.tar.gz myweb-$webver # 打包软件
rm -rf myweb-$webver # 删除软件目录,因为只保留压缩包即可
md5sum myweb-$webver.tar.gz | awk '{print $1}' > myweb-$webver.tar.gz.md5 # 计算压缩包的md5值
cd ..
[ -f livever ] && cat livever > lastver # 将livever内容写到lastver
echo $webver > livever # 更新livever
(5)修改/var/www/html/deploy属主属组
[root@node7 ~]# chown -R jenkins.jenkins /var/www/html/deploy/
(6) 构建工程,测试。
不要把应用软件直接解压到目标。可以把每个版本的程序都放到deploy目录下,网页主目录是指向某一版本的链接。想要发布哪个版本,只要把链接指向版本目录即可。
/var/www/download: 用于保存下载的软件包
/var/www/deploy:用于保存livever版本文件和解压的软件包
/var/www/html/project:指向某一版本目录的链接文件
#-*- coding: utf-8 -*-
import os
import requests
import wget
import hashlib
import tarfile
def has_new_ver(ver_url, ver_fname):
"用于检查是否有新版本,返回值是True/False"
# 如果本地没有版本文件或本地版本文件与网上livever不一样,就是有新版本
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 r.text != local_ver: # 本地和网上的版本号不一样,有新版本
return True
return False
def check_app(app_fname, app_md5_url):
"用于检查下载的压缩包是否未损坏,完好返回值是True/损坏返回值是False"
# 计算出本地文件的md5值
m = hashlib.md5()
with open(app_fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
result = m.hexdigest()
r = requests.get(app_md5_url) # 取出网上的md5值
if result == r.text.strip(): # 本地和网上的md5值相同,则未损坏
return True
return False
def deploy(app_fname, web_root):
"用于部署应用"
# 解压软件包到目标
dest = '/var/www/deploy'
tar = tarfile.open(app_fname)
tar.extractall(path=dest)
tar.close()
# 拼接出解压目录的绝对路径
app_dir = app_fname.split('/')[-1]
app_dir = app_dir.replace('.tar.gz', '')
app_dir = os.path.join(dest, app_dir)
# 创建链接。如果链接已存在,先将其删除
if os.path.exists(web_root):
os.remove(web_root)
os.symlink(app_dir, web_root)
if __name__ == '__main__':
# 判断是否有新版本,没有的话退出
ver_url = 'http://192.168.1.31/deploy/livever'
ver_fname = '/var/www/deploy/livever'
if not has_new_ver(ver_url, ver_fname):
print('未发现新版本。')
exit(1)
# 下载软件
r = requests.get(ver_url)
version = r.text.strip()
app_url = 'http://192.168.1.31/deploy/packages/myweb-%s.tar.gz' % version
download_dir = '/var/www/download'
wget.download(app_url, download_dir)
# 检查压缩包是否损坏
app_fname = app_url.split('/')[-1]
app_fname = os.path.join(download_dir, app_fname)
app_md5_url = app_url + '.md5'
if not check_app(app_fname, app_md5_url):
print('压缩包已损坏')
os.remove(app_fname) # 删除损坏的压缩包
exit(2)
# 更新本地版本文件
with open(ver_fname, 'w') as fobj:
fobj.write(version + '\n')
# 部署软件包
web_root = '/var/www/html/project'
deploy(app_fname, web_root)