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 代码仓库批量迁移的更多相关文章

  1. gitlab代码仓库迁移

    有的时候我们需要对gitlab上的代码进行迁移,希望在迁移后能保持原有的branch.tag.commit记录等.可以使用以下方式: 1.clone代码到本地. 2.修改remote仓库的地址,添加新 ...

  2. openshift 平台上部署 gitlab代码仓库服务

    背景: 本文档将以在openshift 平台上部署 gitlab 服务来验证集群各个服务组件的可用性以及熟悉openshift的使用方法.服务部署方式可以多种多样,灵活部署.本篇以常见的镜像部署方式来 ...

  3. Jekins持续集成,gitlab代码仓库

    http://blog.csdn.net/john_cdy/article/details/7738393

  4. 镜像批量迁移利器:image-transfer

    概述 用户业务在上云或者云迁移过程中,需要对镜像进行批量迁移.基于此背景,腾讯云容器专家团队开发了镜像批量迁移工具:image-transfer.该工具支持多种云厂商镜像仓库之间的批量迁移,同时支持腾 ...

  5. go get获取gitlab私有仓库的代码

    目录 目录 1.Gitlab的搭建 2.如何通过go get,获取Gitlab的代码 目录 1.Gitlab的搭建   在上一篇文章中,已经介绍了如何搭建Gitlab Https服务<Nginx ...

  6. Git 安装及用法 github 代码发布 gitlab私有仓库的搭建

    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 这个版本控制软件,有 svn还有git,是一个工具. git是由linux的作者开发的 git是一个分布式版本控制系统 ...

  7. 部署GitLab代码托管仓库

    GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,GitLab是使用Ryby开发的一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私 ...

  8. (超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库

    (超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库 本地创建了一个 xcode 工程项目,现通过 命令行 将该项目上传到 github 或者 gitlab 远程仓库,具体 ...

  9. IDEA新项目代码上传到gitlab远程仓库

    IDEA新项目代码上传到gitlab远程仓库 具体步骤 创建本地仓库 IDEA:VCS-->Import into Version Control-->Create Git Reposit ...

随机推荐

  1. 工信部要求应用商店上新 App 检查 IPv6,这里有一份 IPv6 快速部署指南

    7 月 25 日,工业和信息化部信息通信发展司组织召开部署推进 IPv6 网络就绪专项行动电视电话会议.会议指出,加快推进 IPv6 规模部署,构建高速率.广普及.全覆盖.智能化的下一代互联网,是互联 ...

  2. RabbitMQ Policy的使用

    RabbitMQ作为最流行的MQ中间件之一,广泛使用在各类系统中,今天我们就来讨论一下如何通过Policies给RabbitMQ中已经创建的Queue添加属性和参数. Policise 的作用 通常来 ...

  3. Assignment 2: UDP Pinger[课后作业]

    Computer Networking : A Top-Down Approach 的课后作业. 要求: 基于UDP协议,实现一个Pinger工具. 服务端代码已经提供了,自己实现客户端的代码. 完整 ...

  4. JavaScript变量存储浅析(一)

    Hello! 上一篇关于JS中函数传参(http://www.cnblogs.com/souvenir/p/4969092.html)的介绍中提到了JS的另外一个基本概念:JS变量存储, 今天我们就用 ...

  5. weblogic unable to get file lock问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误: <2012-3- ...

  6. 《我是一只IT小小鸟》(续)读书笔记——第八周

    第三位作者强调了大学阶段规划的重要性,作者初入大学,一切都很新鲜想尝试,却缺乏对学习生活的规划.最终导致的是学习成绩的下降.其实编程也是一样,我们常常感到自己和那些大神的差距,感慨过后,往往也就罢了. ...

  7. python模块之json pickle

    1.json模块 功能:将其他形式的数据类型转化为json字符串类型,将json字符串转化为其他对应的数据类型 方法:json.dumps()  作用:将所有单引号变成双引号:将所有数据类型变成字符串 ...

  8. 利用yum下载rpm包并批量安装

    一.下载rpm包 方法一:downloadonly 1.yum自动下载RPM包及其所有依赖的包至/root/rpm目录: yum install yum-plugin-downloadonly yum ...

  9. python函数调用时参数传递方式

    python函数调用时参数传递方式 C/C++参数传递方式 对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数 ...

  10. Chrome浏览器内部协议Chrome://收集

    Chromium 采用 Chrome:// 协议开头的形式, 规定了一系列的内部协议, 有的用来显示数据, 有的用来实现一些功能, 但对普通用户进行了屏蔽.在Chrome浏览器地址栏直接访问就好了! ...