草庐IT

搭建本地GitLab仓库排坑指南

__LeoZhang 2024-02-27 原文

关于GitLab

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

2022年2月消息,极狐(GitLab)正式宣布推出极狐GitLab SaaS (JihuLab.com),为中国用户提供从源代码托管到开发运维的全栈式一体化DevOps SaaS平台与企业级专家咨询服务。

GitLab除作为代码仓库外,还可以集成CI/CD工作流程,天然的DevOps体系似的项目开发在持续集成和持续交付方面可以完全摆脱其他工具。

搭建GitLab本地服务

GitLab官方版有很多种,其中主流的就是国际版和国产的极狐GitLab,国产版本的极狐免费版限制较多,所以更推荐直接使用官方版的GitLab。

本文以容器化部署为核心,着重介绍Docker搭建GitLab的详细步骤,国产版本的本地搭建暂时没有遇到比较棘手的问题,但作者搭建官方版的Docker镜像时发现可能会在搭建过程中遭遇仓库无法正常使用的情况。

1.搭建准备

搭建本地GitLab前首先要确保电脑或服务器主机上已经安装docker工具,并启动docker服务。除docker工具外,还需要安装docker compose管理工具,更加方便的管理镜像和容器。

2.docker-compose.yml编写

在开发工具或文件系统中准备gitlab管理目录,如图所示。

在gitlab目录中创建docker-compose.yml文件,代码如下(先使用官方的配置):

version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.example.com'
    container_name: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224 
    ports:
      - '8888:80'
      - '2224:22'
    volumes:
      #映射配置目录
      - './config:/etc/gitlab'
      #映射日志目录
      - './logs:/var/log/gitlab'
      #映射数据目录
      - './data:/var/opt/gitlab'
    shm_size: '256m'

配置后在gitlab中创建data、config、logs三个目录如图所示。

4. 下载镜像启动容器

由于docker compose可以自动寻找镜像安装并启动容器,所以下一步可以直接通过命令行处理,使用命令行工具打开gitlab目录并输入运行容器的指令:

docker compose up -d

执行后控制台会输出如下内容(下载镜像部分已省略):

zhangyunpeng@zhangyunpengdeMacBook-Pro gitlab % docker compose up -d
[+] Running 1/1
 ⠿ Container gitlab  Started         

启动后可以通过docker指令查看容器运行状态

docker ps #docker查看容器运行数据

docker compose ps #docker compose查看容器运行数据

5.启动的注意事项

gitlab体系庞大,所以启动时间较长并大量占用内存,所以执行启动命令后若访问http://localhost:8888可能优先出现无法访问界面。

在程序内存占用超过1G时可能会提示502错误,如图所示。

启动的过程中,三个映射文件夹内部会陆续出现相应的配置文件和日志,如图所示。

要等待内存占用超过2G左右时才可以正常访问首页,内存占用数据可以使用图形化的docker工具查看,如图所示。

注意:这里的yml文件夹路径中不可以包含中文,否则会导致项目无法成功启动

首页的效果图为

6.默认账号密码

gitlab的默认账号为:root。默认密码保存在config目录中的initial_root_password文件中,如下:

# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.

Password: JwZiv7gqL9zhtKXyw37jxwO0EHjb8JWII240Of1YrN0=

# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.

该密码只能在24小时内有效,使用后请重新修改密码。登录后会在首页发现存在默认仓库,如图第二个仓库,按照官方标配默认启动无问题。

一旦打开或创建新仓库时会出现500异常如图所示。

7.解决异常问题

作者遇到该问题后,查阅了gitlab的运行日志发现如下错误信息:

{"level":"info","msg":"finding gitaly","pid":305,"pid_file":"/var/opt/gitlab/gitaly/gitaly.pid","time":"2022-06-01T07:05:09.852Z","wrapper":305}
{"level":"info","msg":"spawning a process","pid":305,"time":"2022-06-01T07:05:09.855Z","wrapper":305}
{"gitaly":311,"level":"info","msg":"monitoring gitaly","pid":305,"time":"2022-06-01T07:05:09.856Z","wrapper":305}
time="2022-06-01T07:05:10Z" level=info msg="Starting GitalyversionGitaly, version 14.6.1"
time="2022-06-01T07:05:10Z" level=warning msg="git path not configured. Using default path resolution" resolvedPath=/opt/gitlab/embedded/bin/git
time="2022-06-01T07:05:10Z" level=fatal msg="load config: config_path \"/var/opt/gitlab/gitaly/config.toml\": invalid config: internal_socket_dir: try create socket: socket could not be created in /var/opt/gitlab/gitaly/internal_sockets: listen unix /var/opt/gitlab/gitaly/internal_sockets/test-9f073a3e.sock: bind: invalid argument"
{"gitaly":311,"level":"warning","msg":"forwarding signal","pid":305,"signal":17,"time":"2022-06-01T07:05:10.178Z","wrapper":305}
{"error":"os: process already finished","gitaly":311,"level":"error","msg":"can't forward the signal","pid":305,"signal":17,"time":"2022-06-01T07:05:10.178Z","wrapper":305}
{"gitaly":311,"level":"error","msg":"wrapper for gitaly shutting down","pid":305,"time":"2022-06-01T07:05:10.868Z","wrapper":305}

该异常信息代表gitaly服务下由于一些原因找不到/var/opt/gitlab/gitaly/gitaly.pid文件,可以通过

docker exec -it ...

进入镜像内部查看,不过由于/var/opt文件夹已经被映射到外部,所以可以直接在data文件夹中刚找到gitaly文件夹会发现下面的确不存在该pid文件,如图所示。

这就是官方gitlab镜像可能会出现的问题,目前作者使用的是MacOS系统下的docker镜像,并没有去其他平台测试,所以不能保证该问题是普遍问题。

查看gitlab管理界面也可以从http://localhost:8888/admin/gitaly_servers路径下发现gitaly服务确实宕机了,如图所示。

根据该错误信息,作者安装了极狐gitlab最新个人版本地镜像,发现该镜像进入代码仓库完全没有问题,于是作者对比了gitaly文件夹发现,目录下存在pid文件并且生成的文件夹名称叫做run,如图所示。

根据该文件作者对比了两个镜像gitaly文件夹下的配置文件发现不同之处,如下:

# Gitaly configuration file
# This file is managed by gitlab-ctl. Manual changes will be
# erased! To change the contents below, edit /etc/gitlab/gitlab.rb
# and run:
# sudo gitlab-ctl reconfigure

socket_path = '/var/opt/gitlab/gitaly/gitaly.socket'
#极狐镜像下的配置文件是runtime_dir属性
runtime_dir = '/var/opt/gitlab/gitaly/run'
#官方镜像下的配置文件是internal_socket_dir属性
internal_socket_dir = '/var/opt/gitlab/gitaly/internal_sockets'

bin_dir = '/opt/gitlab/embedded/bin'

# Optional: export metrics via Prometheus
prometheus_listen_addr = 'localhost:9236'


[[storage]]
name = 'default'
path = '/var/opt/gitlab/git-data/repositories'

[logging]
format = 'json'
dir = '/var/log/gitlab/gitaly'


[auth]

[git]
bin_path = '/opt/gitlab/embedded/bin/git'
use_bundled_binaries = true

[gitaly-ruby]
dir = "/opt/gitlab/embedded/service/gitaly-ruby"
rugged_git_config_search_path = "/opt/gitlab/embedded/etc"

[gitlab-shell]
dir = "/opt/gitlab/embedded/service/gitlab-shell"

[gitlab]
url = 'http+unix://%2Fvar%2Fopt%2Fgitlab%2Fgitlab-workhorse%2Fsockets%2Fsocket'
relative_url_root = ''

[hooks]
[daily_maintenance]

对比两个文件后发现存在属性差异,顺着该配置文件的指引,找到/confit/gitlab.rb文件,并找到gitaly部分的配置信息发现确实不同,如下

#官方下的配置
# gitaly['internal_socket_dir'] = "/var/opt/gitlab/gitaly"
#极狐下的配置
# gitaly['runtime_dir'] = "/var/opt/gitlab/gitaly/run"

由此作者便产生了灵感,可以在docker-compose.yml文件夹下提前对官方镜像注入极狐的配置信息,不过这里值得注意的是官方版配置必须使用internal_socket_dir属性,而不是runtime_dir属性,最终实验结果是在官方的配置文件下加入如下信息。

version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.example.com'
    container_name: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
        //若存在runtime_dir则使用它的配置
        gitaly['runtime_dir'] = "/var/opt/gitlab/gitaly/run"
        //若需要使用internal_socket_dir属性则使用下列配置
        gitaly['internal_socket_dir'] = "/var/opt/gitlab/gitaly/run"
    ports:
      - '8888:80'
      - '2224:22'
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'
    shm_size: '256m'

只需要在容器启动时将官方的internal_socket_dir属性路径指向run文件夹即可解决该问题。

接下来的操作便是删除停止并删除原容器:

docker stop gitlab
docker rm gitlab

最后重新加载docker-compose.yml启动容器

docker compose up -d

启动过程中可以观察gitaly文件夹,会发现run文件夹和pid文件出现了,如图所示。

接下来通过root账号登录后,会发现可以进入代码仓库并自己创建代码仓库,进入后的效果如图所示。

总结

到此为止,本地gitlab搭建部分已经完毕,作者还没有测试其他方面有没有问题,后续会抽时间上线基于GitLab的CI/CD处理教程,本次文章为记录一次百度搜索不到的bug和解决方案,若有读者遇到同样的问题可以按照文章的步骤解决,感谢观看,喜欢作者文章的同学可以点赞关注。

有关搭建本地GitLab仓库排坑指南的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  3. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

  4. ruby - 将 Gitlab 从 9.3.7 更新到 9.3.8 安装 re2 时出错 - 2

    我们在Ubuntu14.04和Gitlab9.3.7上运行,运行良好。我们正在尝试更新到Gitlabv9.3.8的最新安全补丁,但它给我们这个错误:Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension.currentdirectory:/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/re2-1.0.0/ext/re2/usr/local/bin/ruby-r./siteconf20170720-19622-15i0edf.rbextconf.rbcheckingformain(

  5. ruby - 如何捕获所有 HTTP 流量(本地代理) - 2

    我希望访问我机器上的所有HTTP流量(我的Windows机器-不是服务器)。据我了解,拥有一个本地代理是所有流量路线的必经之路。我一直在谷歌搜索但未能找到任何资源(关于Ruby)来帮助我。非常感谢任何提示或链接。 最佳答案 WEBrick中有一个HTTP代理(Rubystdlib的一部分)和here's一个实现示例。如果你喜欢生活在边缘,还有em-proxy伊利亚·格里戈里克。这postIlya暗示它似乎确实需要一些调整来解决您的问题。 关于ruby-如何捕获所有HTTP流量(本地代理)

  6. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  7. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  8. ruby-on-rails - 清除 GitLab 中的所有 Assets - 2

    我想在我公司安装的GitLab中使用自定义Logo-白色、Logo-黑色和网站图标。我用谷歌搜索了我的屁股并尝试了所有我能找到的方法来清除这些该死的图像,但似乎没有任何效果。这是唯一似乎成功运行但未删除图像的进程:bundleexecrakecache:clearRAILS_ENV=productionservicegitlabstopredis-cliFLUSHALLbundleexecrakeassets:precompileRAILS_ENV=productionservicegitlabstart然后我清除我的浏览器缓存并转到该域,再次出现相同的该死的图像!我什至删除了我能从应

  9. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  10. ruby - 如何停止 jekyll 本地服务器 - 2

    我刚刚在本地设置了我的第一个Jekyll项目。我已经让服务器运行,但我忘了使用自动标志。所以现在我想停止服务器并使用标志重新启动。但是,在我启动服务器后的命令行中,我没有得到新的提示,所以我无法输入任何新命令。我不太习惯命令行,所以我真的很感激知道我应该做什么!我正在使用MacOSX和terminal.app,如果有区别的话! 最佳答案 psaux|grepjekyll|awk'{print$2}'|xargskill-9 关于ruby-如何停止jekyll本地服务器,我们在StackO

随机推荐