Gitlab-CI运行流水线任务
Gitlab简介
最近感觉就是在不断的搭建/迁移版本服务器,而现在市面上关于版本服务器搭建的指南都流于表面,真正深入骨骼的少之又少,往往以偏概全很多关键点并未提及。而版本服务器的搭建往往是一个初创型或中小型公司迫切需要解决的问题。
目前市用户量和口碑较好的Git服务提供商,屈指可数。国外的话
GitHub
,BitBucket
都是不错的选择,但国际形势变幻莫测,需要随时备好梯子。国内的话Coding
用户体验就做的很不错,很切合码农们的审美, 开源中国的码云
也有对应的代码托管服务,不过自从他们家Maven仓库镜像下架事件后已不推荐再用,不久后被阿里收购不是没有可能。
各个版本管理软件各有优劣,大多数的企业和团队为了隐私性的需要,选择了目前市面上功能和体验都十分给力的Gitlab
作为非开源的代码管理平台。
Gitlab目前有两种不同的版本,社区/个人版和企业版
GitLab社区版是完全免费的,不但能建立免费的私有仓库而且没有数量上限,参与人员也没有数量限制,还能设置成员的权限,甚至细致到具体某条分支的权限,以及强大的工作流等等。完全满足我们日常开发、投产所需要的版本控制功能。
Gitlab企业版支持LDAP架构和对应功能,以达到更高的处理性能和存储效率,并提供其他更多模块和服务支持
参考链接:Gitlab社区版/企业版对比
安装前的准备
目前来说,Gitlab的发行版本并不是支持所有Linux/Unix内核版本,以下几种可能还是需要广大同学们通过其开源源码进行编译安装 。
- Arch Linux
- Fedora
- FreeBSD
- Gentoo
- macOS
Gitlab安装
#下载并安装gitlab的yum源
curl -sS http://packages.gitlab.cc/install/gitlab-ce/script.rpm.sh | sudo bash
#自动安装最新版本
yum install gitlab-ce
#生成配置并启动
gitlab-ctl reconfigure
#配置域名
vim /etc/gitlab/gitlab.rb
external_url 'http://gitlab.huoban.com'
安装完成,访问测试
使用SMTP来发送邮件通知
如果你不想用Gitlab服务器自带的postfix服务来发邮件,可以改用SMTP服务。同样是修改/etc/gitlab/gitlab.rb中的邮件服务配置,使用SMTP服务器来作为邮件通知的发送方
gitlab_rails['smtp_address'] = "smtp.yourdomain.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xxx"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "smtp.yourdomain.com"
gitlab_rails['smtp_authentication'] = 'plain'
gitlab_rails['smtp_enable_starttls_auto'] = true
配置https
1、创建SSL证书存放目录
mkdir -p /etc/gitlab/ssl
chmod 0700 /etc/gitlab/ssl
通过Sftp等方式上传证书gitlab.xxx.com.crt,修改对应证书访问权限
chmod 600 /etc/gitlab/ssl/gitlab.xxx.com.crt
2、修改主配置,支持SSL访问
仍然是修改/etc/gitlab/gitlab.rb主配置文件
external_url "[https://gitlab.bjwf125.com](https://gitlab.bjwf125.com)"
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.xxx.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.xxx.com.key"
什么是持续集成(Continuous Integration)
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
软件集成是软件开发过程中的一个环节,这个环节的工作一般会包括以下流程:合并代码---->安装依赖---->编译---->测试---->发布。软件集成的工作一般会比较细碎繁琐,为了不影响开发效率,以前软件集成这个环节一般不会经常进行或者只会等到项目后期再进行。但是有些问题,如果等到后期才发现,解决问题的代价很大,有可能导致项目延期或者失败。因此,为了尽早发现软件集成错误,鼓励团队成员应该经常集成他们的工作,通常每个成员每天应该至少集成一次。这就是所说的持续集成。所以说,持续集成是一种软件开发实践。
软件集成的工作细碎繁琐,以前是由人工完成的。但是现在鼓励持续集成,那岂不是要累死人,还影响开发效率。所以,应该考虑将软件集成这个工作自动化,这就出现了所谓的持续集成系统。
GitLab-CI
GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。
Gitlab-CI安装
#配置yum源
cat > /etc/yum.repos.d/gitlab-ci.repo << EOF
[gitlab-ci]
name=gitlab-ci
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ci-multi-runner/yum/el7/
enabled=1
gpgcheck=0
EOF
#安装最新版本
yum -y install gitlab-ci-multi-runner
使用Gitlab-ci-multi-runner注册Runner
安装好gitlab-ci-multi-runner这个软件之后,我们就可以用它向GitLab-CI注册Runner了。
向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url和注册token。
其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。
如果要注册Shared Runner,你需要到管理界面的Runners页面里面去找注册token。如下图所示:
# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.huoban.com/
Please enter the gitlab-ci token for this runner:
mWtqXCDiK2RDdRdUp7QC
Please enter the gitlab-ci description for this runner:
[zhangqiang001]: huoban-shell
Please enter the gitlab-ci tags for this runner (comma separated):
shell
Whether to run untagged builds [true/false]:
[false]: false
Whether to lock Runner to current project [true/false]:
[false]: false
Registering runner... succeeded runner=mWtqXCDi
Please enter the executor: docker+machine, kubernetes, docker-ssh, virtualbox, shell, ssh, docker-ssh+machine, docker, parallels:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
* 输入Gitlab CI地址
* 输入项目CI token
* 输入 Runner 描述
* 输入 Runner 标签,可以多个,用逗号隔开
* 输入 Runner 执行的语言 (e.g. shell)
构建.gitlab-ci.yml脚本
# vim .gitlab-ci.yml
deploy_stage:
only:
- master
when: manual
script:
- echo ${CI_PROJECT_DIR}
- rsync -rtlpvz ${CI_PROJECT_DIR}/ $SSH_USER@$SSH_HOST:${PROD_BASE_DIR} && echo $?
- ssh $SSH_USER@$SSH_HOST "sudo chmod -R 777 $PROD_BASE_DIR"
tags:
- shell