首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >丝滑的代码管理

丝滑的代码管理

作者头像
悟空聊架构
发布于 2023-09-01 03:14:46
发布于 2023-09-01 03:14:46
26700
代码可运行
举报
运行总次数:0
代码可运行

本文主要内容如下:

一、背景

最近需要修改一个很重要的项目源码,但是这个源码的代码仓库权限又不能给我们,只给了一份拷贝的版本,为了能够更好地对这份代码进行代码版本管理,我决定在本地搭建一个 Gitlab 仓库,来和其他同事进行协同开发。

二、环境依赖

1、本地部署一台 Ubuntu 虚拟机

2、Ubuntu Docker 环境

3、能否访问 docker hub 网络(如果不能访问,用离线方式安装 Gitlab 也可以)

三、部署 Gitlab

3.1 采用 docker compose 方式启动 Gitlab 容器

  • 拉取 Gitlab 镜像
  • 编写 docker-compose.yml 文件
  • 启动 Gitlab 容器

(如果你不喜欢用 docker compose 方式,也可以直接用 docker run 的方式启动 Gitlab 容器。)

3.1.1 拉取 Gitlab 镜像
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
docker pull gitlab/gitlab-ee:latest
3.1.2 编写 docker-compose.yml 文件

创建一个 docker-compose.yml 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
vim docker-compose.yml

内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

yml
    version: '3.3'
    services:
      web:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'https://gitlab.example.com'
        ports:
          - '8000:80'
          - '8443:443'
          - '2222:22'
        volumes:
          - '/home/wukong/gitlab/config:/etc/gitlab'
          - '/home/wukong/gitlab/logs:/var/log/gitlab'
          - '/home/wukong/gitlab/data:/var/opt/gitlab'
        shm_size: '256m'

配置说明:

  • version: '3.3':指定了 Docker Compose 文件的版本。
  • services::指示接下来定义服务部分的开始。
  • web::这是服务的名称,可以自定义。在这个示例中,服务名为 "web"。
  • image: 'gitlab/gitlab-ee:latest':指定要使用的 Docker 镜像。在这里,使用了 gitlab/gitlab-ee 镜像的最新版本。
  • restart: always:指定容器的重新启动策略为始终重新启动。
  • hostname: 'gitlab.example.com':设置容器的主机名为 "gitlab.example.com"。
  • environment::定义容器内的环境变量。
  • GITLAB_OMNIBUS_CONFIG: |:这是一个环境变量的名称,其值是一个多行字符串,表示 GitLab 配置文件的内容。
  • external_url 'https://gitlab.example.com':在 GitLab 配置文件中设置 GitLab 的外部 URL 为 "https://gitlab.example.com"。
  • ports::定义容器与主机之间的端口映射关系。
  • '8000:80':将容器的 80 端口映射到主机的 8000 端口。
  • '8443:443':将容器的 443 端口映射到主机的 8443 端口。
  • '2222:22':将容器的 22 端口(SSH)映射到主机的 2222 端口。
  • volumes::定义容器内的数据卷挂载关系。
  • '/home/tss/gitlab/config:/etc/gitlab':将主机上的 /home/tss/gitlab/config 目录挂载到容器内的 /etc/gitlab 目录。
  • shm_size: '256m':设置容器的共享内存大小为 256MB。

还需要在 Ubuntu 上创建一些文件夹:

  • /home/wukong/gitlab/config
  • /home/wukong/gitlab/logs
  • /home/wukong/gitlab/data
3.1.3 启动容器

在文件 docker-compose.yml 的所在的目录下执行以下命令启动 Gitlab 容器并查看容器状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
docker-compose up -d
docker ps

等几分钟后,容器状态会从 starting 状态变为 healthy 状态。

更多配置和部署方式详见官网文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


https://docs.gitlab.com/ee/install/docker.html

3.2 访问 Gitlab

可以通过 Ubuntu 虚拟机的 IP 的方式来访问 Gitlab 网站,也可以通过域名的方式来访问Gitlab 网站。

用浏览器打开 Gitlab 网站打开后如下所示:

3.2.1 通过 IP 访问

浏览器直接打开如下地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
https://<虚拟机 IP 地址>:8443/
3.2.2 通过域名访问

host 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
<虚拟机 IP 地址> gitlab.example.com

浏览器打开如下地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
https://gitlab.example.com:8443/

3.3 修改 root 密码

打开 Gitlab 网站后,就会让你登录,即使你选择注册,也需要等管理员审批通过才能登录。所以我们首先得用管理员账号登录,但是我们是不知道账号密码的,所以需要先修改管理员的密码。

  • 1.查看运行的容器ID
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
sudo docker ps
  • 2.进入容器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
sudo docker exec -it <容器 ID>  /bin/bash
  • 3.进入 gitlab的 bin 目录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
cd /opt/gitlab/bin
  • 4.执行 gitlab-rails console
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
gitlab-rails console
  • 5.找到 root 的用户
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
u=User.where(id:1).first

因为 root 用户的 id 是默认用户,所以 id 为 1。

  • 6.修改 password
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
u.password='passjava'
  • 7.修改确认密码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
u.password\_confirmation='passjava'
  • 8.保存修改

输入u.save,然后回车,等到输出 true,这时,密码修改成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SH
u.save

密码修改成功后,退出容器,然后回到登录页面,输入用户名和密码即可登录管理员账号。用户名:root,密码:passjava。

四、测试 Gitlab 功能

4.1 注册用户

在注册页面填写用户信息,注册成功后需要等待管理员审批。

管理员审批界面

4.2 测试 创建 Group 和 Project

管理员创建 Group
管理员创建的 Project

添加用户到这个仓库里面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
https://gitlab.example.com:8443/test-group/passjava/-/project_members

4.3 添加 SSH Key

用户登录成功后,可以看到自己的 passjava 项目,不过还需要添加 SSH Key 才能 push 或 pull 项目。

如果本地没有 SSH key,则可以参考下面这个链接生成 SSH Key。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


https://gitlab.example.com:8443/help/ssh/index#generate-an-ssh-key-pair

4.4 用户 clone 项目

clone 仓库到本地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
git clone https://gitlab.example.com:8443/test-group/passjava.git
或
git clone https://192.168.56.12:8443/test-group/passjava.git

提示输入密码,输入用户名和密码:

4.4 提交代码到 Gitlab 仓库

附录:离线安装 Gitlab

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
docker pull gitlab/gitlab-ee:latest

打包测试环境的 gitlab镜像,这个命令会将服务器上 gitlab 镜像打包成 tar 包,这样我们就方便拷贝到其他服务器上了。执行打包镜像命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


sudo docker save -o gitlab-ee.tar gitlab/gitlab-ee:latest

因为保存的 tar 包权限不够,所以设置下权限为 777。执行修改权限的的命:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
    sudo chmod 777 gitlab-ee.tar

将这个 tar 包拷贝新环境的三台服务器上。执行导入镜像的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

sh
sudo docker load -i gitlab-ee.tar

然后按照第三章的 3.1.2 和 3.1.3 内容启动容器。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 悟空聊架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
看他怎么"折腾" (四)
at同样也是一个模版函数,但与ptr不同的是,at返回的是一个“引用”,即一个别名,而且一般来讲不占用内存空间(具体与编译器先关)。同样呢,当发生错误时,at也可以抛出异常,可以try {} catch {}将其抓获。
视界音你而不同
2020/04/10
3040
C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev
迭代器是C++泛型编程的基石,它扮演着"容器与算法之间桥梁"的角色——算法通过迭代器访问容器元素,而无需关心容器的具体实现。在C++11之前,迭代器的使用存在诸多不便:容器迭代器获取方式不统一(如std::vector需调用begin()成员函数,而原生数组需手动计算&arr[0]和&arr[size])、迭代器移动操作繁琐(如获取"当前迭代器后第n个位置"需手动循环n次++it)、泛型代码兼容性差(无法同时支持容器和原生数组)。
码事漫谈
2025/07/16
1470
C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev
看他怎么“折腾”(三)
这段代码不用太多解释了,只说一下Vec3b,这是OpenCV自定义的一个数据结构,内部有3个uchar的成员,分别来表示B, , R的值。
视界音你而不同
2020/04/10
2770
看他怎么“折腾”(三)
你的代码可能在偷偷崩溃!
在 C++ 中,迭代器(Iterator)是我们遍历容器(如 vector、list、map 等)的得力助手。然而,迭代器并非永远可靠——某些操作会导致它失效,继续使用失效的迭代器可能导致未定义行为(UB),轻则程序崩溃,重则数据错乱,甚至引发安全漏洞!
码事漫谈
2025/08/06
1000
你的代码可能在偷偷崩溃!
C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中。range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作。
恋喵大鲤鱼
2018/08/03
1.5K0
C++学习笔记——大杂烩
                                                        by方阳
努力努力再努力F
2018/09/11
5380
机器视觉算法(第9期)----OpenCV中最最最重要的类型
今天我们主要学习一下OpenCV中最重要的数据类型--数组Mat,这个结构可以视为是OpenCV所有C++实现的核心,OpenCV中所有主要函数都或是Mat类的成员,或是将Mat类作为参数,或是返回一个Mat类型。很少有函数和这三者都没有关系的。
智能算法
2019/05/17
1.3K0
机器视觉算法(第9期)----OpenCV中最最最重要的类型
【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。
倔强的石头_
2025/05/31
1250
【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
OpenCV使用迭代器扫描图像
在面向对象的编程中,循环数据集合通常是使用迭代器完成的。迭代器是专门为遍历集合的每个元素而构建的类,隐藏了如何迭代给定集合中每个元素的具体操作。信息隐藏原理的应用使扫描集合更容易、更安全;同时,无论使用什么类型的集合,迭代的形式都是相似的。标准模板库 (Standard Template Library, STL) 具有与其每个集合类相关联的迭代器类。而 OpenCV 同样提供了一个 cv::Mat 迭代器类,该类与 C++ STL 中的标准迭代器兼容。在本节中,我们使用继续减色任务讲解如何使用迭代器扫描图像。
每周聚焦
2022/10/25
5840
【C++】继续学习 string类 吧
上一篇文章,我们看到了string的容量是比较模糊的,为什么是15???,它的扩容规则是什么??? 接下来我们来探索一下string的扩容机制: 首先我们来写一个简单的测试程序:
叫我龙翔
2024/03/08
1430
【C++】继续学习 string类 吧
【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?
对于Mat类矩阵的读取与更改,我们已经在矩阵的循环赋值中见过如何用at方法对矩阵的每一位进行赋值,这只是OpenCV提供的多种读取矩阵元素方式中的一种,本小节将详细介绍如何读取Mat类矩阵中的元素,并对其数值进行修改。在学习如何读取Mat类矩阵元素之前,首先需要知道Mat类变量在计算机中是如何存储的。多通道的Mat类矩阵是一个类似于三维的数据,而计算机的存储空间是一个二维空间,因此Mat类矩阵在计算机存储时是将三维数据变成二维数据,先存储第一个元素每个通道的数据,之后再存储第二个元素每个通道的数据。每一行的元素都按照这种方式进行存储,因此如果我们找到了每个元素的起始位置,便可以找到这个元素中每个通道的数据。图2-5展示了一个三通道的矩阵的存储方式,其中连续的蓝色、绿色和红色的方块分别代表每个元素的三个通道。
小白学视觉
2019/11/07
3.8K0
【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?
【OpenCV教程】core模块 - 扫描图像、利用查找表和计时
大家好,今天小白将为大家介绍如何在OpenCV中进行扫描图像、利用查找表和计时。
小白学视觉
2019/08/06
1.5K0
【OpenCV教程】core模块 - 扫描图像、利用查找表和计时
Mat基本元素的表达与读写
早期的OpenCV使用IplImage和CvMat数据结构来表示图像。OpenCV 2.0引入了C++类Mat来管理图像数据(矩阵)。
OpenCV学堂
2019/11/13
8640
极简教程 | OpenCV4 C++学习 必备基础语法知识
大家好,之前我在B站发布了OpenCV C++快速入门30讲的视频合集,得到很多人回复跟反馈,很多人问我是不是学习C++版本的OpenCV会很难,是否需要基础知识。其实这里大家有个很深的误解,OpenCV早期的语法都是基于C++98,这个语法比较坑,让大家学习起来感觉很难。但是后来OpenCV3之后,特别是OpenCV4以来早就支持标准的C++11语法了,很多接口跟函数都特别容易理解,C++11可以说应用最广泛的C++标准之一了,语法通俗易懂,大量智能指针加持,支持各种标准容器操作,可以说跟C#与Java这样的面向对象语言的语法基本完全类似,可以让你轻松驾驭,只要你接触过面向对象的编程语言,可以说零基础学习OpenCV C++完全不是问题,当然有几个最常用的语法跟容器可能需要提前铺垫一下,我这里也从实际项目跟代码实践总结出下面C++基础知识点,帮助大家在学习OpenCV C++的时候可以更快,更好的入门。
OpenCV学堂
2021/04/21
2.2K0
极简教程 | OpenCV4 C++学习 必备基础语法知识
C++11(14) 简易推荐小记~
  容器内元素操作是个很普通的需求,工作中应是屡见不鲜,这里假设有个list容器,存储的是一系列int,表达的意思就算作是年龄吧,新年将近,大家的年龄也都会不情愿的涨上一岁,简单用C++表达一下,大概是这个样子:
用户2615200
2018/08/02
4430
C++11学习笔记1
很久以前就知道C++11对我们课上讲的C++有很多改进的地方,当时也没有细学,最近一个偶然的机会陡然发现原来身边的同学好多都对C++11都颇有心得,推崇备至,回头想想在C++14,甚至C++17都不新鲜的现在,连C++11都不会的话显然有点说不过去了。。。于是呢我就打算利用最近闲着的时间,在补《人民的名义》的间隙顺便学学C++11应该也是极好的。
mythsman
2022/11/14
3780
OpenCV对图像遍历的高效方法
首先介绍几个Mat类型的属性,rows是Mat类型的行数,cols是列数,channels()是通道数,那么对于图像的每一行,都有cols*channels()个像素点,所以我们可以对所有行进行遍历,然后对于特定一行,遍历所有像素点,代码如下:
全栈程序员站长
2022/09/02
6380
C++认识容器的迭代器
假设有个map容器,用于存储大学班级中各个家乡省份对应的学生数,key为省份中文全拼,value为学生数。现需要删除人数为0的记录,删除代码如下:
恋喵大鲤鱼
2018/08/03
1.4K0
openCV._imread opencv
近日,开始学习图像处理,思前想后决定以opencv作为实验基础。遂完成图片读取和显示功能。Imread作为常用的图像读取函数,虽然简单,但是参数的选择非常重要,直接影响到后期处理。同时在调试学习过程中也可以学习到图像处理的知识。 1. 函数原型
全栈程序员站长
2022/11/07
7060
每个C++开发者都应该学习和使用的C++11特性
Hi,大家好!本文讨论了所有开发人员都应该学习和使用的一系列 C++11特性。该语言和标准库中有很多新增功能,本文只是触及了皮毛。但是,我相信其中一些新功能应该成为所有C++开发人员的日常工作。
Linux兵工厂
2024/03/21
3220
每个C++开发者都应该学习和使用的C++11特性
相关推荐
看他怎么"折腾" (四)
更多 >
LV.1
香农信息技术研究院
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验