# 环境配置
两台 linux 服务器(Ubuntu 系统),一台搭建 Gitlab 服务端,另一台配置 Gitlab runner
# Gitlab 下载安装
采用 Docker 的形式进行安装,官方文档 https://docs.gitlab.com/ee/install/docker.html
# Ubuntu 安装 Docker
| 1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun | 
# 下载配置 Gitlab 镜像
- 
设置环境变量 1 export GITLAB_HOME=/srv/gitlab 
- 
下载安装 Docker 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10sudo docker run --detach \ 
 --hostname gitlab.example.com \
 --publish 8443:443 --publish 8080:80 --publish 8022: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 \
 gitlab/gitlab-ee:latest- 
hostname主机名,随便设置
- 
publishDocker 和宿主机之间的端口映射,8080:80表示宿主机的 8080 端口映射到容器的 80 端口,此时访问宿主机的 8080 端口即可访问 nginx 的默认页面
- 
name容器名
- 
restart alwaysDocker 重启时,容器自动重启
- 
shm-size共享内存大小
 扩展: Nginx 是什么? 参考文章 https://zhuanlan.zhihu.com/p/34943332 Nginx 是一个轻量级的反向代理服务器。 用户=> vpn (正向代理) =>服务器服务器=> nginx (反向代理) =>用户启动 Nginx 服务后,就相当于在 80 端口启动了 Socket 服务进行监听,如下图所示 ![]()  
- 
# 修改镜像 gitlab  的配置
- 
进入容器 1 docker exec -it gitlab /bin/bash 
- 
修改配置文件 配置文件 /etc/gitlab/gitlab.rb和/var/opt/gitlab/gitlab-rails/etc/gitlab.yml其中 gitlab.yml由gitlab-ctl管理,通过编辑/etc/gitlab/gitlab.rb,然后运行gitlab-ctl reconfigure会自动更新gitlab.yml。因此,一般不修改gitlab.yml文件- 
修改配置 1 vi /etc/gitlab/gitlab.rb 
- 
在公网 IP 访问 GitLab tips: 在 vi下通过/external_url快速查找1 external_url "http://your_ip_or_domain:8080" 如果 nginx['listen_port']没有特殊指定,其会从external_url拉取
- 
设置 shell 端口 1 gitlab_rails['gitlab_shell_ssh_port'] = 8022 
- 
重新配置 GitLab 1 gitlab-ctl reconfigure 实测结果 ![]()  这里的密码在 /etc/gitlab/initial_root_password中,这个文件初次配置后 24h 会自动删除。
- 
修改密码 (忘记密码的情况下) 1 
 2
 3
 4进入gitlab 容器 
 docker exec -it gitlab /bin/bash
 修改密码,这里可能会等很久,耐心一点
 gitlab-rake "gitlab:password:reset[root]”
 
- 
# 配置优化
GitLab 非常吃内存,我刚开始搭建,服务器疯狂卡死,网页 502。建议配置的服务器内存在 4G 以上
# 修改 gitlab.rb  中的配置
参考 https://www.dongchuanmin.com/operate/3240.html
| 1 | puma['worker_timeout'] = 30 | 
官方推荐的优化配置 https://docs.gitlab.cn/omnibus/settings/memory_constrained_envs.html
修改完成之后,重启配置
| 1 | gitlab-ctl reconfigure | 
- 
启动 swap 分区 物理内存 + swap(交换空间) = 虚拟内存 swap 分区,即交换空间,可以是磁盘的一个分区,也可以是一个文件。作用就是将一部分内存空间复制到硬盘空间中,释放这部分内存。某种程度而言,扩大了可用的内存空间,但与硬盘的交换必然带来性能的下降。 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29查看swap分区是否启动 
 cat /proc/swaps
 创建swap,dd device driver,用于读取文件中内容,并复制到指定位置
 dd if=/dev/zero of=/data/swap bs=512 count=8388616
 if 输入文件 of 输出文件 /dev/zero 输出恒为0的设备文件 bs bytes count 块数
 swap文件大小为 bs * counnt = 4294971392(4G);
 通过mkswap命令将上面新建出的文件做成swap分区
 mkswap /data/swap
 4.查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成60。这个参数为换出运行时内存的相对权重,内存超过 40% 开始使用swap
 查看内核参数vm.swappiness 数值,代表换出运行时内存的相对权重
 cat /proc/sys/vm/swappiness
 设置为60,即当内存超过 100-60 = 40%,开始使用swap
 永久修改需编辑/etc/sysctl.conf文件
 sysctl -w vm.swappiness=60
 启用分区
 swapon /data/swap
 在/etc/fstab文件中记录文件的名字,使系统重启后,swap依然有效
 echo “/data/swap swap swap defaults 0 0” >> /etc/fstab
 查看确认
 cat /proc/swaps
 重启gitlab
- 
释放 buffer/cache 参考文章 https://zhuanlan.zhihu.com/p/539553217 程序运行一段时间后,linux 会将暂时不用的内存转换为 buffer/cache,通过 free命令可以查看系统内存使用情况1 free -m -h 输出结果 1 
 2
 3
 4total used free shared buff/cache available 
 Mem: 7.8Gi 3.2Gi 3.5Gi 50Mi 1.1Gi 4.3Gi
 Swap: 0B 0B 0B我们可以手动释放 buff/cache 1 
 2
 3
 4将在内存中的数据写入磁盘,防止丢失 
 sync
 释放内存
 echo 3 > /proc/sys/vm/drop_caches内存的管理方式在 /proc/sys/vm/ drop_chches文件中,其只包含一个数字,不同代号的含义如下所示1 
 2
 3
 40:0 是系统默认值,默认情况下表示不释放内存,由操作系统自动管理 
 1:释放页缓存
 2:释放dentries和inodes
 3:释放所有缓存Page Cache 的解释 https://blog.51cto.com/u_11389430/2535098 
# GitLab runner 配置
- 
官方文档: https://docs.gitlab.com/runner/install/ 建议使用 deb或rpm文件安装,简单快速
- 
另一处详细教学位置 GitLab 中打开一个项目 Settings => CI/CD => Runners => Expand => Specific runners => Show runner installation instructions 
- 
安装完成后,点击编辑小图标,✅ Run untagged jobs以运行没有设置 tag 的任务
# Q&A
- 启动之后 502
- 原因一: GitLab 反应慢,等待几分钟
- 原因二: 服务器端口占用,例如 80 端口,用  lsof -i tcp:80查看是否有其他服务。杀掉对应进程,或在gitlab.rb中修改端口号
- 原因三: 内存不足,优化配置或换用配置更高的服务器
 
你将看到大悲苦,并将在悲苦中领悟幸福。这就是我给你的赠言:到悲苦中去寻找幸福。努力干,不断地努力!
——《卡拉马佐夫兄弟》
 
 
