ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一文看懂Gitlab环境搭建及配置

一文看懂Gitlab环境搭建及配置 一文看懂Gitlab环境搭建及配置概述软件简介GitLab 是一个基于 Web 的 DevOps 全流程平台集成了代码托管、版本控制、CI/CD、项目管理、安全扫描等功能支持从代码提交到部署的端到端软件开发与协作。软件归属最初由乌克兰开发者 Dmitriy Zaporozhets 和荷兰企业家 Sytse “Sid” Sijbrandij 共同创立现在归属于GitLab Inc.产生时间2011年相关地址官网1 Gitlab环境部署本文采用docker容器搭建方式分别采用3种方式进行部署适用于不同的应用场景。1.1 不带ssl证书部署本地简单使用可采用这种方式。将如下内容复制到docker-compose.yml文件中:services:gitlab:image:gitlab/gitlab-ce:latestcontainer_name:gitlabrestart:alwayshostname:10.56.223.19privileged:true# 内存限制10人以内团队建议8g10~50人团队建议32g50人以上团队不限制[大约会占用40G内存]# mem_limit: 8g# memswap_limit: 8genvironment:GITLAB_OMNIBUS_CONFIG:|#external_url http://10.56.223.19 # 配置时区 gitlab_rails[time_zone] Asia/Shanghai # 邮件设置可选 # gitlab_rails[smtp_enable] true # gitlab_rails[smtp_address] smtp.gmail.com # gitlab_rails[smtp_port] 587 # gitlab_rails[smtp_user_name] your-emailgmail.com # gitlab_rails[smtp_password] your-password # gitlab_rails[smtp_domain] smtp.gmail.com # gitlab_rails[smtp_authentication] login # gitlab_rails[smtp_enable_starttls_auto] true # gitlab_rails[smtp_tls] false # gitlab_rails[gitlab_email_from] your-emailgmail.comports:-80:80-443:443-22:22volumes:-./config:/etc/gitlab-./logs:/var/log/gitlab-./data:/var/opt/gitlabshm_size:256mnetworks:-gitlab-networknetworks:gitlab-network:driver:bridge说明hostname为服务器IP地址、ports中的端口及networks中的网络名称等参数均可自定义。如下端口会被浏览器禁止不能使用具体可参考这里。邮箱配置需配合邮箱服务器使用可实现代码推送或重置密码等消息发送自建邮箱服务器可参考这里。external_url为界面下载代码的地址如果不设置hostname和external_url则会显示为容器的ID如下所示1.2 带ssl证书部署内网搭建Devops可采用这种方式配合本地搭建DNS服务器可实现内网域名访问。将如下内容复制到docker-compose.yml文件中:services: gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab restart: always hostname:10.56.223.19privileged:true# 内存限制10人以内团队建议8g10~50人团队建议32g50人以上团队不限制[大约会占用40G内存]# mem_limit: 8g# memswap_limit: 8genvironment: GITLAB_OMNIBUS_CONFIG:|# 使用 HTTPS 并指定端口external_urlhttps://10.56.223.19:4433# 关键修复强制 Nginx 监听 IPv4 nginx[listen_addresses][0.0.0.0]nginx[listen_port]443nginx[listen_https]true# 配置时区gitlab_rails[time_zone]Asia/Shanghai# SSL 证书配置nginx[ssl_certificate]/etc/gitlab/ssl/gitlab.pemnginx[ssl_certificate_key]/etc/gitlab/ssl/gitlab.key# 可选配置 SSL 协议和加密套件推荐nginx[ssl_protocols]TLSv1.2 TLSv1.3nginx[ssl_ciphers]ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384nginx[ssl_prefer_server_ciphers]off# 可选启用 HSTS强制 HTTPSnginx[hsts_max_age]31536000nginx[hsts_include_subdomains]false# 可选HTTP 自动跳转到 HTTPSnginx[redirect_http_to_https]true# Lets Encrypt 自动证书配置二选一# 如果想使用 Lets Encrypt 自动获取证书取消下面注释并注释掉上面的 ssl_certificate 配置# letsencrypt[enable] true# letsencrypt[contact_emails] [your-emailexample.com]# letsencrypt[auto_renew] true# letsencrypt[auto_renew_hour] 0# letsencrypt[auto_renew_minute] 30# letsencrypt[auto_renew_day_of_month] */7# 邮件设置可选# gitlab_rails[smtp_enable] true# gitlab_rails[smtp_address] smtp.gmail.com# gitlab_rails[smtp_port] 587# gitlab_rails[smtp_user_name] your-emailgmail.com# gitlab_rails[smtp_password] your-password# gitlab_rails[smtp_domain] smtp.gmail.com# gitlab_rails[smtp_authentication] login# gitlab_rails[smtp_enable_starttls_auto] true# gitlab_rails[smtp_tls] false# gitlab_rails[gitlab_email_from] your-emailgmail.comports: -10088:80-4433:443-20022:22volumes: -./config:/etc/gitlab-./logs:/var/log/gitlab-./data:/var/opt/gitlab-./ssl:/etc/gitlab/sslshm_size:256mnetworks: - gitlab-network networks: gitlab-network: driver: bridge该方法需要先创建ssl目录将ssl证书可使用自签名证书放入对应目录。1.3 内网穿透部署需要通过公网访问但公网服务器资源资源有限可采用这种方式。将如下内容复制到docker-compose.yml文件中services: gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab restart: always hostname:10.56.223.19privileged:true# 内存限制10人以内团队建议8g10~50人团队建议32g50人以上团队不限制[大约会占用40G内存]# mem_limit: 8g# memswap_limit: 8genvironment: GITLAB_OMNIBUS_CONFIG:|# 配置外网访问地址Git clone 等会显示这个地址external_urlhttps://xxx.xxx.com# 配置时区gitlab_rails[time_zone]Asia/Shanghai# 关键配置允许通过不同地址访问nginx[listen_port]80nginx[listen_https]false# 禁用自动重定向nginx[redirect_http_to_https]false# 信任来自反向代理的请求头nginx[real_ip_trusted_addresses][0.0.0.0/0]nginx[real_ip_header]X-Forwarded-Fornginx[real_ip_recursive]on# 邮件设置可选# gitlab_rails[smtp_enable] true# gitlab_rails[smtp_address] smtp.gmail.com# gitlab_rails[smtp_port] 587# gitlab_rails[smtp_user_name] your-emailgmail.com# gitlab_rails[smtp_password] your-password# gitlab_rails[smtp_domain] smtp.gmail.com# gitlab_rails[smtp_authentication] login# gitlab_rails[smtp_enable_starttls_auto] true# gitlab_rails[smtp_tls] false# gitlab_rails[gitlab_email_from] your-emailgmail.comports: -10088:80-20022:22volumes: -./config:/etc/gitlab-./logs:/var/log/gitlab-./data:/var/opt/gitlabshm_size:256mnetworks: - gitlab-network networks: gitlab-network: driver: bridge其中external_url为公网域名内网穿透方法可参考这里。在公网服务器上的web服务器添加代理配置以nginx为例可在nginx.conf中添加如下片段server { listen 443 ssl; server_name xxx.xxx.com; ssl_certificate /etc/nginx/ssl/server.pem; ssl_certificate_key /etc/nginx/ssl/server.key; location / { proxy_pass http://xxx.xxx.xxx.xxx:10088; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } }其中server_name需替换为实际公网域名proxy_pass需替换为实际公网服务器的ip和对应端口。2 Gitlab配置2.1 登录及密码修改在前面docker-compose.yml所在目录执行如下命令创建并启动容器docker-compose up-d等待容器状态健康后约4~5分钟即可登录登录界面如下所示登录用户名为root初始密码通过如下方式获取dockerexec-itgitlabgrepPassword:/etc/gitlab/initial_root_password其中容器名以实际的为准。登录成功后如下登录后参考如下方式修改密码2.2 设置语言及主题参照如下方式设置为中文没有实现100%翻译设置成功后如下设置模式、主题及语法高亮等设置成功后如下2.3 禁用用户注册为有效管控代码仓权限通常需要禁用用户注册功能由管理员分配账号及权限参考如下方式2.4 设置双重认证如需加强登录权限控制可参考如下方式设置所有用户登录需进行双重认证设置成功后所有用户登录时会有类似如下提示需在管理员设置后两天内完成双重认证设置。双重认证通常是在移动端如手机上安装一个具有认证功能的应用登录时系统会发送一个具有时效性的验证码给该应用通常有以下几种应用可供选择本文选择使用FreeOTP参考如下方式设置双重认证在手机上安装FreeOTP后扫描上面的二维码输入用户密码和FreeOTP上收到的验证码即可完成设置设置成功后如下这里会生成10个恢复码比如换了手机新手机没法接受验证码可使用恢复码代替验证码登录系统后用新手机上安装的FreeOTP重新扫码设置双重验证当然也可以提前把旧手机上FreeOTP的配置备份出来在新手机上导入配置也能正常接收验证码。双重认证设置成功后用户再次登录时输入用户名密码后会需要提供验证码如下所示找到这一行 /* That’s all, stop editing! Happy publishing. */在其前面添加如下内容// 支持反向代理if(isset($_SERVER[HTTP_X_FORWARDED_PROTO])$_SERVER[HTTP_X_FORWARDED_PROTO]https){$_SERVER[HTTPS]on;}// 强制设置站点URL(推荐在反向代理场景使用)define(WP_HOME,https://www.xxx.com);define(WP_SITEURL,https://www.xxx.com);注意其中的https://www.xxx.com需换为实际的域名2.5 设置访问令牌当启用双重认证后不能再通过用户名密码的方式调用Gitlab的API需要改成用户名访问令牌的方式参考如下方式添加令牌令牌名称根据用途自定义日期最长为1年根据实际情况勾选设置权限说明如下权限中文含义能做什么典型使用场景read_service_ping读取服务状态统计通过 API 获取 GitLab Service Ping 数据实例级统计运维监控、官方支持read_user读取用户信息获取用户名、公开邮箱、姓名等用户信息SSO、内部系统对接read_repository只读仓库git clone / pull 私有仓库服务器拉代码、CI 拉代码write_repository读写仓库git push、创建/修改提交CI 自动提交、版本发布read_virtual_registry只读容器镜像仓库docker pull 私有镜像部署服务器、K8swrite_virtual_registry读写容器镜像仓库docker push / delete 镜像CI 构建并推送镜像read_apiAPI 只读访问读取项目、Pipeline、Job、变量等自动化脚本、监控apiAPI 完全访问创建/修改项目、触发流水线、改变量运维自动化、管理工具self_rotate令牌自我轮换允许当前 Token 调用 API 更新自己安全轮换机制ai_featuresAI 功能访问访问 GitLab Duo AI 相关 APIAI 辅助开发create_runner创建 Runner注册/创建 GitLab RunnerCI 基础设施管理构建流水线通常选择read_api、read_repository、write_repository。3 Gitlab代码管理3.1 新建项目参考如下方式新建项目新建项目支持空白项目、从模板创建和导入项目3种方式这里以新建空白模板为例项目名称自定义URL中的群组可在左侧新增新建成功后如下3.2 设置SSH keys如需使用ssh认证替代用户名/密码方式拉取代码需要先在服务器上生成ssh密钥对然后将公钥添加到gitlab中具体参考如下这里以在linux服务器上操作为例windows上操作类似。首先在服务器上新建一个目录将该目录初始化为git仓库gitinit添加并执行脚本#!/bin/bashset-eKEY_NAME$1IP_OR_DOMAIN$2SSH_PORT$3REMOTE_NAME$4REMOTE_URL$5SSH_DIR$HOME/.sshKEY_FILE$SSH_DIR/$KEY_NAME# 参数检查if[[-z$KEY_NAME||-z$IP_OR_DOMAIN||-z$SSH_PORT||-z$REMOTE_NAME||-z$REMOTE_URL]];thenecho需在git仓库所在目录执行echo用法:$0key_name address port remote_name remote_ssh_urlecho参数说明: echo key_name生成ssh密钥对的名称自定义后续添加到gitlab代码仓的SSHkey默认显示该名称echo addressgitlab仓库所在服务器的IP地址或域名echo portgitlab使用的SSH端口echo remote_name远程代码仓的名称(通常为origin)echo remote_ssh_url远程代码仓的URL地址(项目里克隆代码的地址)echo示例:$0server_11 code.test.com 22 origin gitcode.test.com:tester/iot.gitexit1fi# 判断 $REMOTE_URL 格式并提取主机名if[[$REMOTE_URL~^git([^:]):.\.git$]];thenHOST_NAME${BASH_REMATCH[1]}elseecho错误: \$REMOTE_URL格式不正确请检查exit1fi# 确保 $HOME/.ssh 目录存在mkdir-p$SSH_DIRchmod700$SSH_DIR# 生成密钥对不设置密码if[[-f$KEY_FILE]];thenecho密钥文件$KEY_FILE已存在跳过生成。elsessh-keygen-ted25519-N-f$KEY_FILE-C$KEY_NAMEecho已生成密钥对:$KEY_FILE和${KEY_FILE}.pubfi# 确保 ~/.ssh/config 存在并添加 Host 配置CONFIG_FILE$SSH_DIR/configtouch$CONFIG_FILEchmod600$CONFIG_FILEifgrep-qHost$HOST_NAME$CONFIG_FILE;thenechoHost$HOST_NAME已在$CONFIG_FILE中存在跳过添加。elsecat$CONFIG_FILEEOF Host$HOST_NAMEHostName$IP_OR_DOMAINUser git Port$SSH_PORTIdentityFile$KEY_FILEIdentitiesOnly yes EOFecho已在$CONFIG_FILE中添加 Host$HOST_NAME配置fi# 配置远程仓库 SSH 地址ifgitremote|grep-qw$REMOTE_NAME;thengitremote set-url$REMOTE_NAME$REMOTE_URLecho已将远程仓库$REMOTE_NAME地址设置为$REMOTE_URLelsegitremoteadd$REMOTE_NAME$REMOTE_URLecho已添加远程仓库$REMOTE_NAME地址$REMOTE_URLfi# 打印公钥内容提示添加并测试 SSHechoecho请将以下公钥内容添加到远程仓库的 SSH Keys 中echo---------------------------------------------------cat${KEY_FILE}.pubecho---------------------------------------------------echoecho成功添加公钥后可执行echo ssh -T git$HOST_NAME测试 SSH 连接远程仓库$REMOTE_URL是否成功echo git push$REMOTE_NAME推送本地分支代码echo 若是首次推送则使用git push -u$REMOTE_NAME$current_branch$current_branch为本地当前分支能够自动在远端建立一个和本地当前分支同名的分支并建立跟踪关系脚本添加成功后如下脚本名称可自定义执行脚本不带参数可查看用法执行脚本./genSSHkey.sh server_1510.56.223.1520022origin git21e5dbd51d8d:root/iot_mqtt.git在gitlab中添加公钥参考如下方式添加公钥添加成功后如下公钥会存入authorized_keys中进入容器可以查看dockerexec-itgitlab /bin/bashcat/var/opt/gitlab/.ssh/authorized_keys客户端使用私钥进行登录时会根据私钥提取公钥发送给gitlab服务端服务端分别计算发来的公钥指纹与authorized_keys中存放的公钥指纹若匹配成功则可以登录同时也能知晓是那个用户在登录。测试连接远程仓库ssh-Tgit21e5dbd51d8d#若私钥未存放在默认路径~/.ssh下则需要添加-i参数显示指定私钥文件。可以看到远程仓库已通过ssh连接成功(首次连接需要将远程仓库添加为信任的主机列表)为避免每次推送都需要认证可缓存ssh密钥会话期间有效eval$(ssh-agent-s)ssh-add /root/.ssh/server_15#以实际密钥地址为准查看远程仓库gitremote-v3.3 配置用户提交信息gitconfig--globaluser.emailxxx163.com# 需替换为实际邮箱gitconfig--globaluser.namesimen# 需替换为实际用户名3.4 添加提交时的忽略跟踪项这里以history为后缀的文件为例echo*.history.gitignore3.5 代码拉取与推送3.5.1 代码拉取选择某个空目录将该目录初始化为git仓库gitinit添加并查看远程仓库地址gitremoteaddorigin gita79907fffb0e:tester/iot.git#添加远程仓库地址gitremote-v#查看远程仓库地址拉取对应分支代码gitpull origin master3.5.2 代码推送在服务器上推送rm-rfgenSSHkey.sh# 删除创建ssl证书脚本touchtest.txt# 新建测试文件gitadd.# 添加新文件gitcommit-m首次提交# 提交修改gitpush-uorigin master# 推送分支自动在远程仓库建立master分支并建立跟踪关系推送成功后到远程仓库查看master分支本地推送通常在linux服务器上修改代码不方便可参考这里远程连接服务器后在本地修改代码找到1.2.2节插件使用里的Remote-SSH插件远程连接成功后如下即可在本地推送和拉取代码3.6 合并分支通常代码都在开发分支进行维护版本迭代结束时需要合并到主干分支合并分支参考如下创建合并请求选择源分支和目标分支选择好对应分支后点击“比较分支并继续”填写合并请求参数根据实际情况填写合并标题、描述及指派合并请求审批人等注意去掉“接受合并请求时删除源分支”前面的勾选默认会勾选上然后点击“创建合并请求”。为避免忘记去掉勾选“接受合并请求时删除源分支”导致误删除源分支可以参考如下方式进行设置。另外Gitlab默认采用相对时间比如提交时间与合并时间默认显示大致时间为了便于查看精确时间可参考如下方式将“使用相对时间”前面的勾选去掉。审批合并请求根据实际情况进行合并审批若需多人审批则可点击批准等所有批注通过后点击合并若仅需单人审批可直接点击合并若审批不通过则可以点击下方的“关闭合并请求”合并通过后可以在“已合并”中查看合并详情4 用户及成员管理4.1 系统用户进入用户管理页面可以看到如下几个用户除管理员以外还有3个内置机器人账户3个内置机器人账户对比如下对比项GitLab Alert BotGitLab DuoGitLab Support Bot邮箱地址alerta79907fffb0egitlab-duoa79907fffb0esupporta79907fffb0e主要用途告警通知和监控AI 智能助手服务台和工单管理核心功能• Prometheus 告警• 系统性能监控• 安全事件通知• AI 代码建议• 智能代码生成• MR 摘要• 处理支持邮件• 创建工单 Issue• 自动分配任务典型场景CI/CD 流水线失败告警代码编辑器智能提示用户发邮件报告 Bug4.2 添加用户参考如下方式添加用户添加成功后如下4.3 添加成员可以针对某个群组或某个项目添加成员最大角色和访问到期日期根据实际情况选择访问到期日期若不选择表示永久有效。若针对某个群组添加成员则该群组下的所有项目均会集成该成员。添加群组成员参考如下方式各角色权限对比如下角色英文名称权限级别主要权限典型用途能否推送代码能否合并 MR能否管理项目访客Guest最低查看 Issue评论 Issue查看公开内容外部协作者、临时查看者否否否计划者Reporter低查看代码下载项目创建 Issue查看 CI/CD产品经理、测试人员、项目管理否否否报告者Developer中推送代码创建分支创建 MR管理 Issue开发人员最常用是否否开发者Developer中同上与报告者相同开发人员是否否维护者Maintainer高合并 MR保护分支添加成员管理 CI/CD团队 Leader、核心开发是是部分所有者Owner最高删除项目转移项目管理所有设置管理所有成员项目负责人、管理员是是完全添加成功后如下选择该群组下某个项目查看成员可以看到继承了群组成员如下所示添加项目成员参考如下方式添加成功后如下5 总结本文主要讲解了使用docker容器部署Gitlab的方法并给出了常规配置及代码拉取、推送的示例。
返回列表