软件版本管理

可以在git中使用tag标记将某一次commit提交标识为某一版本

[root@develop ~]# cd myproject/   # 进入项目目录
[root@develop myproject]# git tag # 查看标记,默认没有标记
[root@develop myproject]# git tag 1.0 # 将当前提交,标识为1.0
[root@develop myproject]# git tag
1.0
[root@develop myproject]# echo 'hello world' > index.html
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "add index.html"
[root@develop myproject]# git tag 1.1

# 将本地文件和tag推送到gitlab服务器
[root@develop myproject]# git push   # 只推送文件,不推送标记
[root@develop myproject]# git push --tags

在gitlab上查看标记 标签就可以看的到

配置jenkins访问gitlab代码仓库

鼠标点点点

  1. 新建一个任务
  2. 输入任务名称 点一下下面那个 然后确定 不然点不了确认
  3. 参数化构建
  4. 名称为自己定义的变量名 用于标识tag或分支 参数类型选择分支或标签 默认值写人家提示的
  5. 指定分支为$名称 然后点击保存
  6. 在项目里面 进行构建测试
  7. 下载到子目录
  8. 配置 构建触发器 选择输出到子目录英文为“checkout to a sub directory”
  9. 仓库的本地子目录 XXX$名称
  10. 保存开始构建
  11. 查看Jenkins上的目录
  12. ls /var/lib/jenkins/workspace/myproject/

Jenkins上安装、配置httpd共享服务器

[root@jenkins ~]# yum -y install httpd # 安装apache的软件包
[root@jenkins ~]# mkdir -p /var/www/html/deploy/packages # 创建jenkins从gitlab上下载的打包代码存放的目录
[root@jenkins ~]# chown -R jenkins:jenkins /var/www/html/deploy/ # 修改权限,因为是jenkins自动下载的,需要修改存放的权限
[root@jenkins workspace]# ls -l /var/www/html/deploy/
drwxr-xr-x 2 jenkins jenkins 6 11月 29 06:55 packages
[root@jenkins ~]# systemctl start httpd
[root@jenkins ~]# systemctl enable httpd

配置Jenkins把gitlab下载的代码打包

在jenkins上修改myproject

构建 选择执行shell

pkg_dir=/var/www/html/deploy/packages
cp -r myproject-$web $pkg_dir
rm -rf $pkg_dir/myproject-$web/.git
cd $pkg_dir
tar -zcf myproject-$web.tar.gz myproject-$web
rm -rf myproject-$web
md5sum myproject-$web.tar.gz | awk '{print $1}' > myproject-$web.tar.gz.md5
cd ..
echo -n $web > ver.txt

以上步骤改好后 保存

测试 开始构建然后去jenkins的目录下去查看

网页也可以查看了在iP/deploy/packages

web1服务自动部署

安装httpd服务

[root@web1 ~]# yum install -y httpd tar python38*
[root@web1 ~]# mkdir /var/www/download # 存储jenkins主机上下载的应用代码
[root@web1 ~]# mkdir /var/www/deploy # 部署应用代码
[root@web1 ~]# ss -tlnp | grep :80

编写自动上线脚本

#1下载软件包
#2.检查软件包是否损坏
#3.解压部署到web服务器
#更新版本号文件
import os,requests,hashlib,tarfile
#1.下载软件包
def has_new_ver(web1_ver_path, ver_url):
    # web1_ver_path 为应用服务器web1主机的当前版本文件路径
    # 如果文件不存在,返回True, 提示没有新版本
    if not os.path.exists(web1_ver_path):
        return True
    # 当web1_ver_path存在时,先获取当前应用的版本号
    with open(web1_ver_path, mode="r") as fr:
        local_ver = fr.read()
    # 通过requests获取jenkins服务器上的最新版本号
    r = requests.get(ver_url)
    # 当web1上的版本号和Jenkins服务器上的版本号不相等时,返回True, 即有新的版本
    if local_ver != r.text:
        return True
    return False
#1.下载软件包
ver_url = "http://192.168.88.30/deploy/ver.txt"
web1_ver_path = "/var/www/deploy/ver.txt"
if has_new_ver(web1_ver_path,ver_url) == False:
    print("没有新版本")
    exit()
#2.md5值校验,检查软件包是否损坏
def file_ok(web1_tar_path,jenkins_tar_md5_url):
    m = hashlib.md5()
    with open(web1_tar_path,mode="rb") as fr:
        while True:
            data = fr.read(8192)#每次读文件的大小
            if len(data) == 0:
                break
            m.update(data)#分批计算
    resp = requests.get(jenkins_tar_md5_url)
    if resp.text.strip()== m.hexdigest():
        return True
    return False
#2.检查文件是否损坏
r = requests.get(ver_url)
web1_tar_path =f"/var/www/download/myproject-{r.text}.tar.gz"
web1_deploy_dir= "/var/www/deploy"
jenkins_tar_url = f"http://192.168.88.30/deploy/packages/myproject-{r.text}.tar.gz"
jenkins_tar_md5_url = jenkins_tar_url + ".md5"
with open(web1_tar_path,mode="wb") as fw:
    resp = requests.get(jenkins_tar_url)
    fw.write(resp.content)

if file_ok(web1_tar_path,jenkins_tar_md5_url) == False:
    print("文件以损坏")
    os.remove(web1_tar_path)
    exit()
#3.解压部署到web服务器上
def depoly(web1_tar_path,web1_deploy_dir,current):
    tar = tarfile.open(web1_tar_path,mode="r")
    tar.extractall(path=web1_deploy_dir)
    tar.close()
    path = web1_tar_path[:-7].split("/")[-1]
    path=os.path.join(web1_deploy_dir,path)
    #软链接存在就删除
    if os.path.exists(current):
        os.remove(current)
    os.symlink(path,current)
#3.解压部署到web服务器上

current = "/var/www/html/current" #软链接
depoly(web1_tar_path,web1_deploy_dir,current)
#更新版本号文件
if os.path.exists(web1_ver_path):
    os.remove(web1_ver_path)
with open(web1_ver_path,mode="w") as fw:
    fw.write(requests.get(ver_url).text

完整测试流程

程序员编写新版本并推送到服务器

Jenkins上构建新版本

web服务器上执行上面写的脚本,部署新版本

# 程序员编写新版本
[root@develop myproject]# vim index.html 
<marquee>Welcome to tedu</marquee>
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "modify index.html"
[root@develop myproject]# git tag 2.0
# 程序员推送到服务器
[root@develop myproject]# git push
[root@develop myproject]# git push --tags

然后在Jenkins网页上点击构建项目 开始构建

在web服务器上运行python脚本 访问ip就能看到部署的文件

你需要知道

1 Jenkins默认会把GitLab仓库代码下载到哪个目录?

/var/lib/jenkins/workspace/

2 如何一条命令将httpd设置开启自启并立刻启动?

systemctl enable httpd --now

3 如何校验数据的哈希值(如md5值)?

md5sum xxx