這是咱們使用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場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊連接請戳