侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

go语言多项目批量更新依赖及自动调用jenkins构建流程步骤

Go  /  管理员 发布于 1年前   566

需求

有 10 + 个项目都依赖一个 common 仓库,每次修改 common 后都需要更新 10 + 个项目的 go mod

更新后还需要都去 jenkins 里面点构建


思路

1.在一个工作目录拉取需要更新的项目中的一个,如 A 项目

2.拉取后进入 A 项目目录

3.检测需要更新的分支是否存在 git ls-remote --heads origin $TARGET_BRANCH

4.存在则直接 checkout 过去,不存在则基于 main 分支新起一个 $TARGET_BRANCH 分支

5.更新依赖,运行

 go get -u ****/common@依赖的分支
 go mod tidy
 git add go.mod go.sum
 git commit -m "update common@$DEPENDENCY"
 git push origin $TARGET_BRANCH` 


6.获取个人 jenkins API Token 网页路径 

https://jenkins-k8s.***.com/user/wanna/configure

7.获取 jenkins crumbs for CSRF

 JENKINS_CRUMB=$(curl -s 'https://jenkins-k8s.****.com/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' --user $CERTIFICATE |grep Jenkins-Crumb| awk -F':' '{print $2}')
echo $JENKINS_CRUMB

8.去 jenkins 点击项目构建后复制出请求的 curl

9.替换项目名和 crumbs 并运行新的 curl

10.切换到上级目录

11.重复 1-10 更新项目 B 直到更新完全部项目


实现脚本:

#!/bin/bash
WORK_DIR="$HOME/.wanna/git_temp/"
if [ ! -d "$WORK_DIR" ]; then
  mkdir -p "$WORK_DIR"
fi
ALL_PROJECT="project1,project2,project3,project4"
PROJECTS=$1
TARGET_BRANCH=$2
DEPENDENCY=$3
DEPLOY_ENVS=$4
# jenkins 凭证
CERTIFICATE="wanna:119d3f8b35f947f6921910e561998e3299"
if  [ ! -n "$PROJECTS" ]; then
    echo "input project name; eg:【 ./auto_update.sh project1,project2 version/1.9.1 feat/add_contlevel test 】"
    exit 0
fi
if  [ "$PROJECTS" = "all" ]; then
    PROJECTS=${ALL_PROJECT}
fi
if  [ ! -n "$TARGET_BRANCH" ]; then
    echo "input target branch name; eg:【 ./auto_update.sh project1,project2 version/1.9.1 feat/add_contlevel test 】"
    exit 0
fi
if  [ ! -n "$DEPENDENCY" ]; then
    DEPENDENCY="main"
fi
if  [ ! -n "$DEPLOY_ENVS" ]; then
    DEPLOY_ENVS="local01-test"
fi
PROJECT_NAME=(${PROJECTS//,/ })
# get crumbs for CSRF
JENKINS_CRUMB=$(curl -s 'https://jenkins-k8s.****.com/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' --user $CERTIFICATE |grep Jenkins-Crumb| awk -F':' '{print $2}')
echo $JENKINS_CRUMB
# 拼接环境
IFS=',' read -r -a ENV_ARRAY <<< "$DEPLOY_ENVS"
ENV_COUNT=${#ENV_ARRAY[@]}
if [ $ENV_COUNT -gt 1 ]; then
    for i in ${ENV_ARRAY[@]}; do
      if [ $i == ${ENV_ARRAY[0]} ]; then
        DEPLOY_ENVS_STR="%5B%22$i%22"
      else
        DEPLOY_ENVS_STR="$DEPLOY_ENVS_STR%2C+%22$i%22"
      fi
    done
    DEPLOY_ENVS_STR="$DEPLOY_ENVS_STR%5D"
else
    DEPLOY_ENVS_STR="%22${ENV_ARRAY[0]}%22"
fi
# 手动发一次jenkins后拷贝提交的请求里面的json字段
FORM_DATA_TEMPLATE="json=%7B%22parameter%22%3A+%5B%7B%22name%22%3A+%22branch%22%2C+%22value%22%3A+%22$TARGET_BRANCH%22%2C+%22quickFilter%22%3A+%22%22%7D%2C+%7B%22name%22%3A+%22deploy_envs%22%2C+%22value%22%3A+$DEPLOY_ENVS_STR%7D%2C+%7B%22name%22%3A+%22build_for_vest%22%2C+%22value%22%3A+false%7D%2C+%7B%22name%22%3A+%22is_g%22%2C+%22value%22%3A+$IS_G%7D%5D%2C+%22statusCode%22%3A+%22303%22%2C+%22redirectTo%22%3A+%22.%22%2C+%22Jenkins-Crumb%22%3A+%22$JENKINS_CRUMB%22%7D&Submit=Build"
# 切到工作目录
cd $WORK_DIR
for PROJECT in ${PROJECT_NAME[@]}; do
    echo "$PROJECT start..."
    #  下载项目
    if [ -d "${PROJECT}" ]; then
        echo "$PROJECT exists"
    else
        echo "cloning $PROJECT"
        git clone ssh://git@git.***.com/$PROJECT.git
    fi
    # 切换到项目目录
    cd $PROJECT
    exists_in_remote=`git ls-remote --heads origin $TARGET_BRANCH`
    # 远程分支不在就创建
    if [ -z "$exists_in_remote" ]; then
        echo "Branch name $TARGET_BRANCH doesn't exist in remote repository. Pushing it now."
        git checkout main
        git checkout -b $TARGET_BRANCH
        git push -u origin $TARGET_BRANCH
    else
        git checkout $TARGET_BRANCH
        git pull --rebase
    fi
    # 切换到指定的分支
    # 拉取最新代码
    git pull -f
    # 更新指定的依赖包
    go get -u git.***.com/common@$DEPENDENCY
    go mod tidy
    # 提交并推送更新
    git add go.mod go.sum
    git commit -m "update common@$DEPENDENCY"
    git push origin $TARGET_BRANCH
    echo "send to jenkins build"
    curl "https://jenkins-k8s.***.com/job/game/job/$PROJECT/build?delay=0sec" \
        --user $CERTIFICATE \
        --data-raw "$FORM_DATA_TEMPLATE" \
        --compressed
    echo "$PROJECT end"
    echo "========================================================================================================"
    cd ..
done

使用方法:

第一个参数: 

需要更新的项目用","隔开 如果传all 则是更新所有人的所有项目

第二个参数: 

指定项目需要更新的分支

第三个参数: 

common的分支名字 一般是feat/*** 默认不填则为main

第四个参数: 

需要发布的环境,一般是test, 是test时可以不填 (不能在不填第三个参数的情况下填第四个参数)

 ./auto_update.sh project1,project2 version/1.9.1 feat/add_contlevel dev 

把project1,project2项目的version/1.9.1分支更新到common@feat/add_contlevel,并发布到dev环境

 ./auto_update.sh all version/1.9.1 feat/add_contlevel 

把所有项目的version/1.9.1分支更新到common@feat/add_contlevel,并发布到test环境

 ./auto_update.sh all version/1.9.1  

把所有项目的version/1.9.1分支更新到common@main,并发布到test环境



  • 上一条:
    在go语言中实现数学pow(x^y 的幂次)代码示例
    下一条:
    Laravel 10.24版本发布
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-09
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-12
    • 2021-01
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-08
    • 2024-11
    • 2025-02
    • 2025-04
    • 2025-05
    • 2025-06
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客