如何使用GitLab和Rancher構建CI/CD流水線 – Part 2

這是咱們使用GitLab和Rancher構建CI/CD流水線系列教程的第二部分。第一部分的內容介紹瞭如何部署、配置和確保GitLab在Rancher的運行。這一部分中,咱們將介紹如何使用GitLab CI Multi-Runner構建容器,以及如何使用GitLab容器registry配置項目。除此以外,咱們還將涉及如何用GitLab CI創建容器並部署到Rancher上。php

使用GitLab CI Multi-Runner構建容器

GitLab CI是用於持續集成和持續交付的強大工具。它須要和Rancher配合使用,這裏咱們將部署一個執行做業的runner。git

運行Runner

部署runner有好幾種方式,不過考慮到咱們的目的是要從本身的存儲庫中創建容器,咱們將運行一個能夠直接訪問/var/run/docker.sock的Docker容器,來構建和自身同步的鏡像。github

1.在Rancher中,向你的Gitlab棧添加一個服務。
2.使用如下配置進行設置:web

  • Name: runner01
  • Image: gitlab/gitlab-runner
  • Console: None
  • Volumes:docker

    • /var/run/docker.sock:/var/run/docker.sock
    • runner01-etc:/etc/gitlab-runner

容器運行時,它將在/etc/gitlab-runner中建立一個默認配置,該配置對應咱們已經創建鏈接的卷。接下來,用你的Gitlab實例註冊runner。shell

下面操做中,我設置的配置適用於基本的runner,它能夠搭建任意做業。你還能夠將runner限制在指定的存儲庫中或是使用其餘的鏡像。這裏你能夠閱讀GitLab的文檔來了解是最適合你的環境的選項。segmentfault

配置Runner

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已經運行,那麼配置會自動地就從新加載。這裏要着重注意的是:工具

  • 輸入你的Gitlab實例的URL
  • 輸入runner令牌(在Admin / Runners中找到)
  • 給runner起一個可被識別的名字
  • 選擇runner的docker類型
  • 選擇docker:stable容器鏡像

在初始的註冊完成後,咱們須要編輯/etc/gitlab-runner/config.tom並做出調整:

  • volumes = [「/var/run/docker.sock:/var/run/docker.sock」, 「/cache」]

這樣在容器中裝載/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環境中啓動它:

  1. 在GitLab中建立一個項目。在本教程中,我給它命名爲example/demo(工做組是example,項目是demo)
  2. 克隆並修改rancher-gitlab-demo存儲庫

    $ 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手動執行此階段。

經過GitLab CI搭建容器

在develop分支,你能夠提交這些更改並將其推送到你的GitLab項目。若是一切都正常運行,你就能夠在項目的pipelines標籤下看到pipeline啓動。你能夠選擇status圖標來查看該階段下的詳細進度日誌。

若是出現了任何錯誤,GitLab CI將報告pipeline失敗,你能夠查看日誌瞭解緣由。當解決了問題並推送新的提交時,GitLab CI將啓動新的pipeline。若是錯誤是暫時的(如沒法鏈接到Docker Hub),你能夠再次運行該階段的pipeline。

若是隻想從現有的代碼運行pipeline,你能夠單擊Run Pipeline並選擇要構建的分支。

當一切都完成以後,管道會顯示Passed,你能夠在GitLab項目的Registry標籤下看到你的容器。

建立部署用戶

在使用鏡像倉庫以前,你須要將部署用戶添加到Rancher。我建議你在你想要部署的項目上建立一個具備Reporter權限的deploy用戶,而不要使用你的管理員帳戶。

  1. 單擊右上角的扳手圖標進入管理區域
  2. 單擊中間列下端的New User按鈕
  3. 建立一個名爲deploy的用戶
  4. 在Access下則說明該用戶是External的。這將給用戶提供GitLab中的限制訪問。
  5. 單擊Create User,進入彙總界面

GitLab默認會爲用戶發送登陸電子郵件,所以咱們須要編輯用戶並設置密碼。

  1. 在彙總界面上,單擊右上角的Edit
  2. 爲用戶設置密碼,接着單擊Save Changes
  3. 在GitLab導航到你的項目,單擊Settings後點擊Members
  4. 在搜索欄鍵入deploy並選擇deploy用戶
  5. 給用戶Reporter權限
  6. 點擊Add to project保存更改

如今,deploy用戶有權從你的項目的容器註冊表訪問容器。

部署容器到Rancher

咱們到目前爲止的全部步驟都是爲了這一步——從你的私有鏡像倉庫中獲取容器並將它部署到Rancher上。咱們須要作的最後一件事是添加鏡像倉庫,而後作一個新的棧和服務。

  1. 在Rancher中,單擊Infrastructure並選擇Registries
  2. 單擊Add Registry
  3. 選擇Custom
  4. 輸入你的註冊表URl(例如example.com)
  5. 輸入你的部署用戶的用戶名和密碼
  6. 單機Create

把鏡像倉庫添加到Rancher以後,你已經能夠從這些鏡像中建立服務了。

1.建立一個名爲demo的棧
2.添加一個服務,名字由你決定。讓鏡像使用你新的容器鏡像中的develop標籤

  • example.com/example/demo:develop

3.點擊Create

恭喜你!你剛剛已經用私有容器鏡像倉庫部署了項目的開發版本!

從這裏開始能夠作什麼

這是一個漫長的教程,但當全部的重要步驟完成後,你可使用已經安裝好的工具開始工做了。從如今開始你能夠作這些事情:

  • 爲你其餘的項目設置工做組。對於將要包含的項目,可使用邏輯集合,像docker或者websites同樣。
  • 將其餘項目導入GitLab
  • 設置GitLab CI來構建容器
  • 修改master分支,融合develop分支,引入.gitlab-ci.yml,而後將其推送至GitLab。更新Rancher以獲取lastest鏡像標籤。
  • 將HUB_USERNAME和HUB_PASSWORD添加到項目中,而後手動將你的鏡像推送至Docker Hub

9月27日,北京海航萬豪酒店,容器技術大會Container Day 2017即將舉行。

CloudStack之父、海航科技技術總監、華爲PaaS部門部長、恆豐銀行科技部總經理、阿里雲PaaS工程總監、民生保險CIO······均已加入豪華講師套餐!

11家已容器落地企業,15位真·雲計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊連接請戳

圖片描述

相關文章
相關標籤/搜索