共计 8477 个字符,预计需要花费 22 分钟才能阅读完成。
1. 阅读本文基础
- 熟悉 git 使用
- 熟悉 docker
2. GitLab 简介
2.1. 概述
- GitLab 是一个用于仓库管理系统的开源项目。使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。Github 是公共的 git 仓库,而 Gitlab 适合于搭建企业内部私有 git 仓库
- 官网:
https://about.gitlab.com/ https://github.com/gitlabhq/gitlabhq
- 截止本文创建时间,GitLab 最新版本为 v7.4.3
2.2. 架构
- 示意图:
2.3. 组件
- 前端:Nginx,用于页面及 Git tool 走 http 或 https 协议
- 后端:Gitlab 服务,采用 Ruby on Rails 框架,通过 unicorn 实现后台服务及多进程
- SSHD:开启 sshd 服务,用于用户上传 ssh key 进行版本克隆及上传。注:用户上传的 ssh key 是保存到 git 账户中
- 数据库:目前仅支持 MySQL 和 PostgreSQL
- Redis:用于存储用户 session 和任务,任务包括新建仓库、发送邮件等等
- Sidekiq:Rails 框架自带的,订阅 redis 中的任务并执行
3. GitLab 安装部署
3.1. 官方支持的方式
- 包含一切的 RPM 包:https://about.gitlab.com/downloads/(官方推荐)
个人不推荐,因为 RPM 包容量太大,200 多 M,适合于 Linux 初学者,未尝试过
- 手动安装:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md(深入了解)
可以最大程度了解 GitLab 的组件之间架构,但对于入门并不适合
- 第三方 docker 镜像:https://github.com/sameersbn/docker-gitlab(笔者推荐)
镜像可以快速实现部署并使用,适合于熟悉 Docker 的人使用,入门很快。而且使用 Docker 镜像就使用户不用过多了解内部细节,通过启动容器带上环境变量参数即可实现 GitLab 参数的配置
3.2. 采用 docker 镜像安装 GitLab
3.2.1. 简介
- 官网:https://github.com/sameersbn/docker-gitlab
- 7.4.3 之前版本,镜像里包含所有组件,7.4.3 版本镜像里只包含核心组件:nginx、sshd、ruby on rails、sidekiq
3.2.2. 架构图
3.2.3. 下载镜像
- docker pull sameersbn/gitlab:7.4.3 # 下载 gitlab 镜像
- docker pull sameersbn/mysql:latest # 下载 gitlab 所用到的 mysql 镜像
- docker pull sameersbn/redis:latest # 下载 gitlab 所用到的 redis 镜像
3.2.4. 安装
3.2.4.1. 启动 redis
- 命令:
docker run \ --name=gitlab_redis \ -tid \ sameersbn/redis:latest
3.2.4.2. 启动 mysql
- mkdir -p /opt/gitlab/mysql
- 命令:
docker run \ --name=gitlab_mysql \ -tid \ -e 'DB_NAME=gitlabhq_production' \ -e 'DB_USER=gitlab' \ -e 'DB_PASS=password' \ -v /opt/gitlab/mysql:/var/lib/mysql \ sameersbn/mysql:latest
3.2.4.3. 启动 gitlab
- mkdir -p /opt/gitlab/data /opt/gitlab/log
- 命令:
docker run \ --name='gitlab' \ -itd \ --link gitlab_mysql:mysql \ --link gitlab_redis:redisio \ -e 'GITLAB_PORT=80' \ -e 'GITLAB_SSH_PORT=22' \ -e 'GITLAB_HOST=gitlab.example.com' \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3 上述是开启一个基本 gitlab。完整(包含LDAP、EMAIL):docker run \ --name='gitlab' \ -itd \ --link gitlab_mysql:mysql \ --link gitlab_redis:redisio \ -e 'GITLAB_PORT=80' \ -e 'GITLAB_SSH_PORT=22' \ -e 'LDAP_ENABLED=true' \ -e 'LDAP_HOST=192.168.1.1' \ -e 'LDAP_PORT=389' \ -e 'LDAP_UID=sAMAccountName' \ -e 'LDAP_METHOD=plain' \ -e 'LDAP_BIND_DN=test@example.com' \ -e 'LDAP_PASS=passwd' \ -e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' \ -e 'LDAP_ACTIVE_DIRECTORY=true' \ -e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' \ -e 'GITLAB_HOST=gitlab.example.com' \ -e 'SMTP_ENABLED=true' \ -e 'SMTP_DOMAIN=example.com' \ -e 'SMTP_HOST=192.168.1.2' \ -e 'SMTP_PORT=25' \ -e 'SMTP_STARTTLS=false' \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3
这一步骤会耗时几分钟,因为这一步会做一些初始化操作,例如导入数据表结构等。可以通过 docker logs gitlab 来查看安装过程。同理,mysql、redis 容器也可以通过 docker logs gitlab_mysql 和 docker logs gitlab_redis 来查看启动信息。
注意:上面创建的 3 个容器必须位于同一台宿主上,因为–link gitlab_mysql:mysql –link gitlab_redis:redisio 就是将同个宿主上的容器做链接
- 当然,redis 和 mysql 也支持使用 ip+ 端口,不用–link,带上环境变量即可,方法是:
完整:docker run \ --name='gitlab' \ -itd \ --net=none \ --hostname='gitlab.example.com' \ -e 'DB_TYPE=mysql' \ -e 'DB_HOST=192.168.3.1' \ -e 'DB_PORT=3356' \ -e 'DB_NAME=gitlabhq_production' \ -e 'DB_USER=gitlab' \ -e 'DB_PASS=passwd' \ -e 'REDIS_HOST=192.168.3.2' \ -e 'REDIS_PORT=6402' \ -e 'UNICORN_WORKERS=20' \ -e 'GITLAB_PORT=80' \ -e 'GITLAB_SSH_PORT=22' \ -e 'LDAP_ENABLED=true' \ -e 'LDAP_HOST=192.168.3.3' \ -e 'LDAP_PORT=389' \ -e 'LDAP_UID=sAMAccountName' \ -e 'LDAP_METHOD=plain' \ -e 'LDAP_BIND_DN=test@example.com' \ -e 'LDAP_PASS=passwd' \ -e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' \ -e 'LDAP_ACTIVE_DIRECTORY=true' \ -e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' \ -e 'GITLAB_HOST=gitlab.example.com' \ -e 'SMTP_ENABLED=true' \ -e 'SMTP_DOMAIN=example.com' \ -e 'SMTP_HOST=192.168.3.4' \ -e 'SMTP_PORT=25' \ -e 'SMTP_STARTTLS=false' \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3 sameersbn/gitlab:7.4.3不支持 redis 的任何验证,只能无密码使用
目前发现 sameersbn/gitlab:7.4.3 有一个非常坑的地方:容器启动可能连不上数据库,是因为容器启动时会探测数据库是否可用,而探测的方法是 mysqladmin 连接 DB_HOST 的 3306 端口,而不是 DB_PORT 指定的端口,已提交 issue 给作者。
3.2.4.4. 给 gitlab 容器配置 IP
- pipework br1 gitlab 192.168.1.1/24@192.168.1.254
在 gitlab 容器启动(docker run)时可以加上 - p 参数来将容器里的端口映射到宿主上,但个人比较倾向给容器配置一个独立 IP,因此上述命令没有采用 - p 来做端口映射,但是 -e‘GITLAB_PORT=80′ -e‘GITLAB_SSH_PORT=22′ -e‘GITLAB_HOST=gitlab.example.com’依然要指定,否则 gitlab 无法使用
3.2.4.5. 安装已完成,可以打开页面
- url: gitlab.example.com
账户:root 密码:5iveL!fe
- 效果:
3.2.4.6. 加入开机启动
- 加入 /etc/rc.local
echo 'docker start gitlab_redis' >> /etc/rc.local echo 'docker start gitlab_mysql' >> /etc/rc.local echo 'docker start gitlab' >> /etc/rc.local echo 'pipework br1 gitlab 192.168.1.1/24@192.168.1.254' >> /etc/rc.local
4. GitLab API wrappers
- 官方推荐:https://about.gitlab.com/applications/
- python:pyapi-gitlab
基本使用:pip install pyapi-gitlab import gitlab git = gitlab.Gitlab("http://gitlab.example.com", token="EHBLkwhr_WYzn-sXNnNs") # token 即在页面上 Profile settings->Account 里能看到自动生成好的 Private token git.getusers()
- 顺便推荐个 Git 本身的 python api 模块:https://github.com/FriendCode/gittle
其他很多 git 库的实现都太底层了,和 linux 的 git 命令完全不一样,一点也不友好。但目前发现这个模块上传下载代码只支持 SSH,不支持 HTTP,因此我还是更喜欢使用 linux git 命令
5. GitLab 使用的 FAQ
5.1. git 代码发布支持 2 种方法:ssh 和 http(s)
- ssh:必须添加 ssh key 才能发布
- http:使用用户名、密码,若接入了 LDAP,就是 LDAP 中的账户密码
- https:暂未测试过
5.2. 限制 git 上传的单个文件大小
- 若 gitlab 是通过 sameersbn/gitlab:7.4.3 镜像创建的,那么可以通过环境变量 NGINX_MAX_UPLOAD_SIZE 进行限制
5.3. 通过 API 进行一些操作例如创建 Project,得到成功的响应,但却没有立即生效,过了几秒才生效
- 由于 GitLab 为异步架构,Ruby on Rails 收到创建 Project 请求后将该任务推送到 Redis 中,但是没有等待执行完毕,而是直接返回成功。后台 Sidekiq 从 Redis 订阅任务并实时执行,但由于执行需要时间,而 API 返回很快,因此会造成这种情况发生。目前没有其他解决办法,只能在自己程序逻辑里 sleep 几秒进行重试
5.4. 页面上”Profile settings->SSH Keys”与”Project Settings 里 Deploy Keys”的区别
- Profile settings->SSH Keys:是用户全局的 Key,具有对该用户所有项目仓库进行上传下载(push、clone)的权限
- Project Settings 里 Deploy Keys:针对某个项目,具有下载(clone)的权限,而不具备上传(push)的权限
5.5. gitlab 默认时区是 UTC
- sameersbn/gitlab:7.4.3 镜像无法对时区进行修改,若是手动安装的 gitlab,可以通过修改一个.rb 文件来生效,具体没有测试过,有需要的可以自行百度搜下。
时区是 UTC 主要影响的是数据库里关于时间字段的值(created_at、updated_at 等),对用户 git 仓库是不影响的,因为 git 仓库的创建、代码更新都是用户通过 git 工具自行操作,因此是用户自己的时区。
6. GitLab 维护
6.1. 数据路径、日志路径
- 由于 gitlab 容器在启动时已将宿主 /opt/gitlab/data、/opt/gitlab/log 目录挂载到容器里,因此可以在宿主上进入这 2 个目录中查看,另外可以通过 docker logs 查看。
6.2. 高可用
- 官方有篇关于 GitLab 高可用的文章:https://about.gitlab.com/high-availability/
有 1 / 3 都在讲述高可用的利弊以及不同程度的高可用带来的收益及可能引发的更多问题,说的挺有道理的。由于笔者也才刚开始使用 GitLab,因此暂不测试多机load balance 或 failover。
- 2 种备份恢复方式
1. 备份配置、仓库、数据库。2. 给文件系统做快照。官方认为第二种方法比起第一种更快,因为可以省去人为介入 restore 的麻烦 XFS 文件系统支持快照 有 2 篇文章可以拜读下:http://www.icicletech.com/blog/gitlab-backup-made-easy 数据库数据备份到本地 http://doc.gitlab.com/ce/raketasks/backup_restore.html 官方的,和上述其实一样
- 我的备份方案:
一. 简介:每天固定时间备份数据(仅备份 MySQL 和 GitLab 仓库重要文件,其他不备份)。若数据丢失,需要恢复,则将最近备份的数据用来恢复,会将所有数据,包括本地文件(仓库等文件)、数据库一同还原回备份时刻。二. 具体操作:1. 备份:docker run \ --name='gitlab_backup' \ -it \ --rm \ --link gitlab_mysql:mysql \ --link gitlab_redis:redisio \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3 app:rake gitlab:backup:create 过程能在屏幕上看到,备份会自动打成 tar 包放入 /opt/gitlab/data/backups 里。可以自行对该 tar 包做压缩,例如 gzip 时间戳_gitlab_backup.tar。若 $?=0表示备份成功,然后将生成的文件使用 gzip 压缩为.tar.gz,然后 rsync 推到存储上 通过 rsync 命令传到一台备份存储上 2. 恢复:docker run \ --name='gitlab_restore' \ -it \ --rm \ --link gitlab_mysql:mysql \ --link gitlab_redis:redisio \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3 app:rake gitlab:backup:restore 屏幕上会将 /opt/gitlab/data/backups 中的所有文件和目录列出来,复制粘贴要恢复的 tar 包文件名,敲入回车即开始恢复。注意:恢复时会将当前数据库中的所有表先删掉再导入备份 tar 包的里 sql 文件,因此此步要小心。若 redis、mysql 是使用环境变量带入 gitlab 容器的,备份和恢复命令也类似,将启动 gitlab 的命令复制过来,修改下 --name,添加一个 --rm,CMD 改为 gitlab:backup:create或 gitlab:backup:restore 即可 三. 注意:1. 用户配置的key(即 data/.ssh)是保存在数据库里,在 gitlab 服务启动时候会从数据库里加载并导入到.ssh 里,被 gitlab-shell 管理 2. 由于 ssh 目录(保存着服务器 sshd 服务启动时自己生成的 ssh_key)不备份,因此还原时候若这个目录里有文件,则不去重新生成 ssh_key,若不存在,则重新生成。若重新生成,用户使用 ssh 协议进行 git push,会报错告知不合法的认证 3. 备份只会备份 3 个目录:repositories、db、uploads,然后会额外生成一个 backup_information.yml 文件 4. gitlab-satellites 和 tmp 都是临时目录,因此不参与备份 5. docker run --rm 不会影响容器退出状态的输出 6. 还原时候会将数据库里的表先 DROP 表再创建,因为 sql 文件在 INSERT 之前会drop table if exists 7. 还原时候,若存在要恢复的目录,则会将原来的目录 mv 成.old. 时间戳
更多 GitLab 相关教程见以下内容:
Ubuntu 14.04 下安装 GitLab 指南 http://www.linuxidc.com/Linux/2015-12/126876.htm
如何在 Ubuntu Server 14.04 下安装 Gitlab 中文版 http://www.linuxidc.com/Linux/2015-12/126875.htm
CentOS 源码安装 GitLab 汉化版 http://www.linuxidc.com/Linux/2015-10/124648.htm
在 Ubuntu 12.04 上安装 GitLab http://www.linuxidc.com/Linux/2012-12/75249.htm
GitLab 5.3 升级注意事项 http://www.linuxidc.com/Linux/2013-06/86473.htm
在 CentOS 上部署 GitLab (自托管的 Git 项目仓库) http://www.linuxidc.com/Linux/2013-06/85754.htm
在 RHEL6/CentOS6/ScientificLinux6 上安装 GitLab 6.0.2 http://www.linuxidc.com/Linux/2014-03/97831.htm
CentOS 6.5 安装 GitLab 教程及相关问题解决 http://www.linuxidc.com/Linux/2014-05/101526.htm
GitLab 的详细介绍:请点这里
GitLab 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131886.htm