部署GitLab代码托管平台

更新时间:

GitLab是一个基于Git的代码托管和协作平台,提供了从代码管理到持续集成/持续部署(CI/CD)的全方位 DevOps功能。本文为您介绍如何在Linux系统的ECS实例上部署GitLab,搭建属于您自己的代码托管平台。

准备工作

请确保您已创建一台ECS实例,并且ECS实例必须满足以下条件:

安装GitLab

GitLab版本包括企业版(EE)、社区版(CE)和极狐版(JH)。极狐GitLab(极狐版JH)是在中国大陆和港澳地区发行的企业级GitLab版本,极狐GitLab的服务器都在国内,网络访问速度更快。极狐版和社区版的对比和说明请参见is-it-any-goodwhy-jh

方式一:使用安装包

社区版本和极狐版本在安装命令和支持的操作系统上存在差异。

GitLab社区版

  • Alibaba Cloud Linux 3使用安装包方式安装时,仅支持安装极狐GitLab。如果需要在Alibaba Cloud Linux 3安装GitLab社区版,请使用Docker镜像方式。

CentOS 7.x

  1. 远程连接需要安装GitLab的ECS实例。

    具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 添加GitLab包仓库。

    curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
  3. 安装GitLab所需的依赖包。

    sudo yum install -y curl python3-policycoreutils openssh-server
  4. 安装GitLab社区版。

    sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> sudo yum install -y gitlab-ce

    <GitLab服务器的公网IP地址>请替换成安装GitLab的ECS实例公网IP地址

    重要

    低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述

    当出现类似如下回显信息,表示GitLab已经安装成功。

    image

Ubuntu

  1. 远程连接需要安装GitLab的ECS实例。

    具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 安装GitLab所需的依赖包。

    sudo apt-get update
    sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
  3. 添加GitLab软件包仓库。

    sudo curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

    说明

    由于网络原因,可能会出现无法添加GitLab软件源镜像的问题,建议您多尝试几次。

    当出现类似如下回显信息,表示GitLab软件包仓库已安装。

    image

  4. 刷新软件包列表。

    sudo apt-get update
  5. 安装GitLab。

    sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> apt-get install -y gitlab-ce

    <GitLab服务器的公网IP地址>请替换成安装GitLab的ECS实例更换公网IP地址

    重要

    低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述

    当出现类似如下回显信息,表示GitLab已经安装成功。

    image

极狐GitLab

Alibaba Cloud Linux 3/CentOS 7.x

  1. 远程连接需要安装GitLab的ECS实例。

    具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 安装GitLab所需的依赖包。

    sudo yum install -y curl python3-policycoreutils openssh-server
  3. 添加GitLab软件包仓库。

    curl -fsSL https://get.gitlab.cn | sudo /bin/bash
    说明

    由于网络原因,可能会出现无法添加GitLab软件源镜像的问题,建议您多尝试几次。

    当出现类似如下回显信息,表示GitLab软件包仓库已安装。

    image.png

  4. 安装GitLab。

    sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> yum install -y gitlab-jh

    <GitLab服务器的公网IP地址>请替换成安装GitLab的实例公网IP地址。

    重要

    低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述

    当出现类似如下回显信息,表示GitLab已经安装成功。

    image.png

Ubuntu

  1. 远程连接需要安装GitLab的ECS实例。

    具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 安装GitLab所需的依赖包。

    sudo apt-get update
    sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
  3. 配置安装极狐GitLab的软件源镜像。

    curl -L get.gitlab.cn | bash

    image

  4. 安装GitLab。

    sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> apt-get install -y gitlab-jh

    <GitLab服务器的公网IP地址>请替换成安装GitLab的实例公网IP地址,示例命令如下:

    sudo EXTERNAL_URL=101.132.XX.XX apt-get install -y gitlab-jh
    重要

    低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述

    当出现类似如下回显信息,表示GitLab已经安装成功。

    image.png

方式二:使用Docker镜像

使用Docker镜像方式安装

  1. 远程连接需要安装GitLab的ECS实例。

    具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 安装Docker。具体操作,请参见安装Docker

  3. 创建Docker容器的挂载数据目录,该目录会作为GitLab配置、日志和数据文件所在的目录。

    sudo mkdir -p /srv/gitlab 
  4. 设置环境变量$GITLAB_HOME

    export GITLAB_HOME=/srv/gitlab
  5. 执行如下命令,安装GitLab容器镜像。

    重要

    由于运营商网络原因,会导致您拉取Docker Hub镜像变慢,甚至下载失败。您可以使用阿里云容器镜像服务ACR提供的官方镜像加速器,加速官方镜像的下载。具体操作,请参见官方镜像加速

    GitLab社区版

    sudo docker run --detach \
      --hostname gitlab.example.com \
      --publish 443:443 --publish 80:80 --publish 2222: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-ce:latest

    容器参数

    主机参数说明

    hostname

    指定的主机名,建议修改为当前ECS实例的公网IP地址。

    publish 443:443

    将主机的443端口映射到容器的443端口,使用HTTPS访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,如publish 8443:443

    说明

    如替换成非标端口,需要在安全组中添加开放对应端口的入方向规则例如8443,请参见添加安全组规则

    publish 80:80

    将主机的80端口映射到容器的80端口,使用HTTP访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,例如publish 8080:80

    说明

    如替换成非标端口,需要在安全组中添加开放对应端口的入方向规则例如8080,请参见添加安全组规则

    publish 2222:22

    将主机的2222端口映射到容器的22端口,使用Git操作进行代码克隆、推送和拉取操作,需要使用SSH服务。

    说明

    ECS实例的路径和容器路径的对应关系如下:

    ECS路径

    容器路径

    说明

    $GITLAB_HOME/data

    /var/opt/gitlab

    存储应用程序数据。

    $GITLAB_HOME/logs

    /var/log/gitlab

    存储GitLab配置文件。

    $GITLAB_HOME/config

    /etc/gitlab

    存储GitLab配置文件。

    极狐GitLab

    sudo docker run --detach \
      --hostname gitlab.example.com \
      --publish 443:443 --publish 80:80 --publish 2222: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 \
      registry.gitlab.cn/omnibus/gitlab-jh:latest

    容器参数

    主机参数说明

    hostname

    指定的主机名,建议修改为当前ECS实例的公网IP地址。

    publish 443:443

    将主机的443端口映射到容器的443端口,使用HTTPS访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,如publish 8443:443

    说明

    如替换成非标端口,需要在安全组中添加开放对应端口的入方向规则例如8443,请参见添加安全组规则

    publish 80:80

    将主机的80端口映射到容器的80端口,使用HTTP访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,例如publish 8080:80

    说明

    如替换成非标端口,需要在安全组中添加开放对应端口的入方向规则例如8080,请参见添加安全组规则

    publish 2222:22

    将主机的2222端口映射到容器的22端口,使用Git操作进行代码克隆、推送和拉取操作,需要使用SSH服务。

    说明

    ECS实例的路径和容器路径的对应关系如下:

    ECS路径

    容器路径

    说明

    $GITLAB_HOME/data

    /var/opt/gitlab

    存储应用程序数据。

    $GITLAB_HOME/logs

    /var/log/gitlab

    存储GitLab配置文件。

    $GITLAB_HOME/config

    /etc/gitlab

    存储GitLab配置文件。

  6. 查看容器状态。

    sudo docker ps -a

    当容器状态为healthy时,说明GitLab容器已经正常启动。

    image.png

方式三:使用ECS扩展程序

ECS扩展程序是用于增强和扩展ECS实例功能的插件。Alibaba Cloud Linux 3系统会安装极狐GitLab,其他系统会安装GitLab社区版。

ECS扩展程序

扩展程序的安装步骤请参见OOS扩展程序,支持的系统版本请参见控制台界面。Alibaba Cloud Linux 3系统会安装极狐GitLab,其他系统会安装GitLab社区版。

image

进入GitLab管理页面

  1. 在浏览器输入网址。访问网址:http://${ECS的公网IP}

    重要

    如果使用Docker镜像方式安装,并将HTTP的默认端口80映射成非标准端口,请在访问链接后添加该端口号。

  2. 首次登录使用用户名root,通过如下方式获取密码。

    获取GitLab的登录密码。在ECS实例执行以下命令:

    • Linux安装包方式:sudo cat /etc/gitlab/initial_root_password

    • Docker安装方式:sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

    回显信息类似如下所示,您可以在Password后获取GitLab的初始登录密码。

    image.png

    重要

    出于安全原因,24小时后该文件会被自动删除。建议您安装成功首次登录之后,修改GitLab的初始密码,操作步骤参见reset_user_password

    asda5

  3. 进入Admin页面。

    image

  4. Users>Pending approval页面审批新用户的申请。其他操作例如管理项目、管理用户等,请参见admin_area

    image

说明

本示例介绍将文件上传到GitLab仓库的步骤。如果您想了解更多的GitLab操作,例如GitLab常用命令、数据备份、配置选项、用户管理、与其他服务集成、故障排除等,请参见极狐GitLabGitLab社区版

注册用户并设置免密访问

  1. 访问GitLab页面。单击Sign in按钮下的Register now,创建一个新用户。等待GitLab管理员通过申请后,使用新创建的用户登录GitLab。

  2. 在本地生成密钥对文件。

    ssh-keygen

    生成密钥对的过程中,系统会提示输入密钥对存放目录(默认为当前用户目录下的.ssh/id_rsa,例如/home/test/.ssh/id_rsa)和密钥对密码,您可以手动输入,也可以按Enter保持默认。

    回显信息类似如下所示。

    image.png

  3. 查看并复制公钥文件id_rsa.pub中的内容,便于后续步骤使用。

    cat ~/.ssh/id_rsa.pub

    回显信息类似如下所示。

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQVwWjF3KXmI549jDI0fuCgl+syJjjn55iMUDRRiCd/B+9TwUda3l9WXH5i7RU53QGRCsDVFZxixLOlmXr9E3VSqkf8xXBnHs/5E2z5PIOCN0nxfB9xeA1db/QxPwK4gkHisep+eNHRn9x+DpCYDoSoYQN0nBg+H3uqfOqL42mJ+tqSfkyqbhjBf1kjtDTlBfVCWtI0siu7owm+c65+8KNyPlj5/0AyJ4Aqk1OX2jv+YE4nTipucn7rHwWuowasPU86l+uBsLNwOSb+H7loJvQyhEINX2FS1KnpRU+ld20t07n+N3ErfX5xBAGfxXpoN9BKKSP+RT7rvTeXTVE**** test@iZuf63zs0dn0qccsisy****
  4. 添加SSH key。将获取的公钥添加了GitLab账户中,以便进行免密码的身份验证。

    1. 单击页面右上角的头像,然后单击Edit profile

      image

    2. 在左侧导航栏,单击SSH Keys。将公钥文件id_rsa.pub中的内容粘贴到Key所在的文本框中,然后单击Add key

      image

    3. SSH Key添加完成后,如下图所示。sda

创建项目并托管代码

创建新项目

  1. 在GitLab的主页中,单击页面右侧的New Project按钮,然后单击Create blank project

    ada55

  2. 单击Create blank project,设置Project nameProject URL,然后单击页面底部的Create project。本文以mywork项目为例进行说明。

    image

  3. 回到项目页面,复制SSH克隆地址,该地址在进行克隆操作时需要使用。

    image

克隆远程仓库

  1. 在本地安装Git

    sudo yum install git
  2. 在本地配置使用Git仓库的人员信息。

    1. 配置使用Git仓库的用户名。

      git config --global user.name "testname" 
    2. 配置使用Git仓库的人员邮箱。

      git config --global user.email "abc@example.com" 
  3. 克隆已创建的项目到本地。

    1. 输入git clone并粘贴SSH克隆地址,Git会自动创建一个以仓库名称命名的文件夹并下载文件。

      git clone ${SSH URL}

      如果使用Docker镜像安装,需要在链接中添加ssh://和docker run命令中的映射端口,例如:

      重要

      如果不想修改SSH链接,需要修改gitlab_rails['gitlab_shell_ssh_port'] 参数,以便在GitLab页面中正确显示,请参见使用Docker方式启动时,提示22端口被占用

      git clone ssh://git@{IP域名}:{SSH端口}/root/mywork

      简单配置

    2. 进入到项目目录。

      cd mywork/ 
    3. 查看当前分支的名称,默认为主分支main

      git branch

新建分支并进行更改

在本地创建新的分支,便于更改文件。

  1. 新建一个分支example

     git checkout -b example     
  2. 新建需要上传到GitLab中的目标文件test.txt,并写入内容Hello world!

    echo "Hello world!" > test.txt

提交并推送更改

将新分支example推送到远程仓库进行保存。

  1. test.txt文件添加到暂存区。

    git add test.txt
  2. 确认变更的文件。

    git status

    获得以下输出:

    On branch example
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
  3. 提交暂存文件test.txt

    git commit -m "测试用"
  4. example分支目前只在本地可用。将分支推送到GitLab仓库,便于其他人访问。

    git push origin example
  5. 推送到GitLab仓库后,其他用户也可以查看新建的分支。

    image

合并更改

将本地example 分支的更改合并到主分支 main,然后将合并后的主分支 main推送到远程仓库。

  1. 切换到主分支main

    git checkout main
  2. 将新建分支example 合并到主分支main

    git merge example
  3. 将合并后的主分支推送到GitLab仓库。

    git push
  4. 变更已同步到GitLab仓库的主分支main中。

    image

    image

后续步骤

配置邮件通知

GitLab需要一个邮件传输代理来发送电子邮件通知,例如项目更新、密码重置等。SMTP服务通常使用服务器的25端口发送邮件,但基于安全考虑,ECS实例25端口默认受限,建议您使用SSL加密端口(通常是465端口)来对外发送邮件,常用端口的说明请参见常用端口。配置SMTP的步骤:

  1. 配置外部 SMTP 服务器

  2. 验证SMTP配置效果。

    1. 执行gitlab-rails console命令进入Rails控制台。

    2. 输入以下命令,发送测试电子邮件:

      Notify.test_email('destination_email@address.com', 'Message Subject', 'Message Body').deliver_now
    3. 在目标邮箱中查看测试邮件,或者在ECS实例中执行sudo tail -f /var/log/mail.log查看邮件的日志。

备份GitLab仓库的数据

解析GitLab网站域名

通过实例公网IP地址直接访问您的GitLab网站会降低服务端的安全性。如果您已有域名或者想为GitLab网站注册一个域名,可以参考以下步骤。

  1. 注册域名。

    具体操作,参见通用域名注册基本流程如何注册阿里云域名

  2. 备案域名。

    如果您的域名指向的网站托管在阿里云中国内地节点服务器,您需要进行备案。首次备案,请参见ICP备案流程,其他情况请参见ICP备案流程

  3. 解析域名。设置域名解析后,外部用户可通过域名访问GitLab网站。

    域名解析是使用域名访问您的网站的必备环节。具体操作,请参见新手引导

  4. 开启HTTPS加密访问。使用免费服务例如使用Let’s Encrypt免费的自动HTTPS,或者付费服务SSL证书快速上手

  5. 添加安全组规则:在ECS的安全组内,添加一条入方向规则,为了安全起见,建议只对授权的IP地址开放端口。

    • 安装包或扩展程序方式:443(HTTPS)端口。

    • Docker Engine方式:对应于docker run命令中设置的主机HTTPS端口。

  6. 修改gitlab.rb中的external_url参数,配置完成后如下图所示。

常见问题

服务器卡顿、无法远程连接

  • 低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述

  • 如果无法远程连接服务器,可以使用VNC登录实例,然后进行配置SWAP、优化Sidekiq等操作,具体步骤参见memory_constrained_envs

  • 监控ECS实例的vCPU使用率、网络流量和磁盘I/O的操作步骤,请参见查看实例监控信息

使用Docker方式启动时,提示22端口被占用

ECS实例默认启动SSH服务,会占用22(SSH)端口。使用Docker镜像方式安装时,需要将主机的22端口映射成其他端口,并修改gitlab_rails['gitlab_shell_ssh_port'] 参数:

  1. 在启动Docker时指定非标端口,例如publish 2222:22

  2. 编辑GitLab配置文件。

    1. 执行sudo docker exec -it gitlab /bin/bash,进入会话。

    2. 编辑文件/etc/gitlab/gitlab.rb

    3. 设置gitlab_rails['gitlab_shell_ssh_port'] = 2222

    4. 执行gitlab-ctl reconfigure,重新配置GitLab。

  3. 打开项目页面,验证配置效果。

    image