基于 GitLab 的简单项目管理与协作流程

GitLab 是一个类似于 GitHub 的开源源码托管服务,它除了提供基于 git 的基本代码托管服务外。还具备很多与软件开发协作相关的其他功能。比如 issues、Merge Requests 等。

利用 GitLab 提供的这些功能,我们可以实践一些简单的项目管理和协作流程。这套流程借鉴于很多成功的开源项目,非常适合在小型开发团队里面使用。

使用 issues 来管理需求与缺陷

GitLab issues 类似于“工单系统”,是一个发布项目相关信息的地方。项目的所有成员都可以创建新的 issue,其他成员可以在 issue 下进行相关的讨论。

issues 本身是一个非常简单的功能,但是如果配合 “标签”、“里程碑” 等功能一起使用,就可以承担起一定的项目管理工作。

录入 issue

在项目的开发过程中,我们会碰到很多新的需求、软件 bug 等。这些需求与 bug ,就是 issue 最大的来源,它们都可以作为 issue 录入到项目的 issues 中。

因为 issue 的录入门槛很低,鼓励项目成员录入 issue 后,项目很容易就会出现大量的 issues。所以我们应该严格控制每个 issue 的内容质量,确保其他人可以通过这个 issue 获取足够多的信息,提高沟通效率。

不光是和需求和 bug,任何和项目有关的内容都可以录入到 issue 中。

编写优秀的“需求” issue
如果你要录入一个需求类的 issue,最好在内容主体中包含下面这些内容:

  • 用一句话描述你的需求,并用它作为标题
  • 这个需求是解决什么问题的?
  • 这个需求对软件现有功能会造成什么影响?
  • 这个需求应该实现什么样的功能?
  • 这个需求是否依赖其他模块提供相关支持?
  • [可选] 这个需求有哪些实现方式?
  • [可选] 这些可选的实现方式分别有哪些优缺点?

编写优秀的“bug” issue
如果你要录入一个 bug issue,最好在内容主体中包含下面这些内容:

  • 提供出现问题的软件版本号、操作系统环境等相关信息
  • 提供能够稳定复现问题的相关步骤
  • 描述期待行为与当前行为
  • [可选] 你对这个 bug 原因的相关分析

Review issue 并为其打上标签

当 issue 被创建后,应该等待项目的 owner (owner 指项目的所有者,是对项目各方面都比较了解的人,可以为多个人) 对 issue 进行 Review。

Review 时,如果 owner 觉得这个 issue 满足下面的任意条件:

  • 与项目本身的功能、市场定位有冲突
  • 与现存 issue 有重复
  • 其他不应该被保留的情况

则应该在评论中说明相关情况,并关闭该 issue。如果经过上面的过滤后,觉得 issue 应该被继续跟进,那就应该为它打上标签,方便之后的筛选、排期等工作。

“标签”是 issue 的核心特性,为了更好的使用它,我建议采用 “{type}/{value}” 这样的二维标签来取代传统的 “{value}” 单维标签,下面是一些常用的 issue 标签:

优先级:priority
优先级(priority)是最重要的标签之一。它直接影响 bug 需要被响应的速度、或需求的具体排期。

  • priority/P3:十分紧急
  • priority/P2:较为紧急
  • priority/P1:普通
  • priority/P0:不紧急

类型:kind
kind(类别)表示 issue 属于哪种类型。

  • kind/bug:软件缺陷
  • kind/feature:新功能
  • kind/enhancement:改进项,模块代码重构等不影响项目功能但是改善工程质量的 issue 可归入此类
  • kind/research:技术调研类,一般以输出某类结论或报告视为结束

工作量:size
size(工作量)表示 issue 需要大约花费多少时间/精力,可以用来做简单的工作量评估参考。

  • size/XL
  • size/M
  • size/SM

领域/模块:area
area用于标记当前 issue 属于项目中的什么领域/模块。这个分类下的具体标签由项目本身决定。比如 area/apiserver、area/controller 等。给 issue 打上 area 标签后,项目不同模块的相关负责人可以更方便的找到自己负责的相关 issues。

GitLab 的标签是一个非常灵活的功能,在具体使用中,不必拘泥于上面列出来的这几种标签,可以根据当前项目特点随意调整。

issue 的后续操作

当 issue 被创建、打上标签以后,就可以进行后续操作了。issue 的后续操作主要包括下面几种:

  • 认领 issue:每一个 issue 都有一个 Assignee(受理人),表示当前 issue 由谁在处理。在你准备开始具体的工作前,一定要记得将 issue 认领为自己所有。
  • 在 issue 下进行讨论:在 issue 下可以围绕 issue 进行讨论,在讨论过程中,可以通过 @USERNAME 的方式通知其他人关注当前 issue。

使用 issue 做项目里程碑管理

除了为 issue 打上标签以外,你还可以为 issue 绑定上 milestone(里程碑),来将 issue 与某些特定的项目节点关联起来。之后便可以在 milestones 页面查看每一个里程碑的进展。

和 labels 一样,里程碑也是一个十分灵活的功能,你可以根据项目需要建立不同的里程碑,比如:

  • 基于软件版本号:基于未来将要发布的版本号建立里程碑,比如 v1.0.3、v2.0.1 等等
  • 基于时间周期:基于特定的时间周期 – 比如敏捷开发中的一个 sprint – 来建立里程碑,比如 Y2017-M7W3、Y2017-M7W4 等等

使用 issue board

使用 issue board(类似于敏捷开发中的“看板”),可以在一个页面看到当前处于不同阶段的所有 issues。这个功能非常适合站立晨会时使用。

勤于关闭 issues

随着项目越来越大,项目累积的 issue 也会越来越多。而这些 issue 中有很多已经失去它的价值。

所以,为了避免有价值的 issue 淹没在这些过时的信息当中,我们应该定期 Review 现有的 issues,关闭掉那些已经过时的 issues。

基于 Merge Request 的开发流程

在 GitLab 上创建的项目,所有人都不应该直接往 master 分支推送代码。而是应该在其他分支(或者 fork 项目的分支)进行开发。并最终通过创建 Merge Request(类似 GitHub pull request)将代码合并到 master 分支。

创建 Merge Request 并进行 Code Review

基于 MR 的开发流程如下:

  • 开发者在自己的分支下进行开发,开发完成后,创建将该分支合并到 Master 的 Merge Request,改动进入 Review 状态
  • 进入 Review 状态的代码,将由团队内的其他一位成员(经验比较丰富、或者对该工作模块比较熟悉)对代码改动进行 Code Review
  • 大家对 Reivew 结果进行讨论,并提交新的修改
  • 最终达成一致后,代码被 Merge 进 Master 分支

灵活创建新分支来避免 MR 冲突

我们一般会用类似于 dev_piglei 这样的分支名称进行开发,遵循着 “开发” -> “push 并创建 MR” -> “开发” 这样的工作流程。

但是,因为一个分支是严格对应到一个 MR 的,当你在同一个分支上开发不同功能时,如果 MR 一直处于 open 状态,那这些不同功能都会被推送到同一个 MR 上,对 Review 过程产生困扰。

为了避免这种情况,最好为不同的功能项创建不同的分支并各自创建 MR,比如dev_feature_add_member、dev_feature_disabled_user。

在 git 工作流方面,git-flow workflow 是一个值得学习的内容

分拆大的 Merge Request

如果开发一些比较大的需求,我们通常会将他们一次实现完,然后作为一个大的 MR 来提交 Review。

但是如果每个 MR 过于复杂,会大大影响 Code Review 的效率。所以,如果你要实现一个比较复杂的特性,建议将它拆解为多个比较小的 MR 来依次提交。

假如,你要为网站的 feed 页面从零开始添加 redis 缓存功能。可能一开始想的提交这个大 MR:

  • 添加基于 redis 的缓存模块并为 feed 页面添加缓存并主动过期
    但这个 MR 里面包含了太多内容,会增加 Review 的难度。所以可以试着将这个功能拆解为下面三个更小的 MR:

  • 添加基于缓存模块

  • 为缓存模块添加 Redis 作为存储后端
  • 为 feed 页面提供缓存,并主动过期
    谨记:

  • 超过 1000 行的代码改动 Review 起来非常困难

  • 可以使用 feature flag(功能开关)在 PR 完全完成前屏蔽部分功能

Gitlab 安装配置管理实例

一、安装gitlab服务

因为github在美国有点慢,连接和推送不方便。国内众多的代码管理平台也是非常的不错,例如:coding,码云,码市等。但是有些企业为了方便自己去搭建一个基于web界面的代码管理平台gitlab!

建议后期搭建Gitlab平台,一定要让其服务独立运行在一台机器上,两方面: ①机器比较耗费硬件资源。 ②一旦出现问题维护起来困难比较大,为了不造成冲突!

二、安装配置

yum install -y curl policycoreutils-python openssh-server openssh-clients

yum install postfix

systemctl enable postfix

systemctl start postfix

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

EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce

gitlab-ctl reconfigure      //因为数据包比较大 所以需要安装一会(安装完毕之后会自动启动相关服务)

虽然说安装比较容易,但是不建议安装gitlab的服务再次安装其它服务,因为后期的维护成本很高!

养成好的习惯,定期去备份数据!!!

netstat -lnpt  //查看监听端口

gitlab-ctl stop/restart/start/status        //启动,停止,重启

[root@zhdy01 src]# netstat -lntp
tcp        0      0 127.0.0.1:9168          0.0.0.0:*               LISTEN      5076/ruby 

从服务端口我们可以看出,安装gitlab默认帮我们安装了Redis logrotate nginx 等

[root@zhdy01 src]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        1.5G         79M         28M        197M         65M
Swap:          1.9G        109M        1.8G

硬件资源占用的不少,所以官方建议我们至少需要内存4G。

2.1 登录GitLab

浏览器访问gitlab,输入ip即可。

一定要先关闭iptables规则和firewall以及selinux规则!

第一次登录,一定要确保本机器没有存在nginx以及redis服务。有的话关闭!

第一次登录会先让你创建一个长度不低于8位字符的密码。

默认管理员root,你自己创建的密码

登录后的界面:

未分类

2.2 登录GitLabgitlab常用命令

再启动服务:

gitlab-ctl start

2.3 Gitlab基础命令操作:

在现实的运维工作中,我们一般都是用nginx搞个代理,当我们输入公网的域名就可以解析到本地的gitlab web页面。肯定不是简简单单的一个ip地址!

因为安装gitlab服务自动帮我们安装了nginx,也许你会有疑问,在那个位置呢?

[root@zhdy01 ~]# vim /var/opt/gitlab/nginx/conf/nginx.conf

如果你需要修改监听端口或者绑定域名就要用到:

[root@zhdy01 ~]# vim /var/opt/gitlab/nginx/conf/gitlab-http.conf

未分类

在开始之前,我们先创建一个group,并设置组的是私有的还是public的,也可以添加组员,并创建相对应的project。

未分类

未分类

当我们创建好了之后,会出现如下:(是不是和Git很相似?)但是如上提示,需要我们增加一个SSH key。这样我们才可以连接并克隆!

未分类

点击如下各个位置去添加ssh key

未分类

作为一个运维,我们最常用的就是,创建用户,创建组,设置一个新的project。

未分类

当我们创建了一个用户,密码会直接发送一封邮件,里面就有设置密码的连接,如果用户想着直接让你创建,当我们完成之后,点击右上角的编辑即可再次编辑!然后用户首次登陆自己的账号会提示输入当前密码和修改一个密码!

载入配置服务(初始化和修改/etc/gitlab/gitlab.rb 后需要重新载入)

sudo gitlab-ctl reconfigure

启动服务

sudo gitlab-ctl start

停止服务

sudo gitlab-ctl stop

重启服务

sudo gitlab-ctl restart

检查服务的日志信息:

检查redis的日志

sudo gitlab-ctl tail redis

检查postgresql的日志

sudo gitlab-ctl tail postgresql

检查gitlab-workhorse的日志

sudo gitlab-ctl tail gitlab-workhorse

检查logrotate的日志

sudo gitlab-ctl tail logrotate

检查nginx的日志

sudo gitlab-ctl tail nginx

检查sidekiq的日志

sudo gitlab-ctl tail sidekiq

检查unicorn的日志

sudo gitlab-ctl tail unicorn

检查服务状态

sudo gitlab-ctl status

三、gitlab 备份和恢复

3.1 备份

gitlab-rake gitlab:backup:create

备份目录在

[root@zhdy01 ~]# ls /var/opt/gitlab/backups
1509073999_2017_10_27_10.1.0_gitlab_backup.tar

gitlab 恢复

恢复的时候如果你的版本是9是不可以直接恢复到10版本里面去的,解决方法先升级9到10,然后备份,再次导入即可!

先停服务

gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq

再次恢复

gitlab-rake gitlab:backup:restore BACKUP=xxxxx

(这里是一个编号,即备份文件的前缀)输入两次 yes 即可 恢复!!

docker镜像搭建gitlab服务

利用docker镜像搭建gitlab服务。

1、创建gitlab服务:

docker run –detach –hostname gitlab.example.com –publish 6443:443 –publish 8083:80 –publish 622:22 –name gitlab –restart always –volume /home/opt/gitlab/config:/etc/gitlab –volume /home/opt/gitlab/logs:/var/log/gitlab –volume /home/opt/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

等待docker启动正常

2、配置gitlab服务器的访问地址

按照上面的方式,让gitlab容器运行起来是没有问题的,但是当在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,即容器的id。作为gitlab服务器,当然是需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机上的路径为:/home/opt/gitlab/config/gitlab.rb)配置文件里面的参数, 162.3.160.60是你宿主机的ip。

配置http协议所使用的访问地址

external_url ‘http://162.3.160.60:8083’

配置ssh协议所使用的访问地址和端口

gitlab_rails[‘gitlab_ssh_host’] = ‘162.3.160.60’
gitlab_rails[‘gitlab_shell_ssh_port’] = 622

为了方便,这里直接用宿主机ip来指定。ssh默认使用的端口号是22,但是为了避开与宿主机22端口的冲突,这里用了622。在修改的过程中,一定要去掉配置项前面的#,配置才能生效,docker restart 重启gitlab容器

3、我们做了端口映射,可以输入http://node_ip:8083进行页面访问

未分类

4、第一次登录,设置管理员的密码

未分类

5、注册一个用户

未分类

6、创建一个组

未分类

7、创建一个工程

未分类

8、配置ssh key

未分类

你PC机,进入git bash,获取得到id_rsa.pub 密钥,加入到上图中

未分类

9、clone 代码

未分类

至此,gitlab搭建成功,并且能够正常使用。

gitlab API使用批量创建用户

gitlab有api的接口,网上搜索了一下使用的情况,貌似不多,找到的文章主要是用来批量操作用户。

下面就这个批量创建用户来测试一下

获取Access Token

未分类

【Settings】

未分类

【Access Tokens】

最后点击创建

之后会出现Access Token

未分类

我这里的Access Token为PknmemyqpPumLsKq_ytW,记录一下,下面的sh脚本里要使用

批量创建用户脚本

创建userinfo.txt

12345678 [email protected] test1 张三
12345678 [email protected] test2 李四

对应的列分别是密码,邮箱,gitlab用户名,别名,一行对应一个用户

创建gitlabAddUser.sh

#!/bin/bash
#gitlab用户文本
userinfo="userinfo.txt"
while read line 
do
    password=`echo $line | awk '{print $1}'`
    mail=`echo $line | awk '{print $2}'`
    username=`echo $line | awk '{print $3}'`
    name=`echo $line | awk '{print $4}'`
    curl -d "password=$password&email=$mail&username=$username&name=$name&private_token=PknmemyqpPumLsKq_ytW" "http://gitlab.phpsong.com/api/v4/users"

done <$userinfo

执行脚本

chmod +x gitlabAddUser.sh 
sh gitlabAddUser.sh

之后去gitlab查用户就能看到用户

未分类

Ubuntu 12.04 安装 GitLab

打开官网,下载安装包

gitlab本身依赖了很多第三方软件,所以我们直接下载官方提供的已经打包好的套件,里面包含了全部的软件。就不需要自己一个个安装了。

https://about.gitlab.com/downloads/#ubuntu1204

前往下载安装包页面

未分类

未分类

选择一个版本下载,建议不要选择太新的,此处选择:gitlab-ce7.10.5~omnibus-1amd64.deb

未分类

安装

参考官方文档,第一步执行如下命令,安装一些依赖的软件:

sudo apt-get install curl openssh-server ca-certificates postfix

其中postfix是用来发送邮件的,当用户注册我们自己搭建的GitLab时,用来给用户发送验证邮件。

postfix设置:

未分类

未分类

接着安装gitlab:

sudo dpkg -i gitlab-ce_7.10.5-omnibus-1_amd64.deb

配置GitLab

当用户注册我们自己搭建的GitLab时,需要给用户发送一封验证邮件,用户点击验证邮件才能完成注册。
我们是通过第三方邮件厂商(比如:腾讯,网易)给用户发送邮件的,这就需要我们配置用来给用户发送邮件的账号密码。

sudo vim /etc/gitlab/gitlab.rb

!!!!!!!!!!!记得去掉配置文件前面的# 注释

腾讯企业邮箱配置

gitlabrails['smtpenable'] = true
gitlabrails['smtpaddress'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 25 ##注意这里是25,腾讯企业邮箱官网说明的 smtp 发件端口号是 465,根本不对。
gitlabrails['smtpuser_name'] = "[email protected]"
gitlabrails['smtppassword'] = "xxx"
gitlabrails['smtpdomain'] = "xxx.com"
gitlabrails['smtpauthentication'] = "login"
gitlabrails['smtpenablestarttlsauto'] = true
gitlabrails['smtptls'] = true
gitlabrails['gitlabemail_from'] = "[email protected]"
user["gituseremail"] = "[email protected]"

163邮箱配置

gitlabrails['smtpenable'] = true
gitlabrails['smtpaddress'] = "smtp.163.com"
gitlabrails['smtpport'] = 25 
gitlabrails['smtpuser_name'] = "[email protected]"
gitlabrails['smtppassword'] = "xxpassword"
gitlabrails['smtpdomain'] = "163.com"
gitlabrails['smtpauthentication'] = :login
gitlabrails['smtpenablestarttlsauto'] = true

gitlabrails['gitlabemail_from'] = "[email protected]"  
user["gituseremail"] = "[email protected]"  

未分类

未分类

启动GitLab

sudo gitlab-ctl reconfigure

有时候你还需要重启postfix。(可选)

sudo /etc/init.d/postfix restart

访问GitLab

打开浏览器,输入上面配置的外网访问地址

默认管理员的账户密码:

Username: root
Password: 5iveL!fe

注意

1、腾讯企业邮箱配置

gitlab_rails['smtp_port'] = 25 ##注意这里是25,腾讯企业邮箱官网说明的 smtp 发件端口号是 465,根本不对。

2、GitLab 502问题

有可能是当前服务器上开启了tomcat,占用了8080端口,使GitLab的unicorn服务不能开启。

解决方法:修改/etc/gitlab/gitlab.rb

!!!!!!!!!!!记得去掉配置文件前面的# 注释

unicorn['port'] = 9090

然后重启GitLab服务

sudo gitlab-ctl reconfigure

其他命令

查看GitLab日志

sudo gitlab-ctl tail

定时清除gitlab runner产生的npm僵死进程

在使用gitlab runner执行npm install安装模块时,有可能npm一直不退出,导致占满runner的可用进程数,后面再执行pipeline就会出现pending的状态,一直等待不执行。下面我们使用一个脚本定时检测僵死的npm进程,并kill掉它们。
脚本如下:

for i in `ps -eo pid,etimes,cmd | grep npm | awk '{if($2 > 3600){print $1}}'`;do
    kill $i
done

加入到定时任务,每10分钟执行一次。

*/10 * * * * /data/sh/clean_death_npm.sh 

在Linux上安装与配置GitLab

一、简介

  • GitLab是一个开源的版本管理系统,提供了类似于GitHub的源代码浏览,管理缺陷和注释等功能,你可以将代码免费托管到GitLab.com,而且不限项目数量和成员数;
  • 最吸引人的一点是允许在自己的服务器上搭建GitLab CE(社区免费版)版本,方便内部团队协作开发和代码管理;
  • 本文将介绍如何在Linux服务器上使用包管理器搭建GitLab CE版本,以及一些基本的配置;

二、资源

GitLab官网: https://about.gitlab.com/installation/
Gmail: https://about.gitlab.com/installation/

三、CentOS系统

1、更新软件源

  • 配置国内的软件源,请详见 https://www.xiaocoder.com/2017/02/21/resource-1/ ;
  • 需要配置CentOS Base源与epel源;

2、添加GitLab源

$ vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
$ yum makecache fast && yum update -y

3、安装邮件服务

$ yum install -y postfix
$ systemctl enable postfix
$ systemctl start postfix

4、安装GitLab

  • GitLab自带了Web服务器(Nginx),若需要使用服务器已有的Nginx,需要额外的配置;
$ yum install -y gitlab-ce

未分类

四、Docker

1、更新软件源

  • 配置国内的软件源,请详见《CentOS/Ubuntu的国内软件源》;

2、安装Docker服务

  • 在服务器上安装Docker CE,安装指南请参考《在Linux上安装Docker》;

3、GitLab镜像

  • 官网资源: https://docs.gitlab.com/ce/install/docker.html

五、配置GitLab

1、配置服务端口

external_url 'http://ip_address:new-port'

2、邮件服务

Gmail

  • 请自行更改smtp_user_name与smtp_password;
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

QQ exmail(腾讯企业邮箱)

  • 请自行更改smtp_user_name、smtp_password与gitlab_email_from;
gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true 
gitlab_rails['smtp_tls'] = true 
gitlab_rails['gitlab_email_from'] = 'smtp user'

Outlook

  • 请自行更改smtp_user_name、smtp_password与gitlab_email_from;
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp-mail.outlook.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp-mail.outlook.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
gitlab_rails['gitlab_email_from'] = 'smtp user'

其他邮件服务

  • 其他邮件服务的设置,请参照官网: https://docs.gitlab.com/omnibus/settings/smtp.html ,此处就不再赘述了;

测试操作

$ gitlab-rails console
irb(main):001:0> Notify.test_email('[email protected]', 'Hello', 'Hello, World').deliver_now

3、重新生成配置

  • 每一次修改配置文件,都要执行此操作;
$ gitlab-ctl reconfigure

六、界面使用

1、设置密码

  • 首次访问,http://172.18.20.100,页面会提示设置管理员的密码;
  • 管理员:root,密码:<自定义>;

未分类

2、关闭头像

  • 点击Admin area(小扳手),然后点击Settings,取消勾选Gravatar enabled;

未分类

3、禁用注册

  • 点击Admin area(小扳手),然后点击Settings,取消勾选Sign-up enabled;

未分类

4、自定义页面布局

  • 点击个人的Settings,然后点击Preferrences,就可以自定义页面布局了;
  • 建议配置:
    • Syntax highlighting theme:Solarized Dark;
    • New Navigation:New;
    • Layout width:Fluid;

七、命令使用

1、启动服务

$ gitlab-ctl start

2、停止服务

$ gitlab-ctl stop

3、获取运行状态

$ gitlab-ctl status

4、获取帮助信息

$ gitlab-ctl --help

Gitlab 配置外部PostgreSQL

1. 简介

上篇文章介绍了安装GitLab方式,由于默认使用的postgreSQL数据库,不能通过gui工具更直白的看到表结构,如果需要深入了解数据库资源通过Shell 方式的话这无疑是个令人恼火的方式。当然,GitLab这里我们可以配置非包装安装的数据库。下面简单的介绍下步骤。

2. 新增PostgreSQL 超级用户

如果自己有超级用户的话可以跳过

终端输入:

#是否安装postgreSQL 有的话只需要安装postgresql-contrib
psql --version

#安装psql 和 psql contrib 模块
sudo apt-get install postgresql postgresql-contrib

# 创建超级用户
sudo -u postgres createuser --superuser [USERNAME]
sudo -u postgres psql
#录入密码
passwrod [USERNAME]
q

3. 修改GitLab 配置

目录: /etc/gitlab/gitlab.rb

postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = '5432'
#上个步骤创建的用户
gitlab_rails['db_username'] = 'USERNAME'
gitlab_rails['db_password'] = 'PASSWORD'

4. 配置GitLab使其有效

sudo gitlab-ctl reconfigure

#检查是否使用自定义配置
sudo gedit  /opt/gitlab/embedded/service/gitlab-rails/config/database.yml

5. 使用GUI 工具查看数据资源

工具篇详见另一篇文章: http://blog.csdn.net/jason_5991/article/details/77868781

gitlab的备份、备份还原测试及zabbix监控

说明

备份很重要,我们使用一台备份服务器来对gitlab服务器数据进行备份,而测试备份文件是否可用也很重要,要不然用到备份文件,而此文件无法正常还原就损失大了。所以我们还对备份文件进行还原测试及使用zabbix监控备份和还原是否成功。
备份服务器系统使用centos7。下面是备份服务器的配置过程。

配置备份服务器环境

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce    
systemctl start docker

拉取gitlab镜像

docker pull hub-mirror.c.163.com/gitlab/gitlab-ce:8.17.2-ce.0
docker tag hub-mirror.c.163.com/gitlab/gitlab-ce:8.17.2-ce.0 gitlab/gitlab-ce:8.17.2-ce.0

配置密钥免密码登录gitlab服务器

ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.93.5

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0

安装zabbix-agent

rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm 
yum -y install zabbix-agent zabbix-sender
service zabbix-agent start
chkconfig zabbix-agent on

配置agent

server_ip=192.168.93.202
sed -i "s/Server=.*/Server=$server_ip/"  /etc/zabbix/zabbix_agentd.conf
sed -i "s/ServerActive=.*/Server=$server_ip/"  /etc/zabbix/zabbix_agentd.conf
service zabbix-agent restart

导入模板

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>3.2</version>
    <date>2017-09-06T15:39:00Z</date>
    <groups>
        <group>
            <name>Templates</name>
        </group>
    </groups>
    <templates>
        <template>
            <template>Template Gitlab Backup</template>
            <name>Template Gitlab Backup</name>
            <description/>
            <groups>
                <group>
                    <name>Templates</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>gitlab-backup</name>
                </application>
            </applications>
            <items>
                <item>
                    <name>gitlab backup result</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>gitlab-backup</key>
                    <delay>86400</delay>
                    <history>90</history>
                    <trends>0</trends>
                    <status>0</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>gitlab-backup</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
            </items>
            <discovery_rules/>
            <httptests/>
            <macros/>
            <templates/>
            <screens/>
        </template>
    </templates>
    <triggers>
        <trigger>
            <expression>{Template Gitlab Backup:gitlab-backup.strlen()}&lt;&gt;0</expression>
            <recovery_mode>0</recovery_mode>
            <recovery_expression/>
            <name>gitlab backup failed</name>
            <correlation_mode>0</correlation_mode>
            <correlation_tag/>
            <url/>
            <status>0</status>
            <priority>2</priority>
            <description/>
            <type>0</type>
            <manual_close>0</manual_close>
            <dependencies/>
            <tags/>
        </trigger>
        <trigger>
            <expression>{Template Gitlab Backup:gitlab-backup.nodata(25h)}=1</expression>
            <recovery_mode>0</recovery_mode>
            <recovery_expression/>
            <name>no gitlab backup message</name>
            <correlation_mode>0</correlation_mode>
            <correlation_tag/>
            <url/>
            <status>0</status>
            <priority>2</priority>
            <description/>
            <type>0</type>
            <manual_close>0</manual_close>
            <dependencies/>
            <tags/>
        </trigger>
    </triggers>
</zabbix_export>

配置备份脚本

mkdir -p /data/sh
vi /data/sh/backup-gitlab.sh

脚本内容:

#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

GITLAB_HOST="192.168.93.5"
ZABBIX_SERVER="192.168.93.202"
BACKUP_SERVER_HOST_NAME="backup server"

# 开始ssh远程执行备份
echo "开始ssh远程执行备份"
if ! msg=`ssh $GITLAB_HOST gitlab-rake gitlab:backup:create 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "backup failed: $msg"
    exit 1
fi
# 获取备份文件名
echo "获取备份文件名"
backup_filename=`ssh $GITLAB_HOST ls -t /var/opt/gitlab/backups/ | head -1`
mkdir -p /data/backup/gitlab/

# 拉取备份文件
echo "拉取备份文件"
if ! msg=`scp $GITLAB_HOST:/var/opt/gitlab/backups/$backup_filename /data/backup/gitlab/ 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "scp backup file failed: $msg"
    exit 1  
fi

# 拉取配置文件
echo "拉取配置文件"
mkdir -p /data/backup/gitlab/etc/
if ! msg=`scp -r $GITLAB_HOST:/etc/gitlab/* /data/backup/gitlab/etc/ 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "scp etc file failed: $msg"
    exit 1  
fi
# 备份.ssh
mkdir -p /data/backup/gitlab/etc/ssh/
scp -r $GITLAB_HOST:/var/opt/gitlab/.ssh/ /data/backup/gitlab/etc/ssh/

timestamp=`echo $backup_filename  | sed 's/_gitlab_backup.tar//'`
# 启动一个gitlab容器进行还原测试
echo "启动一个gitlab容器进行还原测试"
docker run --detach 
    --hostname gitlab.example.com 
    --name gitlab 
    --restart always 
    -p 443:443 
    -p 80:80 
    --volume /data/backup/gitlab/etc:/etc/gitlab 
    -v /data/backup/gitlab:/var/opt/gitlab/backups/ 
    gitlab/gitlab-ce:8.17.2-ce.0

# 停止unicorn和sidekiq
echo "等待gitlab启动"
while true;do
    if [[ `docker exec gitlab gitlab-ctl status | grep -c ^run` -eq 7  ]];then
        break
    fi
    sleep 5    
done
echo "重新配置"
docker exec gitlab gitlab-ctl reconfigure
docker exec gitlab gitlab-ctl restart
echo "停止unicorn和sidekiq"
docker exec gitlab gitlab-ctl stop unicorn
docker exec gitlab gitlab-ctl stop sidekiq
chmod -R 777 /data/backup/gitlab/

# 开始还原备份
echo "开始还原备份"
if ! msg=`docker exec gitlab gitlab-rake gitlab:backup:restore BACKUP=$timestamp force=yes 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "rescore failed: $msg"
    exit 1
fi
docker exec gitlab gitlab-ctl start
docker stop gitlab
docker rm gitlab

# 清除备份
find /data/backup/gitlab/*.tar -mtime +7 -exec rm -f {} ;
zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o ""

加定时任务

01 03 * * * /data/sh/backup-gitlab.sh

使用GitLab CI Runner自动创建Docker镜像

GitLab 来管理 Dockerfile 是一件高效率的事情. 在每次更改 Dockerfile 之后, 都要手动 build 然后 push 到 registry, 有点重复性. 自己开了个 registry. 那就采用一种自动的方法来帮助我们做这种机械重复的工作.

使用了 GitLab CI, 并且自 GitLab 8.x 开始已经集成了 GitLab CI Server. 所以也不用额外部署 CI Server 了. 我们要做的工作就是部署一下 GitLab CI runner. 然后在 Dockerfile 的项目里配置一下 .gitlab-ci.yml告诉 GitLab CI runner 如何做就行了.

1、安装 Docker

在你想用来 build image 的机器上, 显然需要先装好 Docker. 参见 Docker官方文档.

2、安装 GitLab CI Runner

在用来 build 的机器上我们需要安装 GitLab CI Runner. 官方项目里面提供了很多安装说明. 可以直接找你对应的需要. 这里我就说一下我怎么直接在 Ubuntu 16.04 上安装的.(对应的官方文档)

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-ci-multi-runner

3、然后注册 runner

sudo gitlab-ci-multi-runner register

当中会让你填写一些信息. 例如你的 gitlab-ci coordinator 的地址和注册这个 runner 的 token, 这两个在你 GitLab 中可以找到. 具体的内容我忘记截图了. 关于 executor 的话, 我这里使用的是 shell, 因为我将 runner 直接运行在物理机的系统上, 想其能够直接使用 docker.
注册好后, 我们可以看 runner 的配置文件, 类似如下:

# /etc/gitlab-runner/config.toml
concurrent = 1

[[runners]]
  url = "http://gitlab.com/ci"
  token = "******************"
  name = "image builder"
  executor = "shell"
  [runners.ssh]
  [runners.docker]
    image = ""
    privileged = false
  [runners.parallels]
    base_name = ""

关于这些参数可以在 官方文档(https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md) 中找到. 注册好的 runner 在 GitLab 中如下图所示.

实际显示情况可能和上图有不同, 因为我已经将这个 runner 设置为 specific runner 了. 关于 runner 的说明可以参考 官方文档 configuring runner(http://doc.gitlab.com/ci/runners/README.html)

使用 GitLab runner 来 build docker image 的相关说明, 可以参考 官方文档 using docker build(http://doc.gitlab.com/ce/ci/docker/using_docker_build.html) . 主要需要注意的是, 为了要让 runner 可以调用 docker 命令, 需要把 gitlab-runner 这个用户加入 docker 所在组.

sudo usermod -aG docker gitlab-runner

4、配置使用

可以参考官方文档 Configuring project(http://doc.gitlab.com/ce/ci/yaml/README.html) . 用的配置

tages:
  - build_image
  - push_image

before_script:
  - docker info

build_image:
  stage: build_image
  script:
    - docker build -t myregistry/aplusplus/ubuntu:16.04 .

push_image:
  stage: push_image
  script:
    - docker push myregistry/aplusplus/ubuntu:16.04

stages 定义了你要做几步(stage) 以及他们之间的顺序. 默认每个 stage 都是在之前所有 stage 成功执行后才会执行. 每个 stage 可以包含多个任务(job), 例如上面的 build_image 和 push_image. 这里只定义了一个. 当每个 stage 有多个 jobs 时, 每个 jobs 会并行执行.

当你每次修改项目并 push 到 gitlab 后, runner 就会开始执行你配置的任务了。