平时一直是用git来管理代码仓库,也用过一段时间github,但是github免费版不能建私有仓库。后来转到了bitbucket,后来被atlassian收购后有点不适应,而且在国内访问经常连不上。还是gitlab比较好用,因为公司也是用gitlab,所以上手很快,新增的构建功能非常方便。
1. GitLab.com
gitlab是开源项目,官网也提供了社区版安装包,如果有自己服务器的话可以私有化部署一个,安装教程参考官网,只需要简单几步就能运行,地址
但是对于个人开发者来说要求的服务器配置有点高,1核1G的服务器也只能勉强跑起来。另一种选择就是使用GitLab.com,这是官方提供的免费平台,功能和社区版一样,有人在维护、更新,新功能会比较多,缺点就是偶尔抽风。地址 > GitLab.com offers free unlimited (private) repositories and unlimited collaborators.
这是官方的宣传语,提供无限的免费的私人的仓库,无限制的协作者,条件非常诱人。
注册流程比较简单,填一下username和email就差不多了,这也将是git空间的标记,名字不要取得太随意就行了。
2. 创建项目
登录后点击右上角的加号(New project)。
- Project path:如果你属于group的话可以选group名字,这样项目就会放在对应group下,一般团队项目比较好用。
- Project name:你的项目名字
- Import project from:可以从多个github、bitbucket等主流托管平台导入项目。
- Project description:项目描述,可选
- Visibility Level:项目可见级别
- Private:私有项目,需要授权才能访问,适合个人、团队开发。
- Internal:内部项目,注意只要登录账号就能访问,适合开源贡献代码。
- Public:公开项目,不用登录就能访问,适合分享项目。
点击create,创建项目,进入空项目,会出现初始化步骤,可以用ssh和https方式来上传代码,推荐ssh,比较安全。
3. 配置ssh(可选)
如果本地没有ssh key,用ssh-keygen初始化一个,可以参考我之前写的github教程git初始化那部分
有ssh key后添加到后台,点击右侧头像,下拉菜单里选settings,在顶部的tab里点击SSH Keys,或者直接访问
Key就是.ssh/id_rsa.pub文件内容,title填自己知道的就行,尽量语义化点。
Add key,完成。
4. 上传项目
回到我们创建的空项目页面,在项目名称下面选择传输协议,ssh或者https,下面教程里的url会跟着变。
之后按照下面的教程来做就行了,最后push
git push -u origin master
完成,这时项目页面应该就有东西了,后面就可以用正常的git命令来维护代码仓库了。
5. 配置CI(持续集成)
如果只是要一个git代码托管的话上面几步已经足够了,现在开始介绍gitlab提供的持续集成功能,这对于需要打包、发布的人来说非常方便。
5.1 Pipelines
一个pipeline就是一次持续集成任务,一般由一次push触发,在网页上对项目的修改、merge也会触发pipline。pipline由Runner执行,Runner有两种:
- Specific Runners:私有runner,部署和执行在自己服务器上,优点是安全、速度快,缺点是需要提供服务器,部署教程
- Shared Runners:共享runner,官方提供的runner,优点是免费,缺点是会偶尔抽风、或者速度慢
5.2 Jobs
pipline由多个job组成,一个job会发给一个runner来执行,所以各个job之间的数据不是共享的,除非使用cache。所以尽量把一些有依赖的步骤放到一个job里,或者把一些通用步骤放到before_script里,这个后面会提到。
5.3 stages
stage是对job的分组,同一个stage里的job是并行的,两个stage之间是串行的
5.4 .gitlab-ci.yml
要想配置上面说的这些,需要在项目根目录新建.gitlab-ci.yml文件,文件格式为yaml,教程
image: golang:latest
before_script:
- ln -s /builds/wuyuans/www /go/src/www
- cd /go/src/www
- mkdir bin
stages:
- build
- deploy
build_web:
stage: build
script:
- go build -v -o bin/web www/web
except:
- release
build_service:
stage: build
script:
- go build -v -o bin/service www/service
except:
- release
deploy_web:
stage: deploy
script:
- go build -v -o bin/web www/web
- scp bin/web root@${ HOST_1}:/bin/
environment:
name: www/web
url: http://$CI_ENVIRONMENT_SLUG.wuyuans.com
when: manual
only:
- release
5.4.1 image
编译使用的docker镜像,如果是golang的话可以用golang:latest,使用最新版golang,其他可以在docker hub查
5.4.2 before_script
每个job执行前都会执行before_script里的步骤,主要是做一些环节初始化,比如我这里把工程目录链到了GOPATH下,这样方便使用go命令。也可以在这里做一些go get工作
5.4.3 stages
我分了两个stage,build和deploy。build里有build_web、build_service,deploy里的是deploy_web,名字可以随便,主要是job里的stage字段需要和stages里定义的对应上。
5.4.4 build_web、build_service
script里的是执行的命令,做go build的工作,except表示这个job不能在release分支执行。
5.4.5 deploy_web
script和前面一样。environment用来标记发布的名字,我们可以用environment来管理发布版本、回滚等。when表示执行时间,默认是always每次都会执行,manual表示需要在后台手动执行,这样在不需要所有deploy job都执行的时候手动deploy项目。only表示只在release分支执行。
5.5 Environments
在.gitlab-ci.yml里配置了environment后,job执行完后会在项目页面里的Pipelines->Environments下看到这次job,他会按照配置里的name来合并,每次job都可以重做,也就是可以用来做项目的重发和回滚,右边有相对于的按钮,很方便。
6. 总结
gitlab有很多功能非常实用,比如上面讲到的Pipelines、Environments等,还有像Graph(以前叫network)可以显示所有分支的树状结构,这对于在多个分支里来回切换、分不清在哪个分支提交的人来说很直观。而且gitlab对于权限控制提供了很多的选项,很适合团队合作。然而缺点也还是有的,因为是官方托管的平台,日常维护、偶尔抽风什么的,还有被墙的风险什么的。。。如果是个人用户应该关系不大,如果是团队的话还是自建gitlab社区版,功能应该差不多,毕竟安全和稳定对团队来说是比较重要的。