# 环境配置

两台 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
    10
    sudo 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 主机名,随便设置

    • publish Docker 和宿主机之间的端口映射, 8080:80 表示宿主机的 8080 端口映射到容器的 80 端口,此时访问宿主机的 8080 端口即可访问 nginx 的默认页面

    • name 容器名

    • restart always Docker 重启时,容器自动重启

    • 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.ymlgitlab-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
2
3
4
5
6
7
8
9
puma['worker_timeout'] = 30
gitlab_rails['time_zone'] = 'Asia/Shanghai'
puma['worker_processes'] = 2
postgresql['shared_buffers'] = "256MB"
sidekiq['max_concurrency'] = 8
postgresql['max_worker_processes'] = 4
puma['per_worker_max_memory_mb'] = 600
prometheus_monitoring['enable'] = false
sidekiq['min_concurrency'] = 8

官方推荐的优化配置 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
    4
                  total        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
    4
    0:0 是系统默认值,默认情况下表示不释放内存,由操作系统自动管理
    1:释放页缓存
    2:释放dentries和inodes
    3:释放所有缓存

    Page Cache 的解释 https://blog.51cto.com/u_11389430/2535098

# GitLab runner 配置

  • 官方文档: https://docs.gitlab.com/runner/install/

    建议使用 debrpm 文件安装,简单快速

  • 另一处详细教学位置 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 中修改端口号
    • 原因三: 内存不足,优化配置或换用配置更高的服务器

你将看到大悲苦,并将在悲苦中领悟幸福。这就是我给你的赠言:到悲苦中去寻找幸福。努力干,不断地努力!

——《卡拉马佐夫兄弟》

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

chaihj15 微信支付

微信支付

chaihj15 支付宝

支付宝