前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搭建和部署GitLab代码托管平台,自己的CI/CD堡垒

搭建和部署GitLab代码托管平台,自己的CI/CD堡垒

原创
作者头像
Mintimate
发布2023-09-21 23:01:51
发布2023-09-21 23:01:51
4.6K2
举报
文章被收录于专栏:Mintimate's Blog
头图不能少!
头图不能少!

博客:https://www.mintimate.cn Mintimate’s Blog,只为与你分享

为什么要考虑自己搭建和部署代码托管平台呢?一方面,自托管的代码托管平台可以给团队提供更高的灵活性和定制化能力。你可以根据团队的需求和安全要求进行自定义配置,而不受公共托管平台的限制。另一方面,自己搭建代码托管平台还可以加强数据的安全性和隐私保护。你完全掌握数据的存储和访问权限,减少了数据泄露和安全漏洞的风险。

本文就教大家使用Docker部署GitLab,打造全能的私有化代码托管平台。

GitLab

本次教程,介绍使用Docker版本的GitLab

GitLab主要的特点:

  • 完整的代码托管功能: GitLab提供了强大的代码仓库管理功能,支持Git版本控制系统。
  • 集成的CI/CD: GitLab内置了强大的持续集成和持续交付(CI/CD)功能。
  • 问题跟踪和协作: 团队成员可以报告问题issue、讨论和分配任务。创建问题、添加注释、设置优先级和指派责任人等等都可以。
  • 代码审查:支持代码审查功能,帮助团队进行代码质量控制和知识共享、模块讨论等。
  • 安全性和漏洞扫描: 提供了代码静态分析、漏洞扫描和容器扫描等功能。
  • 集成和插件支持: 支持与其他工具和服务的集成,例如Jira、Slack、Kubernetes等。
Gitea
Gitea

尤其是这个CI/CD交付功能,其他的自建托管平台,比如:Gitea,基本上也有问题追踪和多人协助功能,只是对比GitLab,大部分的功能像是Lite版本的;但是这个CI/CD交付功能,基本算是GitLab对比其他自建平台所特有的,不依赖于Jenkins等专业的CI/CD平台就提供了类似GitHub Action一样的强大CI/CD功能。

当然,GitLab所占用的资源是非常大的,与之相对的Gitea所占用的资源就很小;主要是GitLab需要Redis、Postgress数据库、Nginx等的支持。有机会也和大家“安利”一下Gitea。

为什么是GitLab

前文就已经说到了,使用GitLab,可以提供强大的CI/CD,甚至功能可以匹配Jenkins,后期的配置还可以联动K8S。

对于团队来说,项目需要集成部署和测试,以及多人协助讨论,GitLab会是很不错的选择,而且社区的支持度很高,不购买专业版授权,也足够中小型团队使用。

一些团队和公司,对代码有着严格的管理需求,并且不能使用GitHub和Gitee等现有的公共平台,那么自建代码托管平台,GitLab是一个不错的选择。

对于个人来说,使用GitLab更多的是为了省事,用GitLab可以镜像推送,同时把代码镜像到多个代码托管平台,嘿嘿,进一步分布式保证代码的安全和灾备;同时,用GitLab,没什么平台的束缚,你可以自由管理。

当然,也有很多其他的选择,有机会我们介绍其他的代码托管平台。

等你哦
等你哦

为什么选择Docker

为什么选择使用Docker部署呢? 其实我是很想使用软件包管理器(apt)部署的,并直接用自己的Nginx接管GitLab自带的Nginx。

但是,用软件包管理器安装GitLab的“坑”实在太多了,踩了三天,还没䐆完;想想到时候管理那么多配置文件也不方便,继而选择Docker。

举个例子,自己用软件包管理器安装了GitLab;因为我自己有编译安装Nginx,GitLab自带的Nginx和我自己的Nginx就冲突了。此时,我关闭了GitLab的Nginx,使用自己的Nginx进行定向,发现:

  • Nginx需要支援Passenger
  • Passenger需要ruby3的支持,而腾讯云的lighthouse,Debian11镜像,软件包管理器是ruby2.7;需要编译ruby3;
  • Ruby需要使用bundle安装GitLab的相关依赖。

前两个相对都很好解决,但是最后的bundle安装GitLab相关依赖,检查Nginx日志,就是一直下载失败。我自己又不会ruby的语法,在尝试gem一个一个安装、root提权安装等方法都无济于事,所以选择了Docker部署。

Docker
Docker

回到正题,问什么选择Docker部署呢?

很简单: 部署简单、环境隔离、易于迁移。

准备工具

首先看看需要准备的工具,其实工具很简单:

  • 服务器: Linux服务器最好,个人推荐Debian系列的;2023年了,不再推荐使用CentOS;
  • Docker: 容器自然不必说。

服务器

服务器方面,上文已经说了类别,这里再来确定一下配置。GitLab推荐使用8G内存以上的配置;如果你的Linux配置没有达到这个配置,4G以上可以还可以冲一下,但是不能安装其他的容器或者应用了,并且开启ZRAM,避免内存溢出。

本次演示,使用腾讯云的4C 8G 10M豪华服务器:

本次使用的配置
本次使用的配置

并且价格一年也很划算,非常适合个人和中小团队使用;使用博客专属地址,可以享受专属的优惠:

购买旗舰服务器
购买旗舰服务器

ZRAM启动

Docker官方是不建议使用SWAP的,但是我不是很确实,是否也不推荐使用ZRAM。看着内存快满,总有写危机感。于是,我们在部署前,打开系统的ZRAM。

因为使用的腾讯云Lighthouse的Debian系统,所以直接使用apt软件包管理器:

代码语言:shell
复制
# 安装zram-tools直接对zram进行管理
sudo apt install zram-tools

zram-tools会自动配置一个由systemctl管理的zramswap.service服务,并读取/etc/default/zramswap配置文件。

编辑/etc/default/zramswap文件:

编辑zramswap配置
编辑zramswap配置
代码语言:text
复制
# 压缩算法选择
# 速度:lz4 > zstd > lzo
# 压缩率:zstd > lzo > lz4
ALGO=zstd

# 根据可用内存的百分比指定应使用的zram内存量,如果设置了PERCENT,则优先级高于下面的 SIZE
PERCENT=35

# 指定应用于 ZRAM 设备的静态内存量,单位为 MiB
# SIZE=1024

# 指定交换设备的优先级,较高的数字表示较高的优先级
PRIORITY=100

配置好文件后,重启zramswap.service服务

代码语言:shell
复制
sudo systemctl restart zramswap

到此,ZRAM就启动完成了。

如果你后期想查看ZRAM的使用,可以使用命令:

代码语言:shell
复制
# 显示当前系统上所有zram设备的详细信息,包括设备编号、压缩算法、设备大小、使用的内存等
sudo zramctl
查看zramswap状态
查看zramswap状态

Dcoker准备

Docker的部署,应该没什么好说的,你可以使用一键部署脚本,或者手动安装:

代码语言:shell
复制
# 安装基础依赖
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
# 添加阿里仓库访问密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 添加更新源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable"
# 更新
sudo apt update
# 安装Docker相关软件包
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
软件包管理器安装基础依赖
软件包管理器安装基础依赖
阿里仓库访问密钥
阿里仓库访问密钥
安装Docker服务
安装Docker服务

到此,输入docker -v就可以查看我们部署的docker版本了:

Docker版本
Docker版本

部署GitLab

接下来,我们部署GitLab,创建一个目录,用于存储GitLab Docker的文件:

代码语言:shell
复制
# 创建目录
sudo mkdir -p /dockerData/gitlab

之后,根据官方文档,我们拉取镜像:

代码语言:shell
复制
# 设置更目录(方便操作,你也可以放到环境变量里)
export GITLAB_HOME=/dockerData/gitlab
设置映射的根目录
设置映射的根目录
代码语言:txt
复制
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 8443:443 --publish 8880:80 --publish 8822:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest
使用Docker安装GitLab并映射
使用Docker安装GitLab并映射

其中:

  • 映射容器内443到宿主机的8443端口、80到8880端口、22到8822端口;
  • 设置别名为gitlab;
  • hostname为设置默认域名,你也可以在后期初始化时候进行更改。
拉取镜像
拉取镜像
拉去镜像完成
拉去镜像完成

之后,可以使用docker命令查看日志来观察GitLab容器初始化:

代码语言:shell
复制
sudo docker logs -f gitlab
查看GitLab容器日志
查看GitLab容器日志
停止查看GitLab容器日志
停止查看GitLab容器日志

最后,访问即可:

访问成功
访问成功

简单“装修”配置一下,就可以使用了;比如:为Push一个仓库上去的效果:

Push上的仓库
Push上的仓库

初始化GitLab

默认的GitLab配置文件地址:

  • /etc/gitlab/config/gitlab.rb

当然,你也可以使用Gitlab自带的gitlab-rails进行管理。

默认管理员密码

如何设置GitLab的密码呢?你可以使用自带的密码进行登录:

代码语言:shell
复制
# 获取默认的密码
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
获取默认密码
获取默认密码

默认的用户名是admin@example.com

这样,就可以登录成功了:

使用默认密码登录成功
使用默认密码登录成功

如果你过了24小时,那么上述的获取默认密码方式可能会失效,你可以进行更改:

代码语言:shell
复制
# 登录容器内
docker exec -it gitlab bash
# 启动gitlab-rails控制台(可能要好几分钟)
gitlab-rails console -e production
# 搜索用户(admin用户固定为1)
user = User.where(id:1).first
# 修改密码
user.password ='HelloWorld'
user.password_confirmation ='HelloWorld'
# 提交
user.save

之后就可以进行登录了。记得使用默认的邮箱登录(admin@example.com)。

修改默认域名

修改默认配置文件:

代码语言:shell
复制
# 我们启动容器时候,已经把/etc/gitlab/config/gitlab.rb映射到/dockerData/gitlab/config/gitlab.rb
vim /dockerData/gitlab/config/gitlab.rb

修改或添加:

代码语言:shell
复制
# 默认的域名
external_url 'https://gitlab.mintimate.cc'
nginx['listen_port'] = 80
# 不开启SSL(使用外置Nginx进行实现)
nginx['listen_https'] = false

之后,我们重载Docker配置:

代码语言:shell
复制
# 重载配置
sudo docker exec gitlab gitlab-ctl reconfigure

到此,默认的域名就配置完成了。

More

当然,更多的配置你也可以在配置文件内实现,比如我们使用8822映射了容器内22的SSH端口。

这样前台使用SSH模板克隆有点不方便,如何让它显示8822呢?

在配置文件内追加:

代码语言:shell
复制
gitlab_rails['gitlab_shell_ssh_port'] = 8822

之后重新配置即可。

如果你希望GitLab占用资源少一点,你可以现在线程:

代码语言:shell
复制
# 现在puma的线程数
puma['worker_processes'] = 2
puma['min_threads'] = 2
puma['max_threads'] = 2
减少最大线程数
减少最大线程数

同时,最后不要忘记重载配置。

Nginx反代

Nginx配置就很简单了,外置Nginx的conf片段参考:

代码语言:text
复制
server
{
    listen 80;
    listen 443 ssl http2;
    server_name gitlab.example.com;
    client_max_body_size   30M;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/webRoot/gitlab.example.com;

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/webSSL/gitlab.example.com/gitlab.example.com.pem;
    ssl_certificate_key    /www/webSSL/gitlab.example.com/gitlab.example.com.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;

    #SSL-END

  # 关键配置
  location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass    http://127.0.0.1:8880; # 反向代理Docker的端口
  }


    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
    return 404;
    }

}
使用Nginx进行反向代理GitLab
使用Nginx进行反向代理GitLab

这样就可以直接使用用域名进行负载了。

常见问题

在这里,我们来看看一些常见的问题。

访问GitLab 502

访问GitLab产生502
访问GitLab产生502

如果你访问GitLab的网站发现502了,可以从一下方面进行Debug:

  • 检测服务器资源是否爆满,4G内存的服务器,可能会因为内存溢出,导致服务器卡死;
  • 检查GitLab是否初始化完成,Docker启动GitLab后,因为内部需要启动多个服务,启动过程很忙,期间会显示502;
  • 检查GitLab的配置是否正确,核心配置错误,也会导致502。

如何迁移服务器

迁移服务器,最简单的方法,就是拷贝完整的/dockerData目录;在新的服务器上,重新部署和映射。

END

好啦,本次的Docker部署GitLab就到这里。有机会给大家带来GitLab的CI/CD等进一步的使用教程。

有任何问题,欢迎评论区留言哦。说不定到时候还做一起视频教程,进一步教大家如何搭建、使用。

不愧是顶尖开发
不愧是顶尖开发

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GitLab
    • 为什么是GitLab
      • 为什么选择Docker
      • 准备工具
        • 服务器
        • ZRAM启动
        • Dcoker准备
        • 部署GitLab
        • 初始化GitLab
          • 默认管理员密码
            • 修改默认域名
              • More
              • Nginx反代
              • 常见问题
                • 访问GitLab 502
                  • 如何迁移服务器
                  • END
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档