这是咱们使用GitLab和Rancher构建CI/CD流水线系列教程的第二部分。第一部分的内容介绍了如何部署、配置和确保GitLab在Rancher的运行。这一部分中,咱们将介绍如何使用GitLab CI Multi-Runner构建容器,以及如何使用GitLab容器registry配置项目。除此以外,咱们还将涉及如何用GitLab CI创建容器并部署到Rancher上。php
GitLab CI是用于持续集成和持续交付的强大工具。它须要和Rancher配合使用,这里咱们将部署一个执行做业的runner。git
部署runner有好几种方式,不过考虑到咱们的目的是要从本身的存储库中创建容器,咱们将运行一个能够直接访问/var/run/docker.sock的Docker容器,来构建和自身同步的镜像。github
1.在Rancher中,向你的Gitlab栈添加一个服务。
2.使用如下配置进行设置:web
Volumes:docker
容器运行时,它将在/etc/gitlab-runner中建立一个默认配置,该配置对应咱们已经创建链接的卷。接下来,用你的Gitlab实例注册runner。shell
下面操做中,我设置的配置适用于基本的runner,它能够搭建任意做业。你还能够将runner限制在指定的存储库中或是使用其余的镜像。这里你能够阅读GitLab的文档来了解是最适合你的环境的选项。segmentfault
1.在容器中执行shell
2.运行gitlab-ci-multi-runner register开始注册
3.按照提示信息输入,参考下列示例(答案是粗体字)ruby
root@4bd974b1c799:/# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://git.example.com
Please enter the gitlab-ci token for this runner:
DGQ-J7n0tR33LXB3z_
Please enter the gitlab-ci description for this runner:
4bd974b1c799]: runner01
Please enter the gitlab-ci tags for this runner (comma separated):
<press enter>
Whether to lock Runner to current project [true/false]:
false]: <press enter>
Registering runner… succeeded runner=DGQ-J7dD
Please enter the executor: docker, parallels, ssh, docker-ssh+machine, kubernetes, docker-ssh, shell, virtualbox, docker+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
docker:stable
Runner registered successfully.ssh
放手去执行它们吧,若是runner已经运行,那么配置会自动地就从新加载。这里要着重注意的是:工具
在初始的注册完成后,咱们须要编辑/etc/gitlab-runner/config.tom并做出调整:
这样在容器中装载/var/run/docker.sock,使得构建的容器保存在主机自己的镜像存储中。这是一个比Docker更好的方法。
config.toml的修改是由Runner自动执行的,所以无需从新启动。
你能够在Admin/Runners下看到你的runner并与之交互。
GitLab的容器镜像仓库直接和存储库绑定,所以没法将容器转移到任何其余位置。若是你在docker组中有一个名为demo-pho的存储库,那么镜像的路径就是registry.example.com/docker/demo-php ,其中的标签是根据你如何用GitLab CI建立容器而定义的。
在本教程的余下部分,我将使用一个存储库,该存储库的内容能够在github中找到。须要执行如下内容才能在你的GitLab环境中启动它:
$ git clone https://github.com/oskapt/ran... demo
$ cd demo
$ git remote set-url origin ssh://git@git.example.com:2222/example/demo.git
$ git push -u origin master
该文件以下所示:
variables: REGISTRY_HOST: registry.example.com TEST_IMAGE: $REGISTRY_HOST/$CI_PROJECT_PATH:$CI_BUILD_REF_NAME RELEASE_IMAGE: $REGISTRY_HOST/$CI_PROJECT_PATH:latest stages: - build - release before_script: - docker info - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $REGISTRY_HOST build: stage: build script: - docker build --pull -t $TEST_IMAGE . - docker push $TEST_IMAGE release: stage: release script: - docker pull $TEST_IMAGE - docker tag $TEST_IMAGE $RELEASE_IMAGE - docker push $RELEASE_IMAGE only: - master push_to_docker_hub: # in order for this to work you will need to set # `HUB_USERNAME` and `HUB_PASSWORD` as CI variables # in the Gitlab project stage: release variables: DOCKER_IMAGE: $HUB_USERNAME/$CI_PROJECT_NAME:latest script: - docker login -u $HUB_USERNAME -p $HUB_PASSWORD - docker tag $RELEASE_IMAGE $DOCKER_IMAGE - docker push $DOCKER_IMAGE only: - master when: manual
我设计的这个CI文件能够在多个基本的Docker项目中使用而无需任何修改。在将变量部分的项目设置为你想要的数值后,文件的其他部分就能适用于任何项目。
这里有两个阶段——构建和发布。GitLab有本身的token,可令本身登陆到本身的镜像仓库,该操做在before_script部分执行。接下来它在构建阶段执行脚本命令,构建容器并使用TEST_IMAGE变量中指定的格式标记容器。这样得到一个有分支名称的容器,就像咱们的develop分支这样:
registry.example.com/example/demo:develop
接下来会推送容器信息进镜像仓库中。
若是是master分支,它会执行全部这些步骤,而且在发布阶段,它在加进镜像仓库前会继续使用latest标记镜像。这样你会获得一个同时标记了master和lastest的容器。其中lastest是默认的标签名,你能够在不指定标签名的状况下获取它。
最后,master分支有一个可供使用的手动选项,可将容器推送至Docker Hub。若要实现这一步,首先须要在GitLab项目中的Settings | CI/CD Pipelines | Secret Variables下设置HUB_USERNAME和HUB_PASSWORD。GitLab CI将根据DOCKER_IMAGE的值从新标记master镜像,接着将其推送至Docker Hub。由于咱们已经指定了when下的manual,GitLab不会自动执行,那么就必须从GitLab手动执行此阶段。
在develop分支,你能够提交这些更改并将其推送到你的GitLab项目。若是一切都正常运行,你就能够在项目的pipelines标签下看到pipeline启动。你能够选择status图标来查看该阶段下的详细进度日志。
若是出现了任何错误,GitLab CI将报告pipeline失败,你能够查看日志了解缘由。当解决了问题并推送新的提交时,GitLab CI将启动新的pipeline。若是错误是暂时的(如没法链接到Docker Hub),你能够再次运行该阶段的pipeline。
若是只想从现有的代码运行pipeline,你能够单击Run Pipeline并选择要构建的分支。
当一切都完成以后,管道会显示Passed,你能够在GitLab项目的Registry标签下看到你的容器。
在使用镜像仓库以前,你须要将部署用户添加到Rancher。我建议你在你想要部署的项目上建立一个具备Reporter权限的deploy用户,而不要使用你的管理员帐户。
GitLab默认会为用户发送登陆电子邮件,所以咱们须要编辑用户并设置密码。
如今,deploy用户有权从你的项目的容器注册表访问容器。
咱们到目前为止的全部步骤都是为了这一步——从你的私有镜像仓库中获取容器并将它部署到Rancher上。咱们须要作的最后一件事是添加镜像仓库,而后作一个新的栈和服务。
把镜像仓库添加到Rancher以后,你已经能够从这些镜像中建立服务了。
1.建立一个名为demo的栈
2.添加一个服务,名字由你决定。让镜像使用你新的容器镜像中的develop标签
3.点击Create
恭喜你!你刚刚已经用私有容器镜像仓库部署了项目的开发版本!
这是一个漫长的教程,但当全部的重要步骤完成后,你可使用已经安装好的工具开始工做了。从如今开始你能够作这些事情:
9月27日,北京海航万豪酒店,容器技术大会Container Day 2017即将举行。
CloudStack之父、海航科技技术总监、华为PaaS部门部长、恒丰银行科技部总经理、阿里云PaaS工程总监、民生保险CIO······均已加入豪华讲师套餐!
11家已容器落地企业,15位真·云计算大咖,13场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册连接请戳