开发运维一体化,网站软件等都在不断的更新升级,没个新版本的出现就意味着要部署新的环境,替换老的环境,如果这一步不能实现自动化,那么工作会非常繁忙,在此,结合公司需求,搭建了gitlab+jenkins实现持续开发持续集成。
步骤1:部署开发人员写的代码到代码管理服务器
代码管理平台还是比较多的,如github,gitlab 和 svn,github是存储在国外网站平台上,上传下载都需要带宽,每天都要上传下载,使用不划算,所以可以选择gitlab或者svn,此处使用gitlab做本地代码管理服务器。
1) 配置git
yum -y install git
git –version #查看版本
git config --global user.name "MX-Steve"
git config --global user.email "[email protected]"
git config --global core.editor vim
mkdir /devops
cd devops/
echo 'print("hello world!")' > hello.py
git init #初始化本地仓库信息
git status #查看仓库里文件状态
git add hello.py
git commit -m "hello.py"
2) 自建gitlab服务器
网上下载gitlab中文版软件包,此处将gitlab搭建在docker上
docker load < /path/to/gitlab_zh.tar
docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data gitlab_zh:latest
注意:物理机的443,80和22端口供docker容器gitlab使用,物理机地址为192.168.1.200
浏览器打开http://192.168.1.200,创建工作组devops,根据开发人员名称创建用户,创建项目,并将用户加入到项目中,此处管理员root,密码12345678
将gitlab容器中生成的秘钥导入到gitlab网页中
git remote add origin [email protected]::devops/core_py.git
git push origin master # 可以将本地git与gitlab代码管理服务器管理上传即成功
步骤2:安装配置使用jenkins,服务器ip地址为192.168.1.201,jenkins默认启动8080端口
yum -y install jenkins
systemctl start jenkins
systemctl enable jenkins
浏览器打开http://192.168.1.201:8080
cat /var/lib/Jenkins/secrets/initialAdminPassword
登录输入管理员秘钥
选择插件git安装,使用admin账户继续操作,在管理员->设置里面可以修改管理员密码
因为此处为非工作环境,因此使用wordpress作为开发人员写的软件,下载wordpress-4.8和wordpress-5.0两个版本,模拟项目开发过程中的软件升级操作
unzip wordpress-4.8-zh_CN.zip
cd wordpress/
git init
git add .
git commit -m "wordpress-1.0"
git tag v1.0
git push
第一个开发版本上传到gitlab中
cd ..
unzip wordpress-5.0-zh_CN.zip #将第一个版本覆盖掉
git add .
git commit -m "wordpress-2.0"
git tag v2.0
git push
第二个开发版本上传到gitlab中
在gitlab上创建远程仓库wordpress
步骤3:构建工程
新建任务=>选择自由风格=>添加Git Parameter参数=>源码管理采用git
1)源码采用git
2)将源码checkout到子目录
构建工程,构建tag为v1.0的源码
1)构建工程
2)选择指定的标签
检验结果
1)选择指定标签
2)查看日志输出
3)查看本地结果,构建好的项目出现在/var/lib/jinkens目录下
修改构建工程,编写插入shell脚步,实现自动部署
创建版本文件,便于区分当前版本与上一个版本,有利于版本回滚
步骤4:发布应用
vim deploy_web.py
import requests
import os
import hashlib
import tarfile
from urllib import request
#使用url进行get请求,获取网站文本信息,获取当前版本
def get_webdata(url):
r = requests.get(url)
return r.text
#将网址内容下载到fname文件中
def download(url, fname):
html = request.urlopen(url)
with open(fname, 'wb') as fobj:
while True:
data = html.read(1024)
if not data:
break
fobj.write(data)
#检查文件MD5值
def check_md5(fname):
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
#部署版本,应用发布代码
def deploy(app): # /var/www/packages/myproject_2.0.tar.gz
#切换路径到/var/www/packages路径下
os.chdir('/var/www/packages')
#解压缩myproject_2.0.tar.gz文件
tar = tarfile.open(app, 'r:gz')
tar.extractall()
tar.close()
#将.tar.gz替换成空字符串
src = app.replace('.tar.gz', '')
#创建/var/www/html/mysite软链接
dst = '/var/www/html/mysite'
if os.path.exists(dst): #如果文件存在
os.unlink(dst) #删除
os.symlink(src, dst) #否则创建软链接
if __name__ == '__main__':
#调用get_webdata()函数,目的是以发布服务器'http://192.168.1.201/live_version'网址为参数获取当前版本,ver结果为2.0
ver = get_webdata('http://192.168.1.201/live_version').strip()
app_name = 'myproject_%s.tar.gz' % ver
#app_url为下载myproject_2.0.tar.gz文件网址
app_url = 'http://192.168.1.201/packages/' + app_name
#目标文件
app_path = os.path.join('/var/www/packages', app_name)
#调用download()函数,目的是从app_url网址读取数据存入目标文件
download(app_url, app_path)
#调用check_md5()函数,目的是计算目标文件MD5值
local_md5 = check_md5(app_path)
#调用get_webdata()函数,目的从发布服务器网址获取md5值
remote_md5 = get_webdata(app_url + '.md5').strip()
#如果目标文件md5值和发布服务器提供的md5值相等,确认下载的文件无误,调用deploy()函数,以目标文件作为参数进行部署
if local_md5 == remote_md5:
deploy(app_path)
步骤5:配合周期性计划任务实现自动运维