从零部署GitLab社区版:私有化DevOps平台搭建与核心功能实战
1. 项目概述:为什么我们需要自己的GitLab?
如果你是一名开发者、运维工程师或者团队的技术负责人,那么“代码仓库”这个词对你来说一定不陌生。从早期的SVN到如今遍地开花的Git,版本控制早已是软件开发的基石。而GitLab,正是这个领域里一个集大成的选手。它远不止是一个存放代码的“网盘”,而是一个覆盖了从代码托管、CI/CD流水线、代码审查、安全扫描到项目管理、知识库的完整DevOps平台。
为什么越来越多的团队,尤其是中小企业和创业公司,会选择自建GitLab,而不是直接使用GitHub或Gitee这样的SaaS服务?原因其实很实在:控制权、安全性和成本。SaaS服务固然方便,但你的核心资产——代码、流水线配置、用户数据——都存放在第三方。对于有严格合规要求、数据敏感或希望深度定制工作流的团队来说,这无疑是一个潜在风险。自建GitLab,意味着你可以将这套强大的工具完全部署在自己的服务器上,无论是物理机、虚拟机还是私有云,数据完全自主可控。同时,GitLab社区版(CE)提供了绝大部分核心功能,对于大多数团队来说完全免费,一次部署,长期受益。
我经历过从使用公共仓库到自建GitLab的完整过程,也踩过不少配置和运维的坑。今天,我就结合这些实战经验,带你从零开始,完成一套稳定、可用的GitLab社区版部署,并深入剖析其Web界面的核心功能,让你和你的团队能立刻上手,真正发挥出这个“瑞士军刀”的威力。
2. 部署方案选型与前期准备
在真正动手敲命令之前,花点时间规划部署方案是绝对值得的。不同的方案在复杂度、资源消耗和后期维护上差异巨大。盲目选择最容易的,可能会给未来埋下隐患。
2.1 主流部署方式深度对比
目前,主流的GitLab部署方式主要有三种:Omnibus包安装、Docker容器化部署以及从源码编译安装。对于绝大多数生产环境,前两者是更实际的选择。
Omnibus包安装:这是GitLab官方最推荐的方式。它将GitLab所需的所有服务(Ruby on Rails应用、PostgreSQL数据库、Redis缓存、Nginx、Sidekiq任务队列等)打包成一个巨大的安装包。你只需要执行几条命令,就能得到一个“全家桶”式的完整环境。
- 优点:部署最简单,官方维护,升级方便(一条命令即可),集成度最高,所有组件版本经过严格测试,稳定性最好。
- 缺点:对系统“侵入性”强,会安装和配置大量系统服务;资源占用相对较高;组件版本被捆绑,自定义灵活性较低。
- 适用场景:追求稳定、省心,且服务器资源相对充足的生产环境。这也是我们本次部署将采用的主要方式。
Docker容器化部署:使用Docker Compose或Kubernetes来编排运行GitLab的各个组件。GitLab官方提供了完整的Docker镜像。
- 优点:环境隔离性好,不会污染宿主机;部署和迁移极其灵活;可以更精细地控制资源分配;非常适合云原生和微服务架构。
- 缺点:需要一定的Docker和容器编排知识;数据持久化、网络配置、备份恢复需要额外关注;性能可能有轻微损耗(在配置得当的情况下可忽略)。
- 适用场景:开发测试环境、已有成熟容器化基础设施的团队、或者希望快速进行多版本测试的场景。
源码编译安装:手动安装和配置每一个依赖项。这通常只适用于需要深度定制或研究GitLab内部机制的极客。
- 优点:完全掌控,灵活性最高。
- 缺点:过程极其繁琐,耗时极长,依赖冲突多,升级和维护是噩梦。
- 适用场景:不推荐用于任何生产或常规使用环境。
实操心得:对于初次部署且用于团队协作的生产环境,我强烈建议使用Omnibus包。它把最复杂的部分都帮你做好了,让你能快速得到一个“开箱即用”的稳定系统。等团队用起来,你对GitLab的架构更熟悉后,再考虑是否迁移到Docker以获得更大的弹性,是一个更稳妥的路径。
2.2 服务器资源规划与系统要求
GitLab是个“资源大户”,在预算允许的范围内,为它准备一台像样的服务器至关重要。资源不足是导致GitLab运行缓慢、甚至崩溃的最常见原因。
- CPU:至少4核。这是保证Web界面响应和后台任务(如CI/CD流水线)运行流畅的基础。如果团队规模较大(超过20人)或CI任务繁重,建议8核或以上。
- 内存:这是关键!绝对不要低于4GB。4GB是官方列出的最低要求,但在这个配置下,你基本只能体验基础功能,稍微开几个标签页都可能卡顿。对于小团队(10人以内)的日常使用,8GB是起步线。如果启用CI/CD Runner执行构建任务,或者项目较多,16GB或更多内存才能保证舒适体验。内存不足会直接导致Sidekiq任务积压、页面加载超时。
- 存储:需要规划两块存储。
- 系统盘:用于安装GitLab本体和操作系统,建议50GB以上。
- 数据盘:这是重中之重,用于存放仓库数据、CI/CD产物、备份等。必须单独挂载,并且容量要充足。一个活跃的中型项目,历史代码加上CI构建的缓存和产物,几年下来占用几十GB很常见。建议使用SSD以提升仓库克隆、读取速度。容量规划需考虑团队代码增长和备份策略,通常预留500GB到1TB是合理的。
- 操作系统:Ubuntu 20.04/22.04 LTS 或 CentOS/RHEL 7/8是官方支持最好的系统。选择LTS(长期支持)版本能获得更稳定的系统环境和安全更新。我个人更偏好Ubuntu,其软件源和社区支持对新手更友好。
注意事项:务必使用一个干净的、新安装的系统。避免在已有其他服务的服务器上混装GitLab,以免端口冲突(GitLab默认使用80, 443, 22, 8080等端口)或资源争抢。虚拟机和云服务器都是不错的选择,但请确保你拥有完整的root权限。
2.3 关键配置:域名、SSL与备份策略
在安装前,想好这三个问题,能避免部署后的手忙脚乱。
域名与访问方式:你打算通过IP直接访问,还是绑定一个域名(如
git.your-company.com)?强烈建议使用域名。这不仅是看起来专业,更重要的是为后续配置HTTPS(SSL)、邮件通知等功能铺平道路。你需要提前将域名解析指向你的服务器IP。SSL证书:如今,任何Web服务启用HTTPS都是基本要求。对于内部服务,你有几个选择:
- 公有证书:从Let‘s Encrypt等机构申请免费证书。Omnibus GitLab内置了自动续签Let’s Encrypt证书的功能,非常方便。
- 私有证书:使用内部CA签发的证书。这需要你在所有客户端机器上信任该CA,适合封闭的企业环境。
- 自签名证书:最不推荐,因为每个访问者都需要手动忽略浏览器安全警告,体验极差。
备份策略:在投入生产使用前,必须先确定备份方案!GitLab提供了强大的备份命令(
gitlab-backup create),它可以备份数据库、仓库、上传文件等几乎所有重要数据。你需要决定:- 备份频率:每天一次?每周一次?
- 备份存储位置:备份到另一台服务器、NAS还是云存储(如S3)?
- 备份保留策略:保留最近7天?还是30天? 把这些想清楚,并写成脚本加入cron定时任务,你晚上才能睡得着觉。
3. 基于Omnibus包的GitLab部署实战
理论准备就绪,现在我们进入实战环节。我将以一台全新的Ubuntu 22.04 LTS服务器为例,演示完整的安装和初始化配置过程。
3.1 系统初始化与依赖安装
首先,通过SSH登录你的服务器。第一步是进行系统更新并安装一些基础工具。
# 更新软件包列表并升级现有软件 sudo apt update && sudo apt upgrade -y # 安装一些常用的管理工具(可选,但推荐) sudo apt install -y curl wget vim htop # 设置主机名(可选,替换为你想要的名称) sudo hostnamectl set-hostname gitlab-server接下来,我们需要安装GitLab所依赖的openssh-server和postfix(用于发送邮件通知)。Postfix的配置稍显复杂,我们可以先按默认配置安装,后续在GitLab中再细调。
# 安装openssh-server和postfix sudo apt install -y openssh-server postfix在安装Postfix过程中,会弹出一个配置窗口。对于内部网络,选择“Internet Site”通常即可。系统会询问“System mail name”,这里可以填写你的域名(如your-company.com)或服务器主机名。如果安装时跳过了配置,之后也可以通过sudo dpkg-reconfigure postfix重新配置。
3.2 下载并安装GitLab Omnibus包
我们将使用官方脚本添加GitLab的APT仓库,这样便于未来的升级。
# 下载并执行GitLab仓库安装脚本 curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash这个脚本会自动检测你的系统版本,并将官方的软件源添加到/etc/apt/sources.list.d/目录下。
现在,安装GitLab社区版。在安装命令中,我们可以通过环境变量EXTERNAL_URL来预先指定GitLab的访问地址。这是最关键的一步!
# 将 EXTERNAL_URL 替换为你计划使用的实际地址,例如 http://git.your-company.com 或 http://your-server-ip sudo EXTERNAL_URL="http://your-server-ip-or-domain" apt install gitlab-ce执行这条命令后,APT会开始下载并安装GitLab及其所有依赖。这是一个较大的包(约1GB),下载和安装需要一些时间,请耐心等待。
安装完成后,Omnibus包会自动根据你提供的EXTERNAL_URL进行初始配置,并启动所有相关服务。
3.3 初始配置与管理员密码设置
安装完成后,GitLab服务已经运行。现在,我们需要通过Web界面完成最后的初始化。
首次访问:打开浏览器,输入你刚才设置的
EXTERNAL_URL(例如http://your-server-ip)。你会被重定向到一个设置管理员密码的页面。注意:如果你在服务器上配置了防火墙(如UFW),请确保放行了HTTP(80)和HTTPS(443)端口。
sudo ufw allow http sudo ufw allow https sudo ufw reload设置管理员密码:这个密码用于
root账户,这是GitLab的超级管理员。请务必设置一个强密码并妥善保管。登录:设置密码后,使用用户名
root和你刚设置的密码登录。
恭喜!至此,一个最基本的GitLab实例已经部署完成。你可以看到GitLab的仪表盘。但先别急着创建项目,我们还需要进行一些重要的安全性和可用性配置。
3.4 关键生产环境配置调优
默认安装的GitLab使用的是HTTP,并且邮件服务可能无法正常工作。我们需要通过修改GitLab的主配置文件/etc/gitlab/gitlab.rb来进行调整。
# 使用vim或你喜欢的编辑器打开配置文件 sudo vim /etc/gitlab/gitlab.rb这个文件内容很多,但大部分都被注释掉了。我们只需要找到并修改关键的几行。
配置1:绑定域名与HTTPS(使用Let‘s Encrypt)找到external_url这一行,将其修改为你的域名,并以https://开头。同时,开启Let‘s Encrypt自动证书管理。
# 将示例域名替换为你自己的 external_url 'https://git.your-company.com' # 开启Let's Encrypt letsencrypt['enable'] = true letsencrypt['contact_emails'] = ['admin@your-company.com'] # 可选,设置联系邮箱 letsencrypt['auto_renew'] = true letsencrypt['auto_renew_hour'] = 0 # 自动续签时间(0-23) letsencrypt['auto_renew_minute'] = 30 # 自动续签分钟(0-59) letsencrypt['auto_renew_day_of_month'] = "*/4" # 每4天检查一次配置2:配置邮件服务器(以SMTP为例)邮件通知是团队协作的核心功能(如合并请求、流水线状态)。找到邮件配置部分,根据你的邮件服务商(如企业邮箱、SendGrid、阿里云邮件等)进行配置。
gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.your-email-provider.com" # SMTP服务器地址 gitlab_rails['smtp_port'] = 587 # 通常587(TLS)或465(SSL) gitlab_rails['smtp_user_name'] = "gitlab@your-company.com" # 发件邮箱 gitlab_rails['smtp_password'] = "your-strong-password" # 邮箱密码或授权码 gitlab_rails['smtp_domain'] = "your-company.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false # 如果端口是465,此项设为true # 让GitLab发出的邮件显示来自这个地址 gitlab_rails['gitlab_email_from'] = 'gitlab@your-company.com' gitlab_rails['gitlab_email_reply_to'] = 'noreply@your-company.com'配置3:调整性能相关参数(根据服务器内存)如果你的服务器内存不是特别大(比如8GB),可以适当调整Unicorn(GitLab的Web应用服务器)和Sidekiq(后台任务处理器)的工作进程数,以避免内存溢出。
# 根据总内存调整。8GB内存可以参考以下配置。 unicorn['worker_processes'] = 2 # 默认是CPU核数,可适当调低 sidekiq['concurrency'] = 10 # 默认是25,可适当调低 # 启用页面缓存,可以显著提升静态资源访问速度 gitlab_rails['cache_classes'] = true修改完配置文件后,必须执行以下命令使配置生效:
# 重新配置GitLab(这是一个重量级操作,会根据新配置生成所有服务文件并重启服务) sudo gitlab-ctl reconfigure # 重启所有GitLab服务(在reconfigure之后通常会自动重启,但手动执行一次更保险) sudo gitlab-ctl restart执行reconfigure可能需要几分钟时间。如果配置了HTTPS,此时GitLab会自动尝试从Let‘s Encrypt获取证书。你可以通过sudo gitlab-ctl tail命令查看日志,确认服务启动和证书申请状态。
4. GitLab Web界面核心功能详解与实战
部署完成并成功登录后,面对功能丰富的界面,从哪里开始?我将以一个新项目的完整生命周期为线索,带你遍历GitLab Web界面的核心模块。
4.1 仪表盘与全局导航
登录后的首页就是仪表盘。左侧是垂直导航栏,这是你探索GitLab的主要入口。
- 项目:查看你参与的所有项目。
- 群组:GitLab中用于组织项目和用户的核心单元。你可以按部门(如“后端组”、“前端组”)、按产品线创建群组,并在群组下创建项目,便于统一管理权限和设置。
- 议题:相当于增强版的问题跟踪或工单系统。你可以在这里看到分配给自己的、自己创建的或所有群组/项目中的议题。
- 合并请求:代码协作的核心。所有待你审查、待你合并或你创建的合并请求都在这里汇总。
- CI/CD:快速访问流水线、作业和制品库的入口。
- 运维:查看项目运行状况、监控指标、日志等(更多用于Kubernetes集成)。
- 分析:提供项目、群组级别的各种洞察报告,如代码贡献量、CI/CD效率等。
- 管理:仅管理员可见。这里是系统后台,可以管理用户、群组、应用设置、系统监控等。
实操心得:养成使用“搜索”或“转到”功能的习惯。在Web界面任何页面的顶部,都有一个全局搜索框,你可以快速搜索项目、用户、议题、代码,这是最高效的导航方式。
4.2 项目创建与基础设置
点击导航栏的“+”号或“项目”页面中的“新建项目”按钮。
- 创建空白项目:输入项目名称、描述,选择可见性级别。
- 私有:只有被明确授予权限的用户才能访问。绝大多数内部项目都应选择私有。
- 内部:所有登录用户都可以访问。
- 公开:互联网上任何人都可以无需登录查看。
- 初始化仓库:可以选择添加README文件、
.gitignore模板(如Python、Node.js)和许可证。我强烈建议创建项目时就初始化README和合适的.gitignore,这是一个好习惯。 - 创建完成后,你会进入项目的主页。这里展示了仓库的默认分支(通常是
main或master)、README内容、最近的活动等。
项目设置深入:点击左侧边栏底部的“设置” -> “通用”,这里有很多关键配置:
- 可见性、项目功能、权限:可以后期调整项目的可见性,或关闭Wiki、议题等你不需要的功能。
- 合并请求:设置合并前是否需要流水线成功、是否需要至少一个批准等规则,这是保障代码质量的关键门禁。
- CI/CD:配置变量、流水线规则、Runner等。我们稍后会详细讲。
- 仓库:在这里设置默认分支、保护分支规则、推送规则(如禁止强制推送)等。务必设置分支保护规则,例如保护
main分支,禁止直接推送,必须通过合并请求。
4.3 代码仓库与协作流程
项目的心脏就是代码仓库。GitLab提供了强大的Web端代码管理功能。
1. 文件浏览与编辑:在“仓库” -> “文件”标签下,你可以像在资源管理器中一样浏览项目文件。点击任何文件可以查看内容,对于文本文件,你可以直接点击“编辑”进行在线修改并提交。这对于快速修复文档中的错别字或更新配置文件非常方便。
2. 提交、分支与对比:所有提交历史在“仓库” -> “提交”中查看。点击某次提交,可以看到详细的变更内容(Diff)。
- 创建分支:在项目首页,点击“分支”按钮,可以基于某个提交或标签创建新分支。Web界面创建分支后,你可以直接在本地
git fetch然后git checkout切换到该分支。 - 代码对比:在“合并请求”或提交详情页,Diff视图非常清晰。绿色背景表示新增行,红色背景表示删除行。你可以对每一行代码发表评论,进行精准的代码审查。
3. 合并请求(Merge Request, MR):这是GitLab协作的灵魂。假设你开发了一个新功能在feature-login分支上,现在想合并到main分支。
- 创建MR:在项目页面,切换到你的
feature-login分支,通常会看到一个醒目的“创建合并请求”按钮。点击后,需要选择源分支(你的特性分支)和目标分支(如main)。 - 填写信息:填写清晰的标题和描述。描述应该说明这个MR的目的、做了什么改动、如何测试。好的描述能极大提升审查效率。你可以使用模板(在项目设置中配置)来规范描述格式。
- 分配审查者:在右侧边栏,将MR分配给一位或多位同事进行代码审查。审查者会收到邮件通知。
- 流水线状态:如果项目配置了CI/CD,创建MR后会自动触发流水线。一个绿色的流水线状态(“通过”)通常是允许合并的前提。
- 讨论与审查:审查者在Diff视图上对代码行发表评论,提出建议或问题。你可以在线回复、讨论,甚至直接根据建议在Web编辑器里修改代码并推送到同一个分支,MR会自动更新。
- 合并:当所有讨论被解决、流水线通过、且满足项目设置的合并规则(如至少一个批准)后,就可以点击“合并”按钮。GitLab提供了几种合并方式:“合并提交”、“变基合并”、“压缩合并”,你可以根据团队规范选择。
4.4 议题与里程碑管理
GitLab的议题系统远不止是Bug追踪器,它是一个完整的项目管理工具。
- 创建议题:可以关联到具体项目或群组。议题类型包括问题、需求、任务等。
- 属性丰富:可以为议题分配负责人、设置优先级、关联里程碑、打上标签(如
bug,enhancement,frontend)、设置截止日期、关联到某个合并请求。 - 看板视图:在“议题” -> “看板”中,可以创建自定义看板,通过拖拽议题在不同列表(如“待办”、“进行中”、“已完成”)间移动,直观管理任务流。
- 里程碑:用于聚合一段时间内要完成的议题和合并请求,常用于版本规划(如“V1.2发布”)。你可以跟踪里程碑的进度百分比。
4.5 CI/CD流水线初探
GitLab CI/CD是其王牌功能之一,它允许你将测试、构建、部署等流程自动化。这一切都通过项目根目录下的一个名为.gitlab-ci.yml的配置文件来定义。
核心概念:
- 流水线:一次CI/CD执行的顶级单元,由一次代码推送(或MR创建等)触发。
- 阶段:流水线内的执行阶段,如
build,test,deploy。阶段按顺序执行。 - 作业:阶段内的具体任务。一个阶段可以有多个作业,它们会并行执行。
- Runner:实际执行作业的代理。可以是共享的(由管理员注册),也可以是项目特定的。你需要至少有一个活跃的Runner,流水线才能运行。
一个最简单的.gitlab-ci.yml示例:
# 定义流水线有哪些阶段 stages: - test - deploy # 定义一个名为“单元测试”的作业,它属于“test”阶段 unit-test: stage: test script: - echo "开始运行单元测试..." - npm install - npm test # 只有main分支和合并请求会触发这个作业 only: - main - merge_requests # 定义一个部署作业 deploy-to-staging: stage: deploy script: - echo "部署到预发布环境..." - ./deploy-script.sh # 只有main分支会触发部署 only: - main # 需要手动点击才能执行 when: manual当你将包含此文件的代码推送到仓库后,GitLab会自动检测并触发流水线。你可以在项目的“CI/CD” -> “流水线”页面查看运行状态、日志和结果。
注意事项:Runner的配置和管理是一个独立的话题。对于入门,你可以先在项目设置中启用GitLab提供的“共享Runner”(如果管理员已开启),或者在一台单独的服务器/电脑上安装一个GitLab Runner并注册到你的项目。避免在GitLab主服务器上运行重型CI作业,以免影响主服务性能。
5. 管理员后台核心功能与日常运维
以管理员身份登录后,左侧导航栏会出现“管理”区域。这里是整个GitLab实例的“控制面板”。
5.1 用户与权限管理
“概览” -> “用户”:
- 添加用户:可以手动创建用户,或配置OAuth(如GitHub, Google)等外部认证源,实现单点登录。
- 权限模型:GitLab权限清晰。用户在项目/群组中的角色(访客、报告者、开发者、维护者、所有者)决定了他们能做什么。通常,普通开发者赋予“开发者”角色即可,他们可以推送代码、创建MR、管理议题。核心负责人可以赋予“维护者”角色,拥有合并MR、管理流水线等更高权限。
- 群组权限:将用户添加到群组,并赋予群组角色,该用户在群组下的所有项目中会自动获得相应权限,这是大规模权限管理的最佳实践。
5.2 系统监控与健康检查
“监控” -> “系统信息”:
- 这里可以查看服务器的实时负载、内存使用、磁盘空间、运行进程等。定期检查磁盘使用情况,特别是仓库存储目录和备份目录,避免磁盘写满导致服务不可用。
- “监控” -> “后台作业”可以查看Sidekiq队列的状态。如果“队列长度”持续很高,说明后台任务积压,可能需要优化作业或增加Sidekiq并发数。
5.3 备份与恢复
备份是运维的生命线。Omnibus GitLab的备份非常简单:
# 执行备份,备份文件默认存储在 /var/opt/gitlab/backups/ 目录下 sudo gitlab-backup create备份文件名会包含时间戳。你需要将备份文件定期转移到安全的异地位置。
恢复备份(在相同版本的GitLab上):
# 停止相关服务 sudo gitlab-ctl stop unicorn sudo gitlab-ctl stop sidekiq # 执行恢复,将BACKUP_TIMESTAMP替换为你的备份文件名(不含后缀) sudo gitlab-backup restore BACKUP=BACKUP_TIMESTAMP # 重新配置并启动 sudo gitlab-ctl reconfigure sudo gitlab-ctl restart重要:恢复操作会覆盖当前实例的所有数据,请务必在测试环境验证备份的有效性。
5.4 升级GitLab
保持GitLab更新可以获取新功能和安全补丁。Omnibus升级通常很平滑:
# 更新APT源列表 sudo apt update # 升级GitLab到最新版本 sudo apt install gitlab-ce # 升级后重新配置 sudo gitlab-ctl reconfigure升级前,务必阅读官方升级指南,特别是跨大版本的升级(如从14.x到15.x),可能有破坏性变更需要手动处理。升级前一定要先做完整备份!
6. 常见问题与故障排查实录
即使按照最佳实践部署,在实际运行中也可能遇到问题。这里记录了几个我踩过的坑和解决方法。
6.1 部署与启动问题
问题1:访问GitLab出现“502 Whoops, GitLab is taking too much time to respond.”这是最常见的问题,通常意味着某个核心服务(如Unicorn, Puma, Sidekiq)没有正常启动或资源不足。
- 排查步骤:
- 检查服务状态:
sudo gitlab-ctl status。查看是否有服务显示“down”。 - 查看详细日志:
sudo gitlab-ctl tail可以实时查看所有服务的日志。通常关注unicorn或puma的日志,看是否有错误信息。常见原因是内存不足。 - 检查端口占用:
sudo netstat -tlnp | grep :80或grep :8080,看是否有其他程序占用了GitLab的默认端口。
- 检查服务状态:
- 解决方案:
- 内存不足:这是最可能的原因。尝试增加服务器Swap空间,或者按照前面提到的,调低
unicorn['worker_processes']和sidekiq['concurrency']的值,然后sudo gitlab-ctl reconfigure并重启。 - 端口冲突:修改
/etc/gitlab/gitlab.rb中的nginx['listen_port']或其他服务的端口,然后重新配置。
- 内存不足:这是最可能的原因。尝试增加服务器Swap空间,或者按照前面提到的,调低
问题2:Let‘s Encrypt证书申请失败
- 可能原因:
- 域名解析未生效或指向错误。
- 服务器80或443端口被防火墙阻止,无法完成ACME挑战。
- 之前申请过证书但失败了,存在残留的挑战文件。
- 解决方案:
- 确保
external_url中的域名能从公网正确解析到你的服务器IP。 - 确保防火墙放行了80和443端口。
- 手动清理并重试:
sudo gitlab-ctl renew-le-certs # 或者更彻底地 sudo rm -rf /var/opt/gitlab/nginx/etc/letsencrypt sudo gitlab-ctl reconfigure - 确保
6.2 日常使用问题
问题3:推送代码时提示“HTTP Basic: Access denied”或认证失败
- 可能原因:本地Git缓存的凭据过期或错误。
- 解决方案:
- 对于HTTPS方式:在GitLab网页上生成一个“访问令牌”(Profile -> Access Tokens),权限勾选
api和write_repository。然后在本地使用令牌作为密码进行推送。 - 清除旧凭据(Windows):在“控制面板” -> “用户账户” -> “管理Windows凭据”中,找到git相关的凭据并删除。
- 清除旧凭据(Mac/Linux):
git config --global --unset credential.helper,然后再次推送会提示输入用户名和密码(或令牌)。
- 对于HTTPS方式:在GitLab网页上生成一个“访问令牌”(Profile -> Access Tokens),权限勾选
问题4:CI/CD流水线一直处于“Pending”状态,没有Runner执行
- 可能原因:没有可用的Runner,或者Runner没有为该项目/标签启用。
- 解决方案:
- 进入项目“设置” -> “CI/CD”,展开“Runner”面板。
- 查看“可用的Runner”列表是否为空。如果是,你需要安装并注册一个Runner。
- 如果有Runner,检查其状态是否是“在线”且“未激活”。如果是“未激活”,你需要点击“为项目启用Runner”。
- 检查你的
.gitlab-ci.yml中的作业是否指定了tags,而Runner没有这些标签。要么给Runner添加对应标签,要么在作业中移除tags限制。
6.3 性能优化问题
问题5:GitLab界面加载慢,仓库克隆速度慢
- 可能原因:
- 服务器资源(CPU/内存)瓶颈。
- 存储I/O性能差(特别是仓库盘如果是机械硬盘)。
- GitLab的缓存或Sidekiq队列积压。
- 排查与优化:
- 使用
sudo gitlab-ctl tail和top命令查看服务器资源使用情况。 - 考虑将仓库数据目录挂载到SSD磁盘。
- 定期清理无用数据:进入“管理” -> “设置” -> “仪表盘限制”,可以设置自动清理旧的流水线历史、制品等。
- 对于大型仓库,启用Git仓库的“Git垃圾回收”可以提升克隆和拉取速度。可以在项目“设置” -> “仓库” -> “仓库维护”中手动触发,也可以通过后台任务定期执行。
- 使用
部署和维护一个自有的GitLab实例,就像打理一个花园。初期需要精心规划和播种(部署与配置),日常则需要浇水施肥(用户管理、权限设置、CI/CD调优)和定期修剪(监控、备份、升级)。这个过程虽然需要投入一些时间和精力,但换来的是一套完全受控、深度集成、能极大提升团队协作效率和工程能力的强大平台。从今天起,尝试为你的团队种下这棵“树”,看着它生根发芽,最终支撑起整个研发流程的参天大树。
