使用git提交配置文件同步到nacos

nacos自带的配置中心就有历史记录的功能,历史记录里面只有看到本次与上次的版本的信息,对比功能也比较缺乏,在实际生产中,一个项目一半都是多个人一起开发的,开发完才会上线,项目上线的时候需要增加或修改配置文件,这时的配置文件怎么改,开发人员很容易因为工作繁忙忘记自己的配置项,基于可以进行历史追寻的目的,方便上线的时候统计关于配置文件产生的问题,做了一个使用git提交配置文件并自动同步到nacos的流程。

当时听到开发leader提出此问题的时候,首先想到的就是整一个历史版本对比的工具,要么就是自己扩展目前关于历史记录对比的页面功能,要么就是跳出nacos的限制,使用其他的方式。

于是想到了git提交的hook,可以通过hook触发事件然后把文件推送到nacos,来个简单的流程图

公司用的是gitlab,看了下有关于CI/CD的组件,手上也有开发的服务器,这样基本硬件应该是可以了。然后需要研究下这个CI/CD,就是这个红框框

 

百度了下关于这个的介绍,其实就是要加一个配置文件,配置文件里面定义关于Git提交以后要做的事情,可以自动打包啊 发布 部署什么的,咱们研究的是怎么自动提交到nacos,先看下怎么配置的吧 

简单解释下

stages  阶段   就是 分几步干什么事 ,咱们的需求就是同步文件  就一个阶段吧 

下面的 delpoy 就是咱们真实的配置了 ,关注这个  script  这就是要执行的shell 命令  在哪执行呢? 这个tags  意思是在 tag= shell的runner上执行,而这边第三个的shell脚本意思就是执行一个 xxx路径下的main的shell ,-run_path就是注入的启动参数。

only  表示就是这个master分支下提交才会触发哦 

刚提到的runner,runner是啥呢,就是一个执行的服务器,需要咱们配置下,在gitlab上能找到项目下面的这个CI/CD的配置里面就是这个Runner

 

 

接下来就是咱们需要配置一个runner,这个runner需要在服务器上安装 gitlab-runner,执行的脚本如下

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash

 

然后yum安装 

yum -y install gitlab-ci-multi-runner -y

 

安装完成以后执行下这个(如果没有docker 需要自己安装docker,读者可以自行百度)

usermod -aG docker gitlab-runner
service docker restart
gitlab-ci-multi-runner restart

好了这样runner就安装好了 ,接下来就是注册到gitlab上了,

执行  

gitlab-ci-multi-runner  register 

下面会出一些让你设置的引导,注意的就是 runner的注册地址就是 gitlab上的这个地址,还有那个token,另外就是说的tag 就是咱们一开始说的tag  ,最后一步要选类型,记得是 shell   

 

配置完了以后 在gitlab上就能看到你的runner了。

接下来是重点了,runner能自动下载代码到本地,怎么去同步到nacos呢,只能执行一个脚本,本着研究的精神,笔者就选了用go写一个脚本,第一模拟登陆,第二模拟提交修改配置,


var strRunPath = flag.String("run_path", "", "/user/temp")

func main() {

	flag.Parse()

	urls := "http://XXXX/nacos/v1/auth/users/login"
	//登录开始

	values := url.Values{}
	values.Set("username", "nacos")
	values.Set("password", "nacos")
	reqBody := ioutil.NopCloser(strings.NewReader(values.Encode()))

	client := &http.Client{}
	req, err := http.NewRequest("POST", urls, reqBody)
	req.Header.Add("Accept", "application/json, text/plain, */*")
	req.Header.Add("Accept-Encoding", "gzip, deflate")
	req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9")
	req.Header.Add("Connection", "keep-alive")
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("Origin", "http://XXXX")
	req.Header.Add("Referer", "http://XXXX/nacos/")
	req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")

	resp, err := client.Do(req)

	defer resp.Body.Close()

	bods, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("error:", err)
	}
	var tempMap map[string]interface{}

	err = json.Unmarshal([]byte(bods), &tempMap)

	fmt.Println(string(bods))
	fmt.Println(tempMap["accessToken"])

	var saveconfigUrl = "http://XXXX/nacos/v1/cs/configs?accessToken=" + tempMap["accessToken"].(string)
	var strPath = *strRunPath //(string)(unsafe.Pointer(strRunPath))
	if strPath == "" {
		dir, errDir := filepath.Abs(filepath.Dir(os.Args[0]))
		if errDir != nil {
			fmt.Println("error:", err)
		}
		strPath = dir
	}
	fmt.Println("strPath:", strPath)
	files, err := GetAllFiles(strPath)
	for i := range files {
		var splitString = "\\"
		if strings.Contains( files[i],"/"){
			splitString = "/"
		}
		split := strings.Split(files[i], splitString)
		var fileName = split[len(split)-1]
		if fileName == ".gitlab-ci.yml" {
			continue
		}
		bytes, readErr := ioutil.ReadFile(files[i])

		if err != nil {
			fmt.Println("error : %s", readErr)
			return
		}
		var configInfo =string(bytes)
		var group = split[len(split)-2]
		var namespace = split[len(split)-3]
		values = url.Values{}
		values.Set("dataId", fileName)
		values.Set("group", group)
		values.Set("content", configInfo)
		values.Set("tenant", namespace)
		values.Set("type", "yaml")
		reqBody = ioutil.NopCloser(strings.NewReader(values.Encode()))

		client = &http.Client{}
		req, err = http.NewRequest("POST", saveconfigUrl, reqBody)
		req.Header.Add("Accept", "application/json, text/plain, */*")
		req.Header.Add("Accept-Encoding", "gzip, deflate")
		req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9")
		req.Header.Add("Connection", "keep-alive")
		req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
		req.Header.Add("Origin", "http://XXXX")
		req.Header.Add("Referer", "http://XXXX/nacos/")
		req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")
		req.Header.Add("accessToken", tempMap["accessToken"].(string))
		resp, err = client.Do(req)

		defer resp.Body.Close()

		bods, err = ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Println("error:", err)
		}
		fmt.Println(string(bods))

			fmt.Println(files[i])

	}
}

//获取指定目录下的所有文件,包含子目录下的文件
func GetAllFiles(dirPth string) (files []string, err error) {
	var dirs []string
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, err
	}

	PthSep := string(os.PathSeparator)
	//suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
			dirs = append(dirs, dirPth+PthSep+fi.Name())
			GetAllFiles(dirPth + PthSep + fi.Name())
		} else {
			// 过滤指定格式
			ok := strings.HasSuffix(fi.Name(), ".yaml") || strings.HasSuffix(fi.Name(), ".yml")
			if ok {
				files = append(files, dirPth+PthSep+fi.Name())
			}
		}
	}

	// 读取子目录下文件
	for _, table := range dirs {
		temp, _ := GetAllFiles(table)
		for _, temp1 := range temp {
			files = append(files, temp1)
		}
	}

	return files, nil
}

写完成以后,打一个包 main  放到刚才的runner的机器上,注意下路径跟之前说的那个.gitlab-ci.yml 中的脚本位置是一样的,然后给个权限,

chmod 773 main

这样一个基于git提交自动同步到nacos配置的功能就做好了,git中的文件夹第一级是namespace,第二级是group,文件名就是nacos里面的dataId 

好了就写到这,感谢观看

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值