持续集成(CONTINUOUS INTEGRATION)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

        Gitlab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

        Gitlab-CI就是一套配合GitLab使用的持续集成系统,GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。

        Gitlab-Pages是一个go语言写的HTTP服务,原来只在Gitlab.com和Gitlab企业版中可用,在8.17版本的时候在Gitlab社区版支持。

        Gitlab-Runner是配合GitLab-CI进行使用的,它是一个用来执行软件集成脚本的工具。

        这几个直接的关系如下:

用Gitlab玩CI/CD_java

        当用户push代码到Gitlab仓库,Gitlab会通知Gitlab-CI,Gitlab-CI通过与该项目关联的Runner,并通知runner更新并执行gitlab-ci.yml制定的脚本。

        Runner可以分布在不同的主机,也可以多个Runner同时存在一个主机。

        Runner分两种类型:共享型和指定型

        下面介绍用docker搭建一整套环境。


  • 启动gitlab需要的数据库

docker run --name gitlab-postgresql -d \
    --env 'DB_NAME=gitlabhq_production' \
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
    --env 'DB_EXTENSION=pg_trgm' \
    --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
    sameersbn/postgresql:10
  • 启动redis

docker run --name gitlab-redis -d \
    --volume /srv/docker/gitlab/redis:/var/lib/redis \
    sameersbn/redis:4.0.9-1
  • 启动gitlab

docker run --name gitlab -d \
    --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
    --publish 10022:22 --publish 10080:80 \
    --env 'GITLAB_PORT=10080' --env  'GITLAB_SSH_PORT=10022' --env 'GITLAB_HOST='exampel.com'\
    --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:10.6.4
  • 查看已启动的容器


        此时通过刚才gitlab_host参数设置的域名访问,可以看到gitlab登陆页面。


        首次登陆会提示重置密码,之后登陆gitlab

用Gitlab玩CI/CD_java_02

        gitlab就搭建好了,docker就是这么简单,不过gitlab-pages默认是未开启的,需要在启动gitlab时指定参数开启。所以停掉gitlab的容器,删除容器后,重新启动容器


docker run --name gitlab -d \
    --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
    --publish 10022:22 --publish 10080:80 \    --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \    --env 'GITLAB_HOST='exampel.com' \--env 'GITLAB_PAGES_ENABLED=true' --env 'GITLAB_PAGES_DOMAIN=pages.examples.com' --env 'GITLAB_PAGES_DIR=/home/git/data/pages' --env 'GITLAB_PAGES_EXTERNAL_HTTP=true' --env 'GITLAB_PAGES_EXXTERNAL_HTTPS=true' \
    --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:10.6.4

        再次启动docker后,新建projects,并进入项目,在项目Settings菜单下可以看到Pages设置菜单

用Gitlab玩CI/CD_java_03

  • 启动gitlab-runner

docker run -d --name gitlab-runner --restart always -v /data/gitlab/gitlab-runner/config:/etc/gitlab-runner -v /data/gitlab/gitlab-runner/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

        上面说到Runner分为两种类型,共享型Runner是服务于所有项目的,而指定型Runner是服务于指定项目,可以看到在启动gitlab-runner时,并没有link到gitlab,那么Runner如何指定服务呢?

        Runner是通过gitlab-ci的url及token进行注册的。共享型Runner需要的token是在管理员area,所以共享型只能由管理员创建,而指定型token是在项目Setting-CI/CD中,所以拥有项目管理权限的user都可以创建。

用Gitlab玩CI/CD_java_04

共享token

用Gitlab玩CI/CD_java_05

项目token

这里顺便说一下,如果你在项目runner中看不到shared runners,可以查看是否开启了shared runners,参考上图。

获取到url及token,通过一下命令进行注册:

docker exec -it gitlab-runner gitlab-ci-multi-runner register

按照提示输入相关信息:

Please enter the gitlab-ci coordinator URL:#gitlab_url, eg:https://gitlab.chain.cn/Please enter the gitlab-ci token for this runner:#token_idPlease enter the gitlab-ci description for this runner:#eg:demo-testPlease enter the gitlab-ci tags for this runner (comma separated):#eg:demoPlease enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:#shell/dockerPlease enter the default Docker image (e.g. ruby:2.1):#php7

        上面介绍挺清楚了,部分说明一下,tags:这里创建的tags名称,在后面gitlab-ci脚本中会用到。executor:执行器,这里可以看到很多可选执行器,包括docker、shell、ssh等。如果指定docker执行器,会提示选择默认的Docker image,根据自己项目所需环境选择自己制作的镜像即可。

        runner注册正常后,可以在Runner管理界面看到:

用Gitlab玩CI/CD_java_06

        可以看到,这里一个指定型,一个共享型,两个runner。

        完成后,我们开始在项目根目录创建gitlab-ci.yml文件,gitlab已支持很多框架的gitlab-ci.yml的template,我这里选择html进行发布测试。

用Gitlab玩CI/CD_java_07

        这里说明一下,artifacts的paths最后必须为public。有关于gitlab-ci.yml的书写规则这里不做详解,想要了解的可以关注公众号期待下回分解。

        添加完gitlab-ci.yml之后,我们提交一个text.html文件到该项目,然后去CI/CD-Pipeline查看

用Gitlab玩CI/CD_java_08

        job中点击passed,我们可以查看执行的详细情况

用Gitlab玩CI/CD_java_09

        正常执行完成后,我们打开Pages页面,可以看到Access pages

用Gitlab玩CI/CD_java_10

        通过该链接,查看刚提交的text.html

用Gitlab玩CI/CD_java_11

        通过docker简单快速的搭建自己的DevOps环境,可以在gitlab上发布自己的博客等静态页面。