项目

一般

简介

 

我们是如何进行软件配置管理的(待补充)

导出 PDF

本来是打算介绍一下CI的, KB#20: 说说持续集成(CI)的那点事 ,但是说起CI,那就得从头说起,也就是SCM(软件配置管理)。

按Hero的建议,把SCM这部分单独挪到这了,不过这样一来这篇文章稍显简略了,看情况再抽空补充点内容吧。

VSS

最早我记得明宇用过一阵子VSS,就是搞个共享文件夹,大家开整,好像是采用独占模式的吧,人少的时候倒也没啥影响,可以对付。

CVS

CVS用过吗?不记得了,也许用过,但是完全没印象了,好吧,反正那时候也不存在什么CI

SVN

这个用得时间长一些,集成了一个WEB管理界面实现权限管理,权限管理的粒度可以做到很细(到每一级目录),一般的协作开发还是比较方便的

但是,svn真的很慢,而且追溯性非常不好,冲突处理也很麻烦,而且把一个产品所有东西扔在一个大仓库里,然后给各色人等配置权限,有一些问题

  1. 因为branch和tag也是目录的形式,所以每次打了新branch和tag,可能要再给这些目录设置权限

  2. 在多级目录的时候,各种权限继承之类的事情让人很晕,容易配置错误

  3. 当目录改名或在目录树中改变位置的时候,要重新配置权限,用户checkout/checkoin的路径也改了

  4. 每次往里面仓库里添加新的组件的时候,又是各种配置。。。

所以说,对于那种短期的项目,SVN基本够用,但是对于我们产品型的项目,SVN就不够看了,接下来就轮到Git出场了

Git 和 GitHub

好了,终于说道Git了,它的好处我也懒得说了,直接参考 https://github.com/xirong/my-git/blob/master/why-git.md

就像SVN需要配合Apache以及PHP支持WEBDAV以及进行权限管理,Git也有个好搭档,就是 GiHub ,这是一个代码托管的公共服务

然而,对于商业机构来讲,还是希望有个私有部署的代码管理器,这里 GitLab 就闪亮登场了 ,下面主要讲讲这个

GitLab

GitLab是依赖于Git的,但是如果只有Git,那么我们实际上就等于是处于刀耕火种的状态,所以这里我们主要讲GitLab

安装GitLab

早年Gitlab的安装和配置,那叫一个费劲,说多了都是泪,现在方便了,简直易如反掌

1. 安装Debian

首先,你需要一个Debian 7 或 Debian 8 ,当然Ubuntu也可以,但是我们倾向于用Debian做服务器而不是Ubuntu , 这个不多说了

2. 用源安装GitLab

参照 https://about.gitlab.com/installation/ 中推荐的办法 https://about.gitlab.com/downloads/ 来安装GitLab

#安装依赖包,省略了postfix,另外配置smtp,多加了sudo
apt-get install curl openssh-server ca-certificates sudo
#下载并执行配置脚本,如果你的网络条件不好,加代理配置才能成功下载(请把XXXX替换成HTTP代理服务器地址),这个脚本是用来更新源的
curl --proxy http://XXXX https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
#下载并执行安装脚本,这里展示的仍然是加了代理的指令
apt-get -o Acquire::http::proxy="http://XXXX" install gitlab-ce
#安装成功后要reconfigure并启动服务,注意这里必须带上sudo指令,即以 gitlab-ctl 身份来执行 reconfigure
sudo gitlab-ctl reconfigure

3. 用源升级GitLab

apt-get update
apt-get upgrade

4. GitLab启动和日志跟踪

参考 https://docs.gitlab.com/ce/administration/restart_gitlab.html#how-to-restart-gitlab

访问 http://localhost (这里替换成实际网址) , 缺省帐号密码为

Username: root 
Password: 5iveL!fe

检查服务是否正常

sudo gitlab-ctl status
-------------------------------
run: logrotate: (pid 12223) 306s; run: log: (pid 12222) 306s
run: nginx: (pid 12210) 308s; run: log: (pid 12209) 308s
run: postgresql: (pid 12111) 327s; run: log: (pid 12110) 327s
run: redis: (pid 12029) 333s; run: log: (pid 12028) 333s
run: sidekiq: (pid 12195) 310s; run: log: (pid 12194) 310s
run: unicorn: (pid 12168) 311s; run: log: (pid 12167) 311s

如果不正常则跟踪日志,例如

sudo gitlab-ctl tail
sudo gitlab-ctl tail postgresql

Gitlab配置文件

参考 https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/README.md , 修改配置

vim /etc/gitlab/gitlab.rb

修改如

# gitlab_rails['time_zone'] = 'UTC'
# 修改时区
gitlab_rails['time_zone'] = 'Asia/Shanghai'

#external_url 'http://gitlab.local'
#external_url 'http://gitlab.rooyee.im'
# 修改外部url ,这个就是本机的IP地址
external_url 'http://???'

# gitlab_rails['gitlab_email_from'] = 'example@example.com'
# 修改发送邮件的邮箱
gitlab_rails['gitlab_email_from'] = '???@rooyee.im'

# 添加LDAP验证配置,这里以OpenLDAP为例
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main:
  label: '???'
  host: '????'
  port: 389
  uid: 'uid'
  method: 'plain'
  bind_dn: 'cn=???,dc=???,dc=???'
  password: '??????'
  active_directory: false
#     allow_username_or_email_login: false
#     block_auto_created_users: false
  base: 'ou=???,dc=???,dc=???'
  user_filter: ''
#secondary
#  label: 'rooyeetone.com'
#  host: '192.168.8.4'
#  port: 389
#  uid: 'uid'
#  method: 'plain'
#  bind_dn: 'cn=Manager,dc=soft2web,dc=com'
#  password: 'm60wHp'
#  active_directory: false
##     allow_username_or_email_login: false
##     block_auto_created_users: false
#  base: 'ou=xmpp,dc=soft2web,dc=com'
#  user_filter: ''
EOS

# gitlab_rails['backup_keep_time'] = 604800
# 打开备份保持时间配置, 这里设为7天
gitlab_rails['backup_keep_time'] = 604800

# 添加smtp服务器配置,用来发送提醒邮件的
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "???"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "???"
gitlab_rails['smtp_password'] = "???"
gitlab_rails['smtp_domain'] = "???"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false

# unicorn['worker_processes'] = 2
# 修改工作进程数,这个和本机的CPU内核数一致比较好,多了也没用
unicorn['worker_processes'] = 5

让配置重新生效

  • 注意:重启服务不能使配置生效,只有reconfigure才行 *
sudo gitlab-ctl reconfigure

GitLab控制台设置

用root登录控制台后修改的配置

  • 把root的profile中邮箱改为 自己的 ???@???.???
  • 取消 "Signup enabled" ,禁止新用户自行注册
  • 取消 "Gravatar enabled" , 禁止头像,因为这玩意要去外网(米国)获取,太慢
  • 取消 "Twitter enabled" , 禁止推特,因为要去米国获取,被墙

Redmin集成设置

进入各仓库,在 settings-->services-->Redmine中设置该项目的工单系统,程序员提交代码的时候在日志中加入Redmin工单编号 "#XXX" ,那么在GitLab服务器的Web界面上查看时就可以点击链接直接进入相应的Redmine工单界面查看了

GitLab的使用

这里说的使用,不是说怎么操作,而是说怎么管理

GitLab和SVN的权限管理是比较弱的,它的颗粒度很粗,只能以仓库为单位来授权,最多就是区分一下成员能否合并代码到主干

因为Git的特性,使得它根本就无法针对一个仓库进行内部的权限管理,使用GitLab之后,为了便于权限管理,也是为了解决持续集成,快速定制差异化版本,组件重用,故障隔离等等问题,我们大致做了以下调整:

  1. 把定制化资源文件剥离出来到单独的仓库,由测试/打包人员维护

  2. 把各组件剥离出来到单独的仓库,由组件开发人员维护,组件的CI过程完全独立,组件的版本也独立维护,和主程序无关

  3. 主程序仓库的标准CI,会引用依赖的相关组件,最终打包出产品的标准版

  4. 定制化版本的CI,是从定制化资源仓库触发的,用定制化资源覆盖掉标准版资源,然后引用相关组件,最终打包出产品的定制化版本

这套思路相当简单,以前我们只是没有精力去为自己开发一整套的工具来方便地实现这个思想

现在开源的CI工具都发展起来,我们才能方便地实践这个套路,感谢开源,感谢 理查德·斯托曼 ,记住这句话,“软件的自由,关系到人类的自由” 。

下图演示了单个仓库的启用过程

GitLab项目的启动

sequenceDiagram participant 超级管理员 participant GitLab服务(web控制台) participant Git服务(SSH或HTTP) participant GitLabCI服务(web控制台) participant 项目管理员 participant 开发人员 超级管理员->>GitLab服务(web控制台):创建GitLab项目 Note right of 超级管理员: 项目名称 Note right of 超级管理员: 项目管理员及成员 GitLab服务(web控制台)-->>超级管理员:返回成功并提示如何创建Git仓库 超级管理员->>超级管理员: 初始化项目的本地Git仓库 超级管理员->>Git服务(SSH或HTTP):初始化项目的远程Git仓库 Git服务(SSH或HTTP)-->> 超级管理员:返回成功 超级管理员->>GitLabCI服务(web控制台):给项目指定CI RUNNER Note right of 超级管理员: 持续集成用的,每次代码变更后会自动编译项目 GitLabCI服务(web控制台)-->> 超级管理员:返回成功 项目管理员->>GitLab服务(web控制台): 配置项目 Note left of 项目管理员:配置项目成员 Note left of 项目管理员:指定被保护的分支(master) Note left of 项目管理员:创建第一个milestone GitLab服务(web控制台)-->>项目管理员: 返回成功 项目管理员->>GitLabCI服务(web控制台): 配置持续集成 Note left of 项目管理员:配置自动编译脚本 Note left of 项目管理员:配置邮件通知 GitLabCI服务(web控制台)-->>项目管理员: 返回成功 开发人员->>Git服务(SSH或HTTP): 克隆项目 Git服务(SSH或HTTP)-->>开发人员: 返回成功

延伸阅读: KB#20: 说说持续集成(CI)的那点事