GitLab是一个基于Git的代码托管和协作平台,提供了从代码管理到持续集成/持续部署(CI/CD)的全方位 DevOps功能。本文为您介绍如何在Linux系统的ECS实例上部署GitLab,搭建属于您自己的代码托管平台。
准备工作
请确保您已创建一台ECS实例,并且ECS实例必须满足以下条件:
安装GitLab
GitLab版本包括企业版(EE)、社区版(CE)和极狐版(JH)。极狐GitLab(极狐版JH)是在中国大陆和港澳地区发行的企业级GitLab版本,极狐GitLab的服务器都在中国或中国内地,网络访问速度更快。极狐版和社区版的对比和说明请参见is-it-any-good和why-jh。
方式一:使用安装包
社区版本和极狐版本在安装命令和支持的操作系统上存在差异。
GitLab社区版
CentOS 7.x
远程连接需要安装GitLab的ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
添加GitLab包仓库。
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
安装GitLab所需的依赖包。
sudo yum install -y curl python3-policycoreutils openssh-server
安装GitLab社区版。
sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> sudo yum install -y gitlab-ce
<GitLab服务器的公网IP地址>
请替换成安装GitLab的ECS实例公网IP地址。
重要 低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述。
当出现类似如下回显信息,表示GitLab已经安装成功。
Ubuntu
远程连接需要安装GitLab的ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
安装GitLab所需的依赖包。
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
添加GitLab软件包仓库。
sudo curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
说明
由于网络原因,可能会出现无法添加GitLab软件源镜像的问题,建议您多尝试几次。
当出现类似如下回显信息,表示GitLab软件包仓库已安装。
刷新软件包列表。
sudo apt-get update
安装GitLab。
sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> apt-get install -y gitlab-ce
<GitLab服务器的公网IP地址>
请替换成安装GitLab的ECS实例更换公网IP地址。
重要
低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述。
当出现类似如下回显信息,表示GitLab已经安装成功。
极狐GitLab
Alibaba Cloud Linux 3/CentOS 7.x
远程连接需要安装GitLab的ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
安装GitLab所需的依赖包。
sudo yum install -y curl python3-policycoreutils openssh-server
添加GitLab软件包仓库。
curl -fsSL https://get.gitlab.cn | sudo /bin/bash
说明 由于网络原因,可能会出现无法添加GitLab软件源镜像的问题,建议您多尝试几次。
当出现类似如下回显信息,表示GitLab软件包仓库已安装。
安装GitLab。
sudo EXTERNAL_URL=<GitLab服务器的公网IP地址> yum install -y gitlab-jh
<GitLab服务器的公网IP地址>
请替换成安装GitLab的实例公网IP地址。
重要 低于4 vCPU、8 GiB会因规格过小,导致长时间处于Installing状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述。
当出现类似如下回显信息,表示GitLab已经安装成功。
Ubuntu
远程连接需要安装GitLab的ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
安装GitLab所需的依赖包。
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
配置安装极狐GitLab的软件源镜像。
curl -L get.gitlab.cn | bash
安装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已经安装成功。
方式二:使用Docker镜像
使用Docker镜像方式安装
远程连接需要安装GitLab的ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
安装Docker。具体操作,请参见安装Docker。
创建Docker容器的挂载数据目录,该目录会作为GitLab配置、日志和数据文件所在的目录。
sudo mkdir -p /srv/gitlab
设置环境变量$GITLAB_HOME
。
export GITLAB_HOME=/srv/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 \
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配置文件。 |
查看容器状态。
sudo docker ps -a
当容器状态为healthy时,说明GitLab容器已经正常启动。
进入GitLab管理页面
在浏览器输入网址。访问网址:http://${ECS的公网IP}
。
重要 如果使用Docker镜像方式安装,并将HTTP的默认端口80映射成非标准端口,请在访问链接后添加该端口号。
首次登录使用用户名root
,通过如下方式获取密码。
获取GitLab的登录密码。在ECS实例执行以下命令:
回显信息类似如下所示,您可以在Password
后获取GitLab的初始登录密码。
进入Admin页面。
在Users>Pending approval页面审批新用户的申请。其他操作例如管理项目、管理用户等,请参见admin_area。
说明 本示例介绍将文件上传到GitLab仓库的步骤。如果您想了解更多的GitLab操作,例如GitLab常用命令、数据备份、配置选项、用户管理、与其他服务集成、故障排除等,请参见极狐GitLab和GitLab社区版。
注册用户并设置免密访问
访问GitLab页面。单击Sign in按钮下的Register now,创建一个新用户。等待GitLab管理员通过申请后,使用新创建的用户登录GitLab。
在本地生成密钥对文件。
ssh-keygen
生成密钥对的过程中,系统会提示输入密钥对存放目录(默认为当前用户目录下的.ssh/id_rsa
,例如/home/test/.ssh/id_rsa
)和密钥对密码,您可以手动输入,也可以按Enter保持默认。
回显信息类似如下所示。
查看并复制公钥文件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****
添加SSH key。将获取的公钥添加了GitLab账户中,以便进行免密码的身份验证。
单击页面右上角的头像,然后单击Edit profile。
在左侧导航栏,单击SSH Keys。将公钥文件id_rsa.pub
中的内容粘贴到Key
所在的文本框中,然后单击Add key。
SSH Key添加完成后,如下图所示。
创建项目并托管代码
创建新项目
在GitLab的主页中,单击页面右侧的New Project按钮,然后单击Create blank project。
单击Create blank project,设置Project name和Project URL,然后单击页面底部的Create project。本文以mywork项目为例进行说明。
回到项目页面,复制SSH克隆地址,该地址在进行克隆操作时需要使用。
克隆远程仓库
在本地安装Git。
sudo yum install git
在本地配置使用Git仓库的人员信息。
配置使用Git仓库的用户名。
git config --global user.name "testname"
配置使用Git仓库的人员邮箱。
git config --global user.email "abc@example.com"
克隆已创建的项目到本地。
输入git clone
并粘贴SSH克隆地址,Git会自动创建一个以仓库名称命名的文件夹并下载文件。
git clone ${SSH URL}
如果使用Docker镜像安装,需要在链接中添加ssh://
和docker run命令中的映射端口,例如:
git clone ssh://git@{IP域名}:{SSH端口}/root/mywork
进入到项目目录。
cd mywork/
查看当前分支的名称,默认为主分支main
。
git branch
新建分支并进行更改
在本地创建新的分支,便于更改文件。
新建一个分支example
。
git checkout -b example
新建需要上传到GitLab中的目标文件test.txt
,并写入内容Hello world!
。
echo "Hello world!" > test.txt
提交并推送更改
将新分支example
推送到远程仓库进行保存。
将test.txt
文件添加到暂存区。
git add test.txt
确认变更的文件。
git status
获得以下输出:
On branch example
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
提交暂存文件test.txt
。
git commit -m "测试用"
example
分支目前只在本地可用。将分支推送到GitLab仓库,便于其他人访问。
git push origin example
推送到GitLab仓库后,其他用户也可以查看新建的分支。
合并更改
将本地example
分支的更改合并到主分支 main
,然后将合并后的主分支 main
推送到远程仓库。
切换到主分支main
。
git checkout main
将新建分支example
合并到主分支main
。
git merge example
将合并后的主分支推送到GitLab仓库。
git push
变更已同步到GitLab仓库的主分支main
中。
后续步骤
配置邮件通知
GitLab需要一个邮件传输代理来发送电子邮件通知,例如项目更新、密码重置等。SMTP服务通常使用服务器的25端口发送邮件,但基于安全考虑,ECS实例25端口默认受限,建议您使用SSL加密端口(通常是465端口)来对外发送邮件,常用端口的说明请参见常用端口。配置SMTP的步骤:
配置外部 SMTP 服务器。
验证SMTP配置效果。
执行gitlab-rails console
命令进入Rails控制台。
输入以下命令,发送测试电子邮件:
Notify.test_email('destination_email@address.com', 'Message Subject', 'Message Body').deliver_now
在目标邮箱中查看测试邮件,或者在ECS实例中执行sudo tail -f /var/log/mail.log
查看邮件的日志。
解析GitLab网站域名
通过实例公网IP地址直接访问您的GitLab网站会降低服务端的安全性。如果您已有域名或者想为GitLab网站注册一个域名,可以参考以下步骤。
注册域名。
具体操作,参见通用域名注册基本流程如何注册阿里云域名。
备案域名。
如果您的域名指向的网站托管在阿里云中国内地节点服务器,您需要进行备案。
解析域名。设置域名解析后,外部用户可通过域名访问GitLab网站。
域名解析是使用域名访问您的网站的必备环节。具体操作,请参见新手引导。
开启HTTPS加密访问。使用免费服务例如使用Let’s Encrypt免费的自动HTTPS,或者付费服务SSL证书快速上手。
添加安全组规则:在ECS的安全组内,添加一条入方向规则,为了安全起见,建议只对授权的IP地址开放端口。
修改gitlab.rb中的external_url参数,配置完成后如下图所示。
常见问题
使用Docker方式启动时,提示22端口被占用
ECS实例默认启动SSH服务,会占用22(SSH)端口。使用Docker镜像方式安装时,需要将主机的22端口映射成其他端口,并修改gitlab_rails['gitlab_shell_ssh_port']
参数:
在启动Docker时指定非标端口,例如publish 2222:22
。
编辑GitLab配置文件。
执行sudo docker exec -it gitlab /bin/bash
,进入会话。
编辑文件/etc/gitlab/gitlab.rb
。
设置gitlab_rails['gitlab_shell_ssh_port'] = 2222
。
执行gitlab-ctl reconfigure
,重新配置GitLab。
打开项目页面,验证配置效果。