背景
运维的项目是一个使用angularjs+bootstrap开发的前端企业应用,从技术上就知道这是个老项目,没有流水线,打包部署都是手工,只能用windows的VisualStudio进行编译(项目一开始就是使用visualstudio 进行开发,typescript脚本只能通过vs进行编译,无法通过nodejs相关工具进行编译,原因未知),每次部署测试环境都要手动将修改过的代码放到一个压缩包中通过微信发给客户进行部署(因为整个项目有点大,所以也不能每次部署都发整个项目),很难相信现在已经是2023年了。
背景交代完毕,问题就是每次都要手动将修改过的文件手动复制到一个文件夹中,而且文件夹目录结构还要和项目保持一致,做一次两次还好,当一天要重复同样的事情十几二十次,就变成一个折磨人的事,急需一个自动化工具完成。
实现
本来想借助webstorm自动完成,webstorm的git工具可以列出变化的文件,类似下面这个(客户项目不能截图,只能找个其他项目截图)
但webstorm不提供将变化过的文件导出的功能,想想也正常,都2023年了,谁还会用这么奇葩的部署方式,没办法,自能自己做,无意中发现sourcetree有一个自定义操作的功能,可以自定义脚本,如图
在commit信息上右键,就可以编辑自定义操作,可以执行一个bash脚本或者命令
这里定义一个c2f.sh
的脚本,系统提供三个参数,分别是
- $REPO:仓库路径
- $FILE:选中文件的路径(这个就是我们需要的)
- $SHA:选中commit的hash值
基本思路就是
- 脚本中获取选中的文件路径,根据文件路径在目标文件夹中创建和原文件一样的目录结构,并且将原文件复制到目标文件夹中
- 因为是前端项目,ts编译后会产生js文件和map文件,这两个文件不在git上,但也要复制到目标文件夹中
- 复制完后通过zip命令打包
以下就是脚本,MacBook pro运行通过
#!/bin/bash
v_origin_dst=/Users/zhengjianfeng/project/old/
rm -rf $v_origin_dst/old-ui/*
for file in $*
do
#项目目录
v_src=/Users/zhengjianfeng/prod/project
#目标路径
v_dst=/Users/zhengjianfeng/project/old二期/更新/old-ui
IFS='/'
read -a s1 <<<"$file"
v_index=${#s1[@]}
v_file_full_name=${s1[$v_index-1]}
IFS=''
for (( i = 0; i < $v_index-1; i++ ))
do
v_src="${v_src}/${s1[i]}"
v_dst="${v_dst}/${s1[i]}"
done
mkdir -p $v_dst
v_src_file_path=$v_src/$v_file_full_name
cp -r $v_src_file_path $v_dst/
echo $v_src_file_path
IFS='.'
read -a s2 <<<"$v_file_full_name"
IFS=''
v_file_name=${s2[0]}
v_file_suffix=${s2[1]}
if [ "ts" == "$v_file_suffix" ];
then
v_js_name=${v_file_name}.js
v_map_name=${v_file_name}.js.map
cp -r $v_src/$v_js_name $v_dst/
cp -r $v_src/$v_map_name $v_dst/
echo $v_src/$v_js_name
echo $v_src/$v_map_name
fi
done
cd $v_origin_dst
rm -rf old-ui.zip
zip -r old-ui.zip old-ui
给自定义操作取一个名字,比如打包
,就可以在菜单中选择这个操作
下面是执行的截图
问题
sourcetree和webstorm不一样,sourcetree选择多个commit时,下面列出的并不是所有涉及到修改的文件,而是多个commit文件对比,这有时候就会导致漏文件,以后有时间再研究吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。