需求背景

  • 因禅道要作为产品去进行推进,相应的Jenkins集成,部署,也陆续都需要提上日程。
  • 目前所做的Jenkins集成也是为了后续 开发 - 测试 - 部署 ,ci这条流水线能够顺畅,在人力较少的情况下提高研发测试效率。

    实现思路

    思考禅道更新都需要进行哪些部分的更新

    扩展部分的代码替换

  • 即 moduile/改动模块/ext 下的所有内容。遵循禅道php二开的规则来进行开发存放的文件。

    涉及数据库方面改动的增量sql执行

  • 通过 ssh到目标机器之后 通过mysql 外部调用sql 脚本的方式来完成对数据库的更新。

    实现步骤

    Jenkins环境 ,待部署测试机环境 建立ssh互信。

    下面链接看具体配置方法

  • https://blog.csdn.net/chenghuikai/article/details/52807074

    创建 Jenkins 项目 - Git源代码控制

    image.png ```groovy def gettags = (“git ls-remote -h http://xxx/zentaopms.git").execute() gettags.text.readLines().collect { it.split()[1].replaceAll(‘refs/heads/‘, ‘’) }.unique()

    git ls-remote -h

    简单来说就是显示出来该git项目的所有分支与tag ,

    仅限于 refs / heads 和 ref / tags。这些选项是not相互排斥的; 当同时给出时,将显示存储在 refs / heads 和 refs / tags 中的引用。

  1. - 效果
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2962981/1611919423563-3de202bf-2be9-4b56-b15c-43b8bb9817eb.png#align=left&display=inline&height=336&margin=%5Bobject%20Object%5D&name=image.png&originHeight=336&originWidth=719&size=74169&status=done&style=none&width=719)
  3. - 下拉框内会有所有的branch tag信息,进行选择即可
  4. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2962981/1611919507756-dd6f188d-252a-47c7-b6a7-aca6f31c7637.png#align=left&display=inline&height=798&margin=%5Bobject%20Object%5D&name=image.png&originHeight=798&originWidth=1047&size=166334&status=done&style=none&width=1047)
  5. - Choice Parameter 同样与上面的功能类似,只不过选项由维护者手动编辑,在选项中逐行添加即可。后面作为环境变量引用到构建用的shell脚本中
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2962981/1611919654852-c9694d3c-045a-43a4-88e3-639b2842bfd5.png#align=left&display=inline&height=844&margin=%5Bobject%20Object%5D&name=image.png&originHeight=844&originWidth=1090&size=230432&status=done&style=none&width=1090)
  7. - ${git_branch} 即上面进行设置的 branch参数
  8. - 构建
  9. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2962981/1611919766225-6c5c2161-409c-4c98-9693-1c65a2eca53d.png#align=left&display=inline&height=500&margin=%5Bobject%20Object%5D&name=image.png&originHeight=500&originWidth=1070&size=242493&status=done&style=none&width=1070)
  10. - 构建选择执行shell,之后进行执行shell脚本编写
  11. ```shell
  12. #!/bin/bash
  13. set -x
  14. # 上面取parameter的时候的选项 作为变量引用
  15. Publish_IP=${server}
  16. PASSWD_HOME=${JENKINS_HOME}/secret.txt
  17. # 当前工作目录
  18. #/home/jenkins/workspace/Zentaopms_test
  19. # 替换禅道源码文件
  20. #scp 命令
  21. # 执行增量sql
  22. #【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】,示例:
  23. # C:\MySQL\bin\mysql –uroot –p123456 -Dtest<C:\test.sql
  24. #/bin/bash /opt/zbox/bin/mysql -uroot -p123456 -Dzentao<../increasment.sql
  25. preparation(){
  26. echo "输出JenkinsHome:${JENKINS_HOME}"
  27. echo "当前路径:${WORKSPACE}"
  28. cd ${WORKSPACE}
  29. }
  30. update_model(){
  31. # 更新拓展 model scp命令 复制替换 文件
  32. echo '扩展model'
  33. # scp 命令想要免密首先需要配置ssh互信,见上面步骤
  34. scp -r module root@$Publish_IP:/opt/zbox/app/zentao
  35. # 测试环境的禅道安装方式是一键安装,故mysql与禅道安装包是耦合在一起的,位于/opt/zbox/bin下
  36. # 将增量sql脚本复制到目标服务器的 /opt/zbox/bin目录下
  37. scp -r incremental_sql.sql root@$Publish_IP:/opt/zbox/bin
  38. }
  39. update_sql(){
  40. # 执行拓展 增量sql 取得执行返回进行判断是否成功
  41. # sql 脚本路径使用相对路径易出错,因为其执行顺序是 ssh到目标机器之后,再去执行mysql导入脚本
  42. # 相对路径较难把握脚本实际引用位置
  43. res =`ssh root@$Publish_IP "/opt/zbox/bin/mysql -uroot -pxxxx -Dzentao</opt/zbox/bin/incremental_sql.sql"`
  44. echo $res
  45. }
  46. echo "构建执行开始"
  47. echo "当前发布IP地址 $Publish_IP"
  48. preparation
  49. update_model
  50. echo "构建执行结束"

一些解释

  • 整个构建过程为 Jenkins -> Gitlab 拉取代码到 Jenkins本地工作环境 ->
    • 将拉下来的代码中的module复制到目标服务器的 对应目录下,完成module层扩展替换。
    • 将拉下来的代码中的 incremental_sql.sql 增量sql脚本复制到 目标服务器的对应目录
      • ssh到目标服务器执行增量sql脚本,完成数据库扩展
  • 是否需要重启服务?
    • 不需要,经查,php不需要重新启动服务,替换源码文件即可实现热更新部署,属实方便。