使用terraform 进行gitlab 代码仓库批量迁移
gitlab 的代码是在文件目录中,这个对于批量迁移很简单,只需要copy 文件夹(但是对于不同gitlab server 可能需要重新设置目录权限)
几个问题
- 大批量仓库tf resource问题
直接使用默认的不是很好,需要配置的比较多,解决方法,可以通过直接查询数据库数据,使用模版引擎生成tf 文件,可选的开发语言很多,但是使用nodejs
开发可能会比较方便的- 仓库代码拷贝问题
推荐通过rsync 等工具,进行数据同步,因为git repo 存在软连接的问题,一般的scp 不能附带信息- tf 模版编写
因为可能存在多层级group,所以需要查询原有gitlab pg 数据库进行分析处理,这个分析下sql 就可以了(通过自关联查询,多级处理)- 用户权限处理
这个稍有复杂,tf gitlab provider 提供了用户权限操作的,但是对于不用的gitlab server 系统层面只识别的是用户id,但是这个id 是系统生成的
这个可以通过email 等能确认是唯一的进行关联处理,通过查询,在模版生成的时候指定用户id一个参考实现
- 模版处理
通过nodejs,为了方便管理,对于仓库信息通过rest 接口暴露,使用dotenv 管理环境变量 
yarn add node-fetch mustache dotenv
app.js: 模版生成代码
const fetch = require('node-fetch');
require("dotenv").config()
const Mustache = require("mustache");
const fs = require("fs")
fetch(process.env.gitlab_api)
    .then(res => res.json())
    .then(body => {
        fs.readFile("template/temp.mu", {
            encoding: "utf8"
        }, (err,result) => {
            if (err) {
                console.log("some wrong")
            } else {
                let output = Mustache.render(result, body);
                console.log(output)
            }
        })
});
模版:
provider "gitlab" {
    base_url = "http://gitlabserver/api/v4/"
    token = "${var.gitlab_token}"
}
{{#data.groups_parent}}
resource "gitlab_group" "{{name}}" {
    name = "{{name}}"
    path = "{{path}}"
    description = "{{description}}"
}
{{/data.groups_parent}}
{{#data.subgroups}}
resource "gitlab_group" "{{name}}" {
    name = "{{name}}"
    path = "{{path}}"
    description = "{{description}}"
    parent_id = "${gitlab_group.{{parent}}.id}"
}
{{/data.subgroups}}
{{#data.projects}}
resource "gitlab_project" "{{name}}" {
    name = "{{name}}"
    namespace_id = "${gitlab_group.{{group}}.id}"
}
{{/data.projects}}
仓库代码restapi格式:
{
   "data": {
    "projects": [
        {
          "name": "firstrong",
          "path":"firstrong",
          "description":"firstrong",
          "group" : "firstrong"
        },
        {
           "name": "secondrong",
           "path":"secondrong",
           "description":"secondrong",
           "group": "secondrong"
        },
        {
            "name": "thirdrong",
            "path":"thirdrong",
            "description":"thirdrong",
            "group": "thirdrong"
        }
    ],
    "groups_parent":[
        {
          "name":"firstrong",
          "path":"firstrong",
          "description":"firstrong"
        },
        {
            "name":"secondrong",
            "path":"secondrong",
             "description":"secondrong"
        },
        {
            "name":"thirdrong",
            "path":"thirdrong",
            "description":"thirdrong"
        }
    ],
    "subgroups":[
        {
          "name":"demoapp",
          "path":"demoapp",
          "parent":"firstrong"
        },
        {
            "name":"demoapp2",
            "path":"demoapp2",
            "parent":"secondrong"
        },
        {
            "name":"demoapp3",
            "path":"demoapp3",
            "parent":"thirdrong"
        }
    ]
   }
}- 生成的tf 内容(参考)
provider "gitlab" {
    base_url = "http://gitlabserver/api/v4/"
    token = "${var.gitlab_token}"
}
resource "gitlab_group" "firstrong" {
    name = "firstrong"
    path = "firstrong"
    description = "firstrong"
}
resource "gitlab_group" "secondrong" {
    name = "secondrong"
    path = "secondrong"
    description = "secondrong"
}
resource "gitlab_group" "thirdrong" {
    name = "thirdrong"
    path = "thirdrong"
    description = "thirdrong"
}
resource "gitlab_group" "demoapp" {
    name = "demoapp"
    path = "demoapp"
    description = ""
    parent_id = "${gitlab_group.firstrong.id}"
}
resource "gitlab_group" "demoapp2" {
    name = "demoapp2"
    path = "demoapp2"
    description = ""
    parent_id = "${gitlab_group.secondrong.id}"
}
resource "gitlab_group" "demoapp3" {
    name = "demoapp3"
    path = "demoapp3"
    description = ""
    parent_id = "${gitlab_group.thirdrong.id}"
}
resource "gitlab_project" "firstrong" {
    name = "firstrong"
    namespace_id = "${gitlab_group.firstrong.id}"
}
resource "gitlab_project" "secondrong" {
    name = "secondrong"
    namespace_id = "${gitlab_group.secondrong.id}"
}
resource "gitlab_project" "thirdrong" {
    name = "thirdrong"
    namespace_id = "${gitlab_group.thirdrong.id}"
}
- gitlab group层级查询(主要是判断使用子group 的情况)
这是一个简单四级的处理,实际情况在处理下 
select a.name as parent,b.name,b.path,b.description,c.name as thirdname,c.path as thirdpath ,c.description as thirddescription, d.name as fouthname, d.path as fouthpaht from namespaces a join namespaces b on a.id=b.parent_id join namespaces c on b.id=c.parent_id join namespaces d on c.id=d.parent_id where b.parent_id is not null and c.parent_id is not null;rest api 生成方式
上边有一个简单的rest 内容格式,设计的生成我们可以直接使用sqler(简单方便,写几个简单的sql 就可以搞定了)
- sqler docker 运行配置
version: "3"
services:
  sqler:
    image: dalongrong/sqler:2.0
    volumes:
    - "./config/config-example.hcl:/app/config.example.hcl"
    environment:
    - "DSN=postgresql://username:password@server:port/dbname"
    ports:
    - "3678:3678"
    - "8025:8025"- 配置文件(参考,很简单,写了几个,按照实际补充下,这个可能实际运行有问题)
group {
    exec = <<SQL
    SELECT disinct(name) from projects where namespace_id !=nil
    SQL
}
group_project {
    exec = <<SQL
    SELECT disinct(name) from projects where namespace_id !=nil
    SQL
}
gitlab_project {
    aggregate = ["group", "group_project"]
}说明
以上只是一个简单的说明,以及简单实践,实际迁移可能没有这么简单,或有各类的问题,还是需要部分人员的介入处理,因为毕竟每个 
团队对于git 的使用情况是不一样的,需要实际问题实际考虑,变通下,实际上对于git 的同步可以使用tf 操作,使用remote_exec 
provisioners
参考资料
https://www.terraform.io/docs/providers/gitlab/index.html
使用terraform 进行gitlab 代码仓库批量迁移的更多相关文章
- gitlab代码仓库迁移
		有的时候我们需要对gitlab上的代码进行迁移,希望在迁移后能保持原有的branch.tag.commit记录等.可以使用以下方式: 1.clone代码到本地. 2.修改remote仓库的地址,添加新 ... 
- openshift 平台上部署 gitlab代码仓库服务
		背景: 本文档将以在openshift 平台上部署 gitlab 服务来验证集群各个服务组件的可用性以及熟悉openshift的使用方法.服务部署方式可以多种多样,灵活部署.本篇以常见的镜像部署方式来 ... 
- Jekins持续集成,gitlab代码仓库
		http://blog.csdn.net/john_cdy/article/details/7738393 
- 镜像批量迁移利器:image-transfer
		概述 用户业务在上云或者云迁移过程中,需要对镜像进行批量迁移.基于此背景,腾讯云容器专家团队开发了镜像批量迁移工具:image-transfer.该工具支持多种云厂商镜像仓库之间的批量迁移,同时支持腾 ... 
- go get获取gitlab私有仓库的代码
		目录 目录 1.Gitlab的搭建 2.如何通过go get,获取Gitlab的代码 目录 1.Gitlab的搭建 在上一篇文章中,已经介绍了如何搭建Gitlab Https服务<Nginx ... 
- Git 安装及用法  github 代码发布  gitlab私有仓库的搭建
		版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 这个版本控制软件,有 svn还有git,是一个工具. git是由linux的作者开发的 git是一个分布式版本控制系统 ... 
- 部署GitLab代码托管仓库
		GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,GitLab是使用Ryby开发的一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私 ... 
- (超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库
		(超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库 本地创建了一个 xcode 工程项目,现通过 命令行 将该项目上传到 github 或者 gitlab 远程仓库,具体 ... 
- IDEA新项目代码上传到gitlab远程仓库
		IDEA新项目代码上传到gitlab远程仓库 具体步骤 创建本地仓库 IDEA:VCS-->Import into Version Control-->Create Git Reposit ... 
随机推荐
- Oracle Round 函式 (四捨五入)
			Oracle Round 函式 (四捨五入)描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果.SELECT ROUND( number, [ decimal_places ] ... 
- 「UER#2」信息的交换
			「UER#2」信息的交换 吉利题.. 不难发现,置换中的每一个循环是独立的,每一个循环分别对应一个独立的联通块. 根据题目的性质,每一个联通块做的事情等价于其按照编号从小到大遍历的的dfs生成树做的事 ... 
- Chrome 谷歌开发者工具使用窍门
			我们这里介绍主要的几块:Console.Source.Network Console 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的, ... 
- DotNet Core 2.2 MVC Razor 页面编译为 View.dll 文件的解决方法
			使用文本文件编辑器打开项目文件,找到: <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramewo ... 
- Go内存分配器可视化指南【译】【精】
			当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ... 
- hibernate左连接查询时在easyUI的dataGrid中有些行取值为空的解决办法
			1 当使用left join左连连接,sql语句为 select t from SecondPage t left join t.rightNavbar n where 1=1 页面中出现了部分空行的 ... 
- SpringBoot之多Profile配置
			近来在利用闲暇时间巩固下SpringBoot的基本知识,然后自己也做一些笔记,整理下当时所学知识,后面就干脆写到这里来了. 多Profile配置文件 在SpringBoot主配置文件编写的时候,文件名 ... 
- JavaScript之控制标签css
			控制标签css标签.style.样式='样式具体的值'如果样式出现中横线,如border-radius,将中横线去掉,中横线后面的单词首字母大写,写成borderRadius如果原来就要该样式,表示修 ... 
- CSS-锚点笔记
			注意点: position属性 定义建议元素布局所用的定位机制 {position:static/absolute/relative/fixed;} static:默认值,没有定位 absolute: ... 
- 使用ABAP操作Excel的几种方法
			这篇文章本来不在我计划之内,因为最近一个朋友微信上问到我这个问题,但我平时在SAP研究院工作中从没遇到过需要用ABAP操作Excel的需求,因此也没有太多技术实现细节可以分享给大家,只能泛泛写一些. ... 
