本教程将讲解如何依托腾讯云主机(CVM),以Docker方式搭建Gitlab服务。具体将包括:Docker安装,Gitlab安装与配置,Gitlab的开发流程示例,以及基于Gitlab的持续集成(CI/CD)的介绍。
0x00 Gitlab简介
Gitlab(https://gitlab.com)是完整的一套DevOps工具,开发人员可以通过它方便地进行管理项目、源码管理、持续集成/部署、开发文档维护甚至安全监控等工作,而这些重要工作涉及了软件的整个开发周期。
Gitlab的代码提交模式完全兼容Git,而合作模式又类似Github,Gitlab中的Merge Request可以大致类比Github的Pull Request。这使得开发人员上手简易,几乎没有概念学习成本。
我们什么时候需要Gitlab(或类似的工具)?答案是项目的越早期越好。Gitlab最核心的功能是源码提交记录和持续集成,二者对于软件项目来说就像“账本”和“尺子”,其重要性不言而喻。对于开发者,可以方便地进行分布式协作,如分支特性开发等,进而提升效率、自信和成就感;对于项目管理者,便于分析追踪问题、进度衡量以及目标特性的规划。
Git提供整套的软件,它本质上是一个Ruby on Rails的WebApp(现在部分后台组件用Go实现)。在早期它的安装是相对繁琐的,因为它组件众多,比如涉及服务器、数据库、消息队列、日志管理等,虽然好用但是略有门槛。而随着Docke技术的普及,现在我们可以通过它官方提供的镜像轻松地实现安装配置并部署,下面我们将在腾讯云服务器CVM上从零搭建Gitlab服务,让我们准备开始吧~
0x01 准备工作
在开始安装Gitlab之前,我们需要准备一些初始环境,主要包括:云服务器 域名 证书 Nginx服务器安装。
云服务器:Gitlab官方建议不低于4GB内存,这里我们选用腾讯云服务器的S4.MEDIUM4(标准型S4,2核4GB)。
操作系统:这里选择CentOS-7.5,其他系统如Ubuntu等也完全没有问题,操作类似。
域名:可以在任何域名提供商(如腾讯云域名)购置,下文以master-cvm.yangyang.cloud举例。
然后我们将Web服务器和SSL证书均已安装好,可以通过类似如下的Nginx测试页面简单验证。
SSL证书的申请以及高级的Nginx安装参考上一篇:玩转CVM:Web服务搭建。
0x02 Docker安装
Docker作为容器管理的平台,早已在服务部署等领域应用得非常广泛。容器(Container)是轻量级的虚拟化方案,依托于overlayfs、Linux下的namespace、cgroups等OS级别的虚拟化技术,性能相比基于VM的虚拟化更加突出。但更重要的是,通过Docker安装和配置软件更加方便,因此我们需要先简单安装Docker。
这里我们以安装最新的docker-ce版本举例说明,如果安装ee版本大同小异。这里参考官方文档:https://docs.docker.com/install/linux/docker-ce/centos/
安装依赖和设置仓库源
代码语言:txt复制yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
安装docker-ce
我们的环境上,大致需要1分钟就可以了,腾讯云的网络总体感觉还不错。
代码语言:txt复制# 最新稳定版
yum install docker-ce docker-ce-cli containerd.io
# 或指定版本,如:
# yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
本文安装的版本为:docker-ce-18.09.6(当前最新)。
启动docker服务
代码语言:txt复制systemctl start docker
Docker服务验证
启动hello-world容器简单验证即可。
代码语言:txt复制docker run hello-world
确实,Docker的安装越来越方便了。
0x03 安装Gitlab
官方文档:https://docs.gitlab.com/omnibus/docker/
下载gitlab的docker镜像到本地
腾讯云上大概耗时大概2分半。
代码语言:txt复制# 最新稳定版
docker pull gitlab/gitlab-ce
# 或指定版本,如:
docker pull gitlab/gitlab-ce:11.11.2-ce.0
本文安装的版本为:gitlab-ce:11.11.2-ce.0(当前最新)。
启动gitlab容器
代码语言:txt复制docker run --detach
--hostname master-cvm.yangyang.cloud
--env GITLAB_OMNIBUS_CONFIG="external_url 'https://master-cvm.yangyang.cloud/gitlab'; gitlab_rails['gitlab_shell_ssh_port'] = 55522;"
--publish 127.0.0.1:55523:443 --publish 55522:22
--name gitlab
--restart always
--volume /data/gitlab/config:/etc/gitlab
--volume /data/gitlab/logs:/var/log/gitlab
--volume /data/gitlab/data:/var/opt/gitlab
gitlab/gitlab-ce:latest
各个参数的意义:
detach:让容器在后台运行;
always:失败后总是重启;
env:传递环境变量,这里要特别注意,传递的external_url值要和域名及Nginx下路由保持一致;
publish:端口转发--pubish 55522:22即将容器的22端口转发至云服务器的55522端口;
volume:自定义容器的卷挂载目录,Gitlab需要三个:分别是配置config、日志logs和数据data;
容器启动后,我们可以通过docker ps
命令查看容器状态,如图:
可以看出:我们的gitlab容器已经正常运行了。
另外,还可以用docker logs来查看容器的启动日志用于排查潜在的错误。
代码语言:txt复制docker logs -f --tail 50 gitlab
Nginx设置
注意路径(location)和端口号(proxy_pass)的配置要和上面的docker run命令匹配。
代码语言:txt复制server {
listen 80;
server_name master-cvm.yangyang.cloud;
return 301 https://$host$request_uri;
}
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name master-cvm.yangyang.cloud;
ssl on;
ssl_certificate /etc/letsencrypt/live/master-cvm.yangyang.cloud/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/master-cvm.yangyang.cloud/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /gitlab/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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 $scheme;
proxy_http_version 1.1;
proxy_pass https://127.0.0.1:55523;
}
location / {
root /usr/share/nginx/html;
}
}
重启
代码语言:txt复制systemctl restart nginx.service
试试从浏览器访问吧~如:https://master-cvm.yangyang.cloud/gitlab/
这时将会出现重置root密码的界面,安装成功。
0x04 初始化及安装验证
Gitlab安装完成后,我们即可以在Web端操作使用了。首先是设置root密码,注意只有root用户才可以访问管理员面板,查看用户、项目等很多的全局配置。
创建用户
设置完root密码后会跳转到登录页面,虽然这里可以用root 刚设的密码直接登陆,但更推荐的是注册第一个用户,并以这个用户来进行日常的操作。
上传用户本地开发机的key
设置sshkey
同Github一致,用户通过ssh协议push代码,需要上传用户的ssh密钥。在开发上执行以下命令,并复制即可:
代码语言:txt复制ssh-keygen
cat ~/.ssh/id_rsa.pub
右上角用户头像->“Settings”->左边栏“SSH Keys”,管理添加密钥。
0x05 常见操作
创建项目、创建用户和组管理
创建项目组(可选)
Gitlab里,管理各个项目(Project)的名字空间为组(Group)和其嵌套的子组(Subgroup),可以简单理解为项目所在的不同“目录”。
Gitlab为每个用户创建一个默认的同名称的项目组,所以可以直接创建项目。
创建项目
这里就是熟悉的类似Github操作界面了:
因为之前已经上传过密钥,所以我们可以在本地通过SSH方式clone项目到本地
代码语言:txt复制git clone ssh://git@master-cvm.yangyang.cloud:55522/example-group/my-webapp.git
注意这里的url中会包含我门设置的ssh端口
clone代码时选择https协议也是支持的,不过要输入用户名和密码,不如用ssh方便。
0x06 CI及CI-Runner安装
Gitlab对CI(Continuous Integration/Deployment,即持续集成/部署)的支持是非常成熟的。个人认为比jenkins更加易理解易使用。所谓持续集成,就是在特定的时间点(如代码Merge时),在特定的机器上,做预先设定的任务(比如代码编译打包、自动化测试、发布等)。而执行任务的程序,就叫做Gitlab Runner,由它来执行任务的组件,而且它不一定运行在gitlab所在的主机上,只要可以网络联通可进行通信即可。
安装过程,这里参考官方文档:https://docs.gitlab.com/runner/install/linux-repository.html
Gitlab的CI-Runner的安装非常简单直接,只要三步就能开始后续使用(比如配置任务)了。
更新仓库源
代码语言:txt复制 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | bash
安装
代码语言:txt复制yum install gitlab-runner
注册
为什么要注册?其实就是让gitlab知道哪些机器上运行着runner。需要 gitlab的url和token。
在项目的“Settings” -> “CI/CD” -> “Runners”可以查到,复制即可,如图
我们直接用gitlab-runner register命令来注册即可。
executor种类根据需要选择,shell是比较常用的。
后续就可以在项目下的.gitlab-ci.yml中设置具体的CI任务,并在Gitlab-CI的Pipeline页面查看任务的执行结果。
0x07 bonus: 基于git/gitlab的开发流程
这里引用Gitlab的官网图片用来说明开发的workflow。
可以看到,Gitlab把针对合入发布主干前的分支代码进行的一系列工作划为CI流程,包括自动构建测试等;而合如主干后的自动化工作称为CD流程,包括部署到生产环境等。
实际的自动化部署要处理的问题通常比这张图复杂不少,我们可以进一步在项目的发展过程中亲身体验这个不断演进的过程。
至此,本教程也告一段落。相信跟到这里,你已经可以自行动手在CVM上搭建属于自己的Gitlab服务了,也为下一段旅程做足了准备。
一起来享受玩转CVM的乐趣吧~
Enjoy Yourself~
0x08 参考资料
https://cloud.tencent.com/developer/article/1429314
https://docs.docker.com/install/linux/docker-ce/centos/
https://hub.docker.com/r/gitlab/gitlab-ce/
https://docs.gitlab.com/omnibus/docker/
https://docs.gitlab.com/runner/install/linux-repository.html
https://docs.gitlab.com/runner/register/index.html