ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

GitLab自托管实战:从Docker部署到CI/CD高频操作与避坑

GitLab自托管实战:从Docker部署到CI/CD高频操作与避坑 1. GitLab是谁为什么值得折腾先聊一个看着有点傻、但几乎每天都会有人问的问题GitLab 到底是干嘛的它本质上就是一套可以自己部署的代码托管平台跟 GitHub、Gitee 做的事差不多——管理代码仓库、处理合并请求、跑 CI/CD 流水线、发 Release 包。但最大的区别就一条GitHub 的代码放别人服务器上GitLab 你可以整个搬回公司内网或自己的服务器仓库、权限、流水线全部自己掌控。我为什么从 GitHub 切换到 GitLab最开始其实是被逼的。公司要求代码不能出内网又想要 GitHub 那种 Pull Request 协作体验选了 GitLab 一用就是好几年慢慢才体会到它真正值钱的地方。对个人开发者来说GitLab 的免费版也够用不限仓库数量、支持私有仓库、自带 CI/CD光最后一条就能省掉单独搭 Jenkins 的不少事。对团队来说自托管之后权限控制、审计日志、LDAP 对接都做得非常顺手代码安全性也更有底。这篇我打算把 GitLab 从部署到日常使用的高频操作串一遍重点讲那些教程里经常一笔带过、但实操时一定会踩的坑。适合三类人看刚接触 GitLab、装了不知道从哪入手的同学打算在企业内网自建代码平台的运维或技术负责人以及已经在用 GitLab、但被配置 SSH、Token、CI/CD 这些细节卡过的人。2. 部署落地Docker 是当前最稳的入口自托管 GitLab 有两种主流方案官方推荐的 Omnibus 包直接装在 Ubuntu/CentOS 上和 Docker 部署。如果你不是有特殊的性能调优需求我建议直接用 Docker。原因很简单Omnibus 装的时候依赖挺多升级、回滚、迁移都比较麻烦Docker 把 GitLab 的依赖全部封装好了数据目录挂载出来升级就是拉一个新镜像重启容器出了问题还原也容易。2.1 用 docker-compose 拉起一套 GitLab先交代环境。我在一台 Ubuntu 20.04 的机器上实操配置是 4 核 8G 内存、100G 磁盘。GitLab 对内存要求比一般的 Web 应用高官方说 4G 是起步我实测下来 4G 跑起来有点吃力编译流水线一跑就容易卡建议至少 8G。直接看 docker-compose.yml 的写法version: 3.8 services: gitlab: image: gitlab/gitlab-ce:16.11.2-ce.0 container_name: gitlab restart: always hostname: gitlab.example.com environment: GITLAB_OMNIBUS_CONFIG: | external_url http://gitlab.example.com gitlab_rails[gitlab_shell_ssh_port] 2222 unicorn[worker_processes] 4 postgresql[shared_buffers] 256MB ports: - 80:80 - 2222:22 volumes: - /srv/gitlab/config:/etc/gitlab - /srv/gitlab/logs:/var/log/gitlab - /srv/gitlab/data:/var/opt/gitlab shm_size: 256m几个关键点说明一下。external_url 是你访问 GitLab 的地址如果你没有域名可以直接写 http://服务器IP例如 http://192.168.1.10这样浏览器里可以直接通过 IP 访问。gitlab_shell_ssh_port 这个参数很多人会漏它的意思是 GitLab 对外提供 Git 操作的 SSH 端口。因为容器内部 sshd 监听在 22 端口而宿主机 22 端口通常已经被系统自己的 sshd 占用了所以我把宿主机的 2222 映射到容器内的 22。而且访问仓库时的克隆地址GitLab 会根据这个配置生成 ssh://gitgitlab.example.com:2222/group/project.git 而不是常规的 gitgitlab.example.com:group/project.git 格式。这个细节不设对后面 clone 代码很容易碰到连不上的问题而且用 Git 检查时会提示端口不匹配。volumes 挂载了三个目录config 保存 GitLab 的配置logs 存日志data 存仓库数据、数据库。这三个目录必须挂出来否则容器一删你的代码仓库和历史记录就全没了。我第一次部署时没挂数据目录想升级版本直接丢了近一个月的提交记录那种教训一次就够了。2.2 首次启动与默认密码镜像比较大首次启动按照机器性能和网络状况大约需要 3~8 分钟。怎么判断初始化完成了盯着容器日志docker compose logs -f gitlab | grep Running configuration change或者直接等浏览器打开页面看到 GitLab 的欢迎页说明起来了。首次访问时GitLab 会让设置 root 用户的密码至少 8 位。这是管理员账号权限极大密码务必记牢。然后遇到之前热搜里频繁出现的gitlab login failed. check api token or gitlab version. log in via git if the version is older这个报错其实是 VSCode 的 GitLab 插件在探测 API 版本时失败导致的一般分三种情况一是你 Token 真的配错了二是 GitLab 版本旧、插件不兼容三是插件权限不够。解决办法我在后面 Token 那一节详细说这里先知道有这么个坑。3. SSH 密钥配置第一次拉代码前必做的事很多新手卡在配置 GitLab 免密拉取这步其实 SSH 密钥的原理很简单你生成一对公私钥把公钥交给 GitLab私钥留在自己电脑上。以后 Git 跟 GitLab 通信时GitLab 用公钥验证你的身份你的私钥负责签名类似于你随身带了一把只属于自己的印章盖章之后对方能验明真身但是学不会你的印。3.1 生成密钥并添加到 GitLab这一步主要在本机操作通用做法cd ~/.ssh ssh-keygen -t ed25519 -C youremailexample.com生成的 id_ed25519 是私钥id_ed25519.pub 是公钥。然后查看公钥内容并复制cat ~/.ssh/id_ed25519.pub把输出的整串内容复制到 GitLab 的 Settings - SSH Keys 页面标题随便起个好认的名字Expiration date 建议留空或设长一点否则到期后你又得重新配一遍。为什么我推荐 ed25519 而不是传统的 RSA 2048/4096性能更快、密钥更短、安全性理论更强而且 GitLab 十几版本之后对 ed25519 支持已经很成熟。RSA 兼容性是好但除非你要兼容很老的系统否则 ed25519 足够了。3.2 本机 SSH config 与端口适配如果你前面用 Docker 部署并且把宿主机 2222 映射到了容器 22那还需要在 ~/.ssh/config 里加一段配置不然 git clone 时会默认走 22 端口连到宿主机自带的 sshd连到的根本不是 GitLabHost gitlab.example.com HostName gitlab.example.com Port 2222 User git IdentityFile ~/.ssh/id_ed25519如果你访问 GitLab 用的是 IP比如 http://192.168.1.10那 Host 和 HostName 都填 192.168.1.10。测一下能否连通ssh -T gitgitlab.example.com -p 2222看到Welcome to GitLab, username!就说明密钥配置成功了。很多人在这一步会卡很久我见过最典型的错误是直接把公钥加到 GitLab 后没配置 ~/.ssh/config结果 clone 时一直提示 Permission denied (publickey)其实就是 ssh 客户端用了系统 sshd 的 22 端口而不是 GitLab 监听的 2222 端口。你只要在 config 里把端口指对问题立刻消失。4. 登录、Token 与常见认证报错4.1 422 登录错误和隐身模式gitlab 422 登陆的错误,隐身模式可以登陆这个热搜组合非常有意思。422 通常意味着请求被 CSRF 校验拦住了根本原因是浏览器的 Cookie 或缓存里有旧的 GitLab 会话信息跟新部署的 GitLab 的加密密钥对不上。你开隐身窗口访问浏览器完全没有旧会话状态所以能正常登录一旦用回普通窗口旧 Cookie 还在GitLab 校验不通过就报 422。解决办法很简单清除该站点 Cookie或者直接换隐身窗口。另外如果你的 GitLab 开启了强制 HTTPS而浏览器缓存里还存着 HTTP 的会话也会出现类似问题。这种情况我建议干脆换个新浏览器登录一次再回旧浏览器清理缓存省得纠结。4.2 GitLab Token分类与获取位置Token 在 GitLab 里主要有这么几类Personal Access Token个人访问令牌代替密码操作 API 或进行 Git 操作。Project Access Token项目级令牌权限范围只限当前项目下适合 CI/CD 使用。Group Access Token组级令牌管理一个组下的所有项目。Deploy Token只读或读写特定项目的仓库和镜像仓库适合自动部署场景。PTA 在哪里创建登录 GitLab 后点击左下角头像进入 Preferences偏好设置左侧菜单里有 Access Tokens。如果新版界面不好找也可以直接访问地址http://你的GitLab地址/-/profile/personal_access_tokens。创建时注意勾选 scopes。pull 代码只需要 read_repository通过 API 创建项目、管理仓库需要 api 权限要用 GitLab 的 Git LFS 还要 read_repository 配合 write_repository。Token 只显示一次关掉页面就再也看不到了务必复制到自己的密码管理工具里。很多人在 VSCode 里配置 GitLab 插件时填了 Token 却一直报login failed. check api token or gitlab version我排查过几个真实案例原因基本是勾选 scope 时只选了 read_user没选 api。VSCode 插件通常要调用 GitLab API 获取项目列表、创建 MR 等信息没有 api 权限自然失败。遇到这个报错先别怀疑版本先检查 token 权限。当然如果你的 GitLab 版本比较老13.x 以下也确实是插件太新导致不兼容那就需要升级 GitLab 或插件版本。4.3 未授权访问漏洞与快速加固GitLab 多次出现过高危漏洞比如未授权访问接口、SSRF、存储型 XSS。听到未授权访问漏洞常见路径有哪些这种问题说明大家确实关心安全。这里给几个重点路径供自查/api/v4/users如果可以不登录就枚举出所有用户信息说明注册功能配置有风险。/users/sign_up匿名用户可以注册账号一旦注册成功可能访问到内部项目。/admin 相关接口直接暴露在公网且未加保护。针对这些风险最有效的手段是第一升级到最新稳定版很多高危漏洞是版本太旧导致第二关闭公开注册在 Admin Area - Settings - Sign-up restrictions 里取消 Sign-up enabled 勾选第三用反向代理在 Web 层加 IP 白名单限制 /admin、/api 的访问来源第四如果不需要公网访问干脆不暴露到公网上或者放在内网使用。上次公司内网因为某个老版本 CVE 被人探测扫描我第一时间升级并关了注册入口半天就消停了说明基础加固比上复杂安全设备更管用。5. 创建项目、拉取代码与本地推送5.1 创建项目并上传本地代码在 GitLab 首页点击 New project有三种方式Create blank project空项目、Create from template模板项目、Import project从其他平台导入。我平时用 blank 最多填好项目名可见性选 Private初始化时勾选 Add README。如果本地已经有一个项目要推上去不需要在界面上勾 README直接按下面的命令操作cd 你的项目目录 git init git add . git commit -m Initial commit git branch -M main git remote add origin http://gitlab.example.com/group/project.git git push -u origin main注意 remote add origin 后面这个地址推荐用 SSH 形式ssh://gitgitlab.example.com:2222/group/project.git因为 SSH 不用每次输入密码也不容易触发 token 失效问题。如果你不想处理 SSH那就用 HTTP 地址但 push 时大概率要求输入用户名和访问令牌密码框里填你的登录密码会一直验证失败填 Personal Access Token 才可以通过。这个坑已经有太多人踩过我朋友第一次在 HTTP 下推送输错了五次密码最后才发现要用 Token气得差点删库。5.2 拉取代码到本地从零开始拉一个新项目到本地常见的路径git clone gitgitlab.example.com:group/project.git如果你按前面 Docker 部署的方式做了端口映射那 clone 地址是git clone ssh://gitgitlab.example.com:2222/group/project.git项目已经有代码、有远程分支你只想拉最新代码就进到项目目录执行git fetch --all git pull origin main如果本地分支与远程分支的提交历史不一致pull 报冲突可以改用 pull --rebase 把本地提交暂存、拉取远程新提交后在本地重放。团队协作时这个命令更常用因为它能保持提交历史线性不会频繁出现 merge commit。5.3 VSCode 和 IDEA 配置 GitLabVSCode 里使用 GitLab官方推荐安装 GitLab Workflow 扩展它会读取你打开的本地仓库、自动识别远程仓库地址然后调用 GitLab API 显示流水线状态、MR 列表等。前提是本地先安装好 Git然后在 VSCode 设置里搜索 gitlab.gitlab.baseUrl 填你的 GitLab 地址比如 http://gitlab.example.com再配置 gitlab.gitlab.token 填访问令牌。如果配置完了还是连不上多半是 baseUrl 写成了 gitlab.example.com 少了 http 协议或者 token 权限不对按我前面说的排查路径走一遍就解决了。IDEA 其实不用装额外插件它自带的 Git 集成就能连 GitLab。在 Settings - Version Control - Git 里配好 Git 可执行文件路径然后 Settings - Version Control - GitHub 那里虽然叫 GitHub但你可以通过 Add account - GitLab 的方式添加。填入 GitLab URL 和 Access TokenIDEA 会自动识别项目并展示 MR、提交历史、分支信息。实际体验下来IDEA 的 GitLab 集成比 VSCode 插件流畅一点特别是做代码审查时要看行内评论IDEA 的展示形式更直观。6. 用 CI/CD 把代码变成产物6.1 认识 .gitlab-ci.ymlGitLab CI/CD 的核心就是 .gitlab-ci.yml放在仓库根目录下。它会定义整个流水线的阶段比如 test - build - deploy。每次 push 代码后GitLab Runner 会拉取代码按照配置文件一步步执行任务。我最早的流水线很简单拿 Python 项目为例stages: - test - build before_script: - python --version test: stage: test script: - pip install -r requirements.txt - pytest tests/ build: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . only: - main这段配置里有几个隐藏点值得注意。第一pip install -r requirements.txt如果在 CI Runner 上执行会去公共 PyPI 下载依赖。很多内网环境的 Runner 没有外网权限这时需要在 PyPI 源里配置公司内部镜像或者把依赖打包上传到私有仓库。热搜词gitlab cicd python 依赖 仓库地址说的就是这个场景。解决办法是配置 pip 的 index-url 指向内网源例如pip install -r requirements.txt -i http://您的内网pypi源/simple --trusted-host 您的内网pypi源如果你用的是企业内部的私有依赖还需要把仓库地址配置为 GitLab 的包仓库把依赖发布到 GitLab Package Registry 里并在 pip.conf 里配置 extra-index-url。这个流程比较细我这里先提一下思路后面会展开讲 GitLab Package 的使用。第二GitLab Runner 执行 Job 时默认的工作目录是 CI_PROJECT_DIR也就是克隆下来的仓库目录。很多人想在 Job 里执行cd /some/other/path再跑脚本发现找不到文件那是因为工作目录就不是你 push 的项目目录。建议尽量在项目根目录下组织脚本不要跨目录操作。第三only 和 rules 的区别。only 是历史遗留写法只认分支名或标签名无法精确控制变量条件rules 是推荐的新语法可以同时匹配分支、变量、MR 状态等。写新流水线时直接用 rules。6.2 注册 GitLab Runner要让 CI/CD 跑起来光有配置文件不够还得有一个 Runner 来执行任务。Runner 可以装在独立服务器、Kubernetes Pod、甚至你本地电脑的 Docker 容器里。注册命令一般是gitlab-runner register \ --non-interactive \ --url http://gitlab.example.com/ \ --registration-token YOUR_REGISTRATION_TOKEN \ --description my-first-runner \ --executor docker \ --docker-image python:3.11 \ --docker-volumes /var/run/docker.sock:/var/run/docker.sockRegistration Token 在哪里找项目页面 Settings - CI/CD - Runners里面会有 Specific runners 的注册链接和 token。用的是新版却一直提示 token 失效检查一下 GitLab 版本15.x 之后推荐用 project-level 的 Runner 注册 token过期或权限不足时旧 token 就失效那就去 Runners 设置里重新生成。如果使用 Docker executor每个 Job 都会拉一个隔离的 Docker 容器来执行命令。看起来方便但也意味着每次构建都要还原依赖、装测试库时间比较长。想优化的话可以在tags里给 Runner 打标签然后 Job 里指定 tags 跑在某一台做了缓存的高配机器上。6.3 在 CI 中处理 Python 依赖缓存内网环境最大的痛点就是依赖下载慢、甚至下不了。我总结了一套可行的组合方案基础镜像选择带 Python 和 pip 的版本比如 python:3.11-slim。Runner 的 Docker 配置中配置国内或内网 PyPI 镜像地址作为全局 pip 源避免每个 Job 都写一遍-i参数。使用 GitLab Cache 缓存 pip 下载目录cache: paths: - .pip-cache/ test: stage: test script: - pip install --cache-dir .pip-cache -r requirements.txt这样第二次跑流水线时依赖可以直接走缓存时间能缩短很多。我实际经验是同样一个 Django 项目第一次流水线 8 分钟加了缓存之后第二次能压到 3 分半收益很明显。如果你的项目里还有内部包比如一个团体内多个服务共用一套工具库那建议把工具库发到 GitLab Package Registry。在项目里配置[global] extra-index-url http://gitlab.example.com/api/v4/projects/项目ID/packages/pypi/simple trusted-host gitlab.example.com然后 pip install 就能直接从 GitLab 拉取私有包了。这个方式非常适合企业内部项目既不走公共网络又能统一依赖版本。7. 常见问题与排查技巧实录把这些年真真切切遇到并解决的问题整理成一个速查表方便在遭遇报错时快速定位。症状原因解决办法git clone 报 Permission denied (publickey)SSH 密钥未添加或 ssh 端口不对客户端生成密钥并添加到 GitLab检查 ~/.ssh/config 的端口VSCode 插件报 login failed. check api token or gitlab versionToken 权限不足或版本过旧检查 token scopes 是否包含 api跳转 /-/profile/personal_access_tokens 重新生成登录报 422浏览器 Cookie 残留旧会话清除域名 Cookie 或换隐身模式登录push 时要求输入密码、密码总是错使用的是个人登录密码而非 Token密码框输入 Personal Access TokenCI 流水线一直 pending没有可用的 Runner或 Runner 繁忙查看项目 Settings - CI/CD - Runners 是否在线docker 启动后页面 502GitLab 仍在初始化或内存不足查看 /var/log/gitlab/gitlab-rails 日志等健康检查通过升级内存无法统计推送代码量统计的是 MR 和提交量push 频率不代表代码量使用 GitLab Analytics 或在下游统计提交记录7.1 Ubuntu 部署 GitLab 的简化版指引如果你不想用 Docker想直接在 Ubuntu 上部署官方推荐方式也很清晰。先装依赖再添加仓库、安装 gitlab-cesudo apt update sudo apt install -y curl openssh-server ca-certificates postfix curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo EXTERNAL_URLhttp://gitlab.example.com apt install gitlab-ce装完执行sudo gitlab-ctl status查看各服务状态sudo gitlab-ctl reconfigure在改完配置文件后需要执行一次让配置生效。这种方式比 Docker 更贴近系统原生但备份和迁移麻烦一些。我个人的选择是 Docker省心。7.2 git 账号和 GitLab 账号不一致热搜词里有一条git账号和gitlab账号不一致无法统计推送代码量这个其实是个很容易绕晕的坑。GitLab 统计贡献者时是通过提交记录里的 author name 和 email 来对应到账号的。如果你的全局 Git 配置是一套而 GitLab 账号里绑定的邮箱是另一套那么你的提交就不会算到这个账号头上。处理方式很简单检查并修改提交者信息git config --global user.name 你的昵称 git config --global user.email 你的GitLab账号邮箱然后重置历史中的作者信息不过这会重写历史操作要谨慎。正确做法是从一开始就统一邮箱。如果历史已经乱了可以用 git filter-repo 批量修改但要确保参与协作的同事都 pull 最新的历史不然会冲突。很多团队里为什么我提交了很多代码、但代码统计榜上没有我的问题十有八九都是这个原因。7.3 默认端口引发的访问混淆GitLab 默认端口其实不是 79。gitlab.example.com 走 HTTP 时默认是 80图省事可以直接用 IP 80 访问HTTPS 是 443。有人会把 GitLab 放到 79 端口实际上是因为内网端口规划冲突。无论用哪个端口external_url 都要带上端口。比如http://192.168.1.10:79那访问地址就是http://192.168.1.10:79CI CD 里的 URL 配置也必须是这个带上端口的地址。整体思路就是让 GitLab 知道自己被访问的合法地址它生成 link、API 文档、Webhook 地址时才会正确。7.4 与 Jenkins 同主机 Docker 部署的注意事项GitLab 和 Jenkins 能跑在同一台宿主机的 Docker 里吗能但两个容器都用 8080 端口就会冲突。GitLab 默认不走 8080Jenkins 默认走 8080所以常见做法是把 Jenkins 的宿主映射端口改为 8081或者把 GitLab 的端口改掉。同时注意 Docker 网络问题两个容器最好放在同一个 docker network 内让 GitLab 通过 http://gitlab:8080 或 http://gitlab 访问 Jenkins 的 Webhook而 Jenkins 访问 GitLab 则用外网地址。我也踩过一个坑Jenkins 容器里跑 Maven 构建、需要连接 GitLab 拉取代码但容器内解析 gitlab.example.com 解析到了宿主机 IP导致网络不通。解决办法是 compose 文件里加 extra_hosts直接把 gitlab.example.com 指向宿主机 IP。7.5 高危漏洞的快速收敛前面提到了修复思路这里再给一套可执行的操作清单确认当前版本右下角 Help 页面能看到完整版本号也可以访问http://gitlab.example.com/api/v4/version需要带 token。对照官方安全公告和 CVE 库确认影响范围。升级 GitLab 到包含修复的版本Docker 部署的可以先拉新镜像再用新镜像启动容器观察日志是否正常。开启自保护管理后台收紧注册权限、关闭公开项目、配置 IP 白名单。定期备份Docker 方式下可以用docker exec -t gitlab gitlab-backup create把配置文件和数据目录一起打包到异地。说实话GitLab 漏洞修复没有捷径最快的办法就是版本跟上游保持同步。欠版本债越久后面补课越痛苦这是所有自托管软件逃不掉的规律。8. 一些更进阶的玩法8.1 通过 API 自动化管理项目GitLab 的 API 设计得相当完整日常运维完全可以脚本化。比如批量创建项目curl --request POST \ --header PRIVATE-TOKEN: 你的PersonalAccessToken \ --data namemy-new-projectvisibilityprivate \ http://gitlab.example.com/api/v4/projects获取 OAuth Token 还有一套标准流程主要给第三方应用用。反复提示 Token 失效时检查下是不是 OAuth Application 的回调地址没配对。如果你的服务要长期调用 API更推荐用 Service Account 或项目级 Access Token而不是拿个人的 token这样离职、调岗时权限回收也干净。8.2 搭建 ARM 构件的构建流水线如何从 gitlab 下载 arm gnu这类问题本质上是在构建 ARM 相关的交叉编译工具链。GitLab Runner 可以注册成带标签的 ARM 机器然后在 .gitlab-ci.yml 里build-arm: stage: build tags: - arm-runner script: - make ARCHarm CROSS_COMPILEaarch64-linux-gnu-这样流水线就会自动调度到那台 ARM 机器上编译。如果没有专门的 ARM Runner也可以采用 Docker 模拟器方案不过速度会慢很多实际体验不佳。最稳妥的还是让 IT 部门拨一台 ARM 开发板或者 ARM 服务器专门当 Runner编译效率和稳定性都提升一个档次。8.3 SourceTree 连接 GitLabWindows 上用 SourceTree 连接局域网 GitLab 的场景也挺常见。SourceTree 本身支持 SSH key只需要在 Tools - Options - SSH 里把 SSH Client Configuration 的密钥路径指向本机生成的 id_ed25519第一次拉取时让它加载即可。如果连接的是 2222 端口同样需要额外指定选项在克隆对话框里填入完整 SSH URLssh://git192.168.1.10:2222/group/project.gitSourceTree 会自己识别。9. 我对 GitLab 的整体体会用 GitLab 这几年最大的感受是它跟 GitHub 的免费开放气质不同GitLab 更偏企业的私有化基建。不管是部署、权限、CI/CD还是 API、Wiki、Issue 追踪、Package Registry它几乎把 DevSecOps 链条上的每一环都占了。对个人开发者来说就算只有一台 8G 内存的服务器也完全能把它变成一个全功能的研发中台。我也理解为什么很多人在第一次使用时会觉得它笨重——组件多、配置项多、新手不友好。但一旦你理解了它背后的设计逻辑比如 SSH 就是为了免密推送、CI/CD 配置文件就是为了把构建流程固化在仓库里、Token 就是为了安全地让工具接入 API整个 GitLab 就变得非常顺手。如果你现在正准备从 GitHub 切回 GitLab 自托管或者公司正计划在内网自建代码平台我的建议是先别一上来就堆最强的 Runner、最好的机器先用 Docker 在自己的笔记本或一台低配服务器上把基本流程跑通注册一两个项目走一遍创建项目-拉代码-改代码-推送-触发流水线的完整链路然后再慢慢叠加权限、加固、监控这些高级能力。这样即使踩坑也能快速定位问题不至于在一开始就陷入组件太多、无从下手的状况。最后分享一个小习惯我每天下班前都会随手看一眼 GitLab 的流水线状态和 Merge Request 列表发现有挂掉的流水线就直接在手机上查看日志、重新触发。这个习惯让我能第一时间发现代码问题避免第二天到公司才被同事提醒昨天流水线挂了。这个小操作对团队协作的帮助比想象中大得多。
返回列表