背景

运维的项目是一个使用angularjs+bootstrap开发的前端企业应用,从技术上就知道这是个老项目,没有流水线,打包部署都是手工,只能用windows的VisualStudio进行编译(项目一开始就是使用visualstudio 进行开发,typescript脚本只能通过vs进行编译,无法通过nodejs相关工具进行编译,原因未知),每次部署测试环境都要手动将修改过的代码放到一个压缩包中通过微信发给客户进行部署(因为整个项目有点大,所以也不能每次部署都发整个项目),很难相信现在已经是2023年了。

背景交代完毕,问题就是每次都要手动将修改过的文件手动复制到一个文件夹中,而且文件夹目录结构还要和项目保持一致,做一次两次还好,当一天要重复同样的事情十几二十次,就变成一个折磨人的事,急需一个自动化工具完成。

实现

本来想借助webstorm自动完成,webstorm的git工具可以列出变化的文件,类似下面这个(客户项目不能截图,只能找个其他项目截图)

image-20231108232558431

但webstorm不提供将变化过的文件导出的功能,想想也正常,都2023年了,谁还会用这么奇葩的部署方式,没办法,自能自己做,无意中发现sourcetree有一个自定义操作的功能,可以自定义脚本,如图

image-20231108232747289

在commit信息上右键,就可以编辑自定义操作,可以执行一个bash脚本或者命令

image-20231108232841533

这里定义一个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

给自定义操作取一个名字,比如打包,就可以在菜单中选择这个操作

image-20231108233626707

下面是执行的截图

image-20231108233730983

问题

sourcetree和webstorm不一样,sourcetree选择多个commit时,下面列出的并不是所有涉及到修改的文件,而是多个commit文件对比,这有时候就会导致漏文件,以后有时间再研究吧。


DQuery
300 声望94 粉丝

幸福是奋斗出来的