1. 程式人生 > >如何使用GitLab和Rancher構建CI/CD流水線 – Part 2

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

docker 鏡像 gitlab 配置 持續集成 部署

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


使用GitLab CI Multi-Runner構建容器


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


運行Runner


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


  1. 在Rancher中,向你的Gitlab棧添加一個服務。

  2. 使用以下配置進行設置:

  • Name: runner01

  • Image: gitlab/gitlab-runner

  • Console: None

  • Volumes:

    • /var/run/docker.sock:/var/run/docker.sock

    • runner01-etc:/etc/gitlab-runner


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


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


配置Runner


  1. 在容器中執行shell

  2. 運行gitlab-ci-multi-runner register開始註冊

  3. 按照提示信息輸入,參考下列示例(答案是粗體字)


[email protected]:/# 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.


放手去執行它們吧,如果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/rancher-gitlab-demo.git demo
$ cd demo
$ git remote set-url origin ssh:[email protected]: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

點擊Create


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


從這裏開始可以做什麽


這是一個漫長的教程,但當所有的重要步驟完成後,你可以使用已經安裝好的工具開始工作了。從現在開始你可以做這些事情:


  • 為你其他的項目設置工作組。對於將要包含的項目,可以使用邏輯集合,像docker或者websites一樣。

  • 將其他項目導入GitLab

  • 設置GitLab CI來構建容器

  • 修改master分支,融合develop分支,引入.gitlab-ci.yml,然後將其推送至GitLab。更新Rancher以獲取lastest鏡像標簽。

  • 將HUB_USERNAME和HUB_PASSWORD添加到項目中,然後手動將你的鏡像推送至Docker Hub


原文來源:Rancher Labs

本文出自 “12452495” 博客,請務必保留此出處http://12462495.blog.51cto.com/12452495/1953181

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