ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

jenkins发布控制版本号和同步

2022-04-23 23:00:28  阅读:281  来源: 互联网

标签:同步 ver 版本号 version env git jenkins


jenkins发布控制版本号和同步   该文档应该算是半成品,因为有些东西还没测好,大家将就看着先。。。 一、需求引入   最近一个项目交付给客户的时候要附带配置管理的文档,而文档里面涉及到发布版本号的控制和说明。于是领导希望我用jenkins控制版本号的自增和同步回gitlab上。   公司开发人员会利用一个.env的文件,写入当前版本号,如下图。前面v1.0基本不变,但是jenkins每一次发布需要从最后一个数字递增1,例如发布一次,这个版本号应为”v1.0.2”,再下一次发布,这个版本号应为“v1.0.3”,以此类推。

二、实现和测试效果

  先给大家看看效果:

1、测试前(发布jenkins前):

(1).env文件显示版本号为:v1.0.1 (如上图)

(2)jenkins发布前显示:

 2、测试后(发布jenkins后):

(1).env文件版本号最后一个数字递增1

 (2)下一次jenkins发布前显示:

  对于这个需求,在实现修改文件版本号和同步回gitlab外,我还做了jenkins控制台的当前版本号和上一个发布版本号的显示(如上图),这个参考了小强的利用jenkins动态参数插件的文档:Dynamic Parameter Plug-in(groovy脚本),当然我加了些优化(站在巨人的肩膀上,哈哈哈~~),就是有个new_version,跟我当前需要修改成的版本号对应上了,方便测试人员看。

实现思路:

  思路不难想出来,每次jenkins发布都会在工作区间拉下该项目的代码,利用jenkins运行用户修改文件,再推送代码即可。

  我这里环境稍有不同,运行jenkins的用户就是jenkins,没有登录权限(/etc/passwd 显示为 /bin/false),如果不给登录权限,无法修改该 .env 文件的版本号,且进行下一步的maven编译。

  所以第一件事,确保jenkins用户有登录权限,参考:   https://blog.csdn.net/weixin_37417954/article/details/83589632

  上面可以理解为预处理。。。 以自由风格的软件项目做测试。

1、准备一个版本号记录文件,记录格式:

项目关键字 版本号 发布时间

2、jenkins控制台的参数化过程添加动态参数(Dynamic Parameter

(1)old_version

def sout = new StringBuffer(), serr = new StringBuffer()
def command = "sh /var/lib/jenkins/scripts/get_version/admin/get_oldver.sh admin"
def proc = command.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(10)
return sout.tokenize()
View Code

(2)new_version

   跟old_version代码类似,只是def comand 这里运行另一个脚本,用于获取下一个发布版本号:/var/lib/jenkins/scripts/get_version/get_newver.sh admin

  代码有点像更新版本号的脚本。从版本号记录文件最后一行读起,对版本号最后一个数字进行递增,然后echo出来让控制台能捕捉到这个数值。

 3、jenkins控制台的构建,执行shell配置

这里主要实现修改.env版本号及同步更新该文件到gitlab上

##### 1、jenkins工作区间版本号替换再编译
#### 1.1、写入版本号信息到版本号记录文件(从上面动态参数获取)
old_ver=`echo $old_version | tr  -d "["  | tr -d "]"`
new_ver=`echo $new_version | tr  -d "["  | tr -d "]"`

DATE=`date +%Y%m%d_%H:%M:%S`
echo admin ${new_ver} $DATE >> /var/lib/jenkins/scripts/xxx/get_version/xxx/xxx_version.txt

#### 1.2、文件版本号替换
sed -i "s/${old_ver}/${new_ver}/" .env   

#####  2、更新文件版本号,上传到gitlab
ssh 某用户@{jenkins发布机器ip} -p 55100 "sh -x /home/{某用户}/scripts/xxx/update_version/update_admin.sh $branch"

##### npm编辑
npm install
npm run build:test

最后贴下更新版本号的脚本:

#!/bin/bash

#######################################################
# $Name:        update_admin.sh
# $Version:     v1.0
# $Function:    更新xxx项目-前端版本号
# git目录:     /home/{某用户}/app/update_version/

#######################################################

## 1、拉取的分支
Pull_Branch=$1

## 2、拉取的目录,项目名
Git_Dir=/home/{某用户}/app/update_version/{某项目}
Admin_Dir=${Git_Dir}/{项目二级目录}

cd ${Git_Dir}

## 不存在就克隆仓库
if [ ! -d ${Admin_Dir} ]; then
   git clone -b ${Pull_Branch} ssh://{git地址}/{某项目}.git

## 存在就判断是否是发布分支
## 更新最新代码
else
   cd ${Admin_Dir}
   br=`git branch |grep "*"`
   localbr=`echo ${br/* /}`
   
   # 不等于发布的分支,则切换分支
   if [ "$localbr" != "$Pull_Branch" ]; then
       git checkout $Pull_Branch
   fi
   # 更新最新代码
   git pull origin ${Pull_Branch}
fi

## 3、更新版本号
cd ${Admin_Dir}

src_ver=`cat .env |awk -F'=' '{print $2}' | tr  -d "'"`
last_num=`echo $src_ver | awk -F'.' '{print $NF}'`
this_num=$(($last_num+1))
begin_num=`expr substr "$src_ver" 1 5`
dst_ver=$begin_num$this_num
echo $dst_ver
sed -i "s/${src_ver}/${dst_ver}/" .env   


## 4、上传代码
git add .env
git commit -m "update .env version"
git push origin ${Pull_Branch}:${Pull_Branch}
View Code

 

 三、一些问题

1、jenkins用户无法在工作区间上进行代码更新

  大家可以留意到我上面第3步执行shell配置那里,特意用ssh调用某个用户的某个脚本进行代码更新。本来我也不想这弄的,但发现直接在jenkins的工作区间进行push操作会报错,所以只能额外利用另一个目录去存放拉取的git项目,以该用户推送代码达到更新版本号文件的目的。

  而为了不需要明文显示密码,要在jenkins用户配置ssh密钥放到该用户下,达到免密钥去调用该用户的脚本。

  其实可以的话,最好是能在jenkins工作区间同步回去,不然存多一份代码文件,有点浪费硬盘空间,这里我还没细致研究出来是否可以这么做。

2、发布分支和版本号没对应上

  更新版本号的脚本可以留意到我进行了分支的判断,因为有可能上一次发布分支更当前不是同一个,意味着动态参数获取版本号,读取的版本号文件其实应该加一个分支号会比较合适,让后根据不同的分支去获取最近的版本号,和将要发布的版本号,这里还没测试

标签:同步,ver,版本号,version,env,git,jenkins
来源: https://www.cnblogs.com/windysai/p/16183951.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有