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

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

介紹

GitLab核心是整合管理Git儲存庫的工具。比如你希望建立一個提供服務的平臺,那麼GitLab將提供強大的身份驗證和授權機制、工作組、問題跟蹤、wiki和片段,除此之外還有公有、內部和私有儲存庫。

GitLab強大之處在於,它包含強大的持續整合(CI)引擎和Docker容器映象倉庫,讓使用者從開發到釋出都使用相同的實用工具。它還有兩個更強大的開源軟體實用工具:Prometheus負責監控,Mattermost負責和團隊溝通。該平臺有著堅實的API並能和多個現有第三方系統整合,如:JIRA,Bugzilla,Pivotal,Slack,HipChat,Bamboo等。

這裡就有這樣一個疑問:為什麼使用GitLab而不是直接使用SaaS 服務?答案只是個人品味而已。對大多數人來說,向SaaS提供商購買其提供的服務是一個很好的解決方案。你可以專注於搭建你的應用程式,讓他們去操心維護這些工具。而如果你已擁有的基礎設施有備用容量怎麼辦?如果你只想私有化儲存庫而不想為該許可權付費時該怎麼辦?如果你想運用你的數學頭腦由自己託管來省錢該怎麼辦?如果你只想擁有你自己的資料該怎麼辦?

由內部提供服務可以讓你有更多的時間管理它們並讓它們之間相互通訊來消除風險,這就是GitLab的出眾之處。僅需要一次點選和幾分鐘的配置,你就可以啟動並執行一個完整的解決方案。

部署GitLab

Rancer的Catalog包含了安裝最新版GitLab CE的條目。它假設你有一個主機,希望為HTTP/HTTPS直接開啟80和443埠,並且開啟一個埠對映到容器內的22埠。

Catalog條目會根據你提供的值設定環境變數GITLAB_OMNIBUS_CONFIG。然後GitLab在釋出時將這些值併入配置。對於非常基本的GitLab部署,Catalog提供的選擇是完全足夠的,不過我仍希望向你展示更多的內容…

在本教程中,我們將部署GitLab CE,不過我們不會開啟任何埠。主機埠非常昂貴,因此稍後我們會使用一個負載均衡器。我們將配置HTTPS和Docker Registry,並將其與Rancher配合使用。

  1. 建立一個名為gitlab的新應用
  2. 向gitlab應用新增一個服務
    • Image: gitlab/gitlab-ce:latest
    • Volumes:
      gitlab-etc:/etc/gitlab
      gitlab-opt:/var/opt/gitlab
      gitlab-log:/var/log/gitlab
    • Networking
      Set a specific host name: git
    • Health Check
      HTTP: Port 80
      Path: GET /HTTP/1.0
  3. 向postfix服務中新增一個配對
    • Image: tozd/postfix
    • Environment:
      MY_NETWORKS:10.42.0.0/16, 127.0.0.0/8
      ROOT_ALIAS:
      [email protected]
    • Volumes:
      postfix-log:/var/log/postfix
      postfix-spool:/var/spool/postfix
    • Health Check:
      TCP: Port 25

執行之前,你還需完成幾個選項來配置GitLab:

  1. 將所有的GitLab變數新增到GITLAB_OMNIBUS_CONFIG
  2. 稍後設定所有變數

對於首次使用的使用者來說,我建議選擇第二項。GitLab提供的gitlab.rb檔案在預設設定下文件已經很豐富,如果你之前沒有接觸過GitLab,參考這份檔案就可以得到大量功能的說明介紹。

接著,單擊Launch鍵,Rancher將抓取映象並呈現給你。

設定SSL解除安裝

Rancher在抓取映象的時候,我們來用HTTPS新增一個負載均衡器。為此,我們首先要建立一個LetsEncrypt容器,然後將其新增到負載均衡器中,等待證書註冊。註冊完成後,將GitLab的配置新增到負載均衡器上。

在這個例子中,我將使用域名“example.com”,GitLab的主機名設定為“git”,Docker Registry的主機名設定為“regitstry”。在執行下一步前需確保你已經將相應的記錄新增到DNS區域檔案中,且這些記錄均指向執行均衡器的主機。

部署LetsEncrypt

  1. 從Rancher社群Catalog中,選擇LetsEncrypt服務。接受第一個下拉列表中的TOS,然後按以下設定準備HTTP驗證:
    • 你的Email地址: [email protected]
    • 證書名: gitlab
    • 域名:git.example.com,registry.example.com
    • 域驗證方法: HTTP
  2. 單擊Launch以釋出容器。現在開始你有120秒來完成下一步。

部署負載均衡器

  1. 在gitlab棧中,單擊“新增服務”旁邊的下拉選單,然後選擇新增負載均衡器。給它取個名字,接著新增下面的服務選擇器。另外,如果你已經有了一個負載均衡器的環境,編輯它,新增下面的服務。
    • Public / HTTP
    • Port: 80
    • Path: /.well-known/acme-challenge
    • Target: letsencrypt
    • Port: 80
  2. 單擊“編輯”儲存你所做的變更。

監控LetsEncryt容器的日誌,兩分鐘後,就可以獲得它已經註冊了兩個域的證書的報告。如果你收到狀態403或503的錯誤報告,那麼需要檢查負載均衡器配置,確認設定無誤。LetsEncrypt容器將重新啟動並繼續嘗試註冊證書。註冊成功後,你就可以在Rancher介面中的基礎設施選項卡中找到該證書。

到這為止我們已經準備好通過負載均衡器向GitLab新增SSL支援:

  1. 編輯負載均衡器
  2. 新增以下服務規則:
    • Public / HTTP
      Host: git.example.com
      Port: 80
      Target: gitlab
      Port: 80
    • Public / HTTPS
      Host: git.example.com
      Port: 443
      Target: gitlab
      Port: 80
    • Public / HTTPS
      Host: registry.example.com
      Port: 443
      Target: gitlab
      Port: 80
    • Public / TCP
      Port: 2222
      Target: gitlab
      Port: 22
  3. 單擊“編輯”儲存你所做的更改。

配置GitLab

GitLab的配置儲存在容器中的/etc/gitlab/gitlab.rb下。當我們啟動服務時,我們建立了一個Docker卷用於持久化儲存這些資料。在Rancher中,找到你的GitLab容器,使用Execute Shell登入。將儲存地址改為/etc/gitlab,然後編輯gitlab.rb。

在gitlab.rb中有很多變數可以調整GitLab的行為。這裡每一個部分都包含了一個指向GitLab文件的連結,文件描述了該服務的功能以及每個變數的調整。

在本教程中,需要找到以下變數,更改或者取消它們的註釋:

external_url ‘https://git.example.com’
gitlab_rails['gitlab_ssh_host'] = 'git.example.com’
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_reply_to'] = '[email protected]'
gitlab_rails['gravatar_plain_url'] = 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gravatar_ssl_url'] = 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'postfix'
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_domain'] = 'yourdomain.com'
gitlab_rails['smtp_authentication'] = false
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = '/var/opt/gitlab/backups'
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_pg_schema'] = 'public'
gitlab_rails['backup_keep_time'] = 604800
registry_external_url 'https://registry.example.com’
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = 'registry.example.com'
gitlab_rails['registry_api_url'] = 'http://localhost:5000'
gitlab_rails['registry_key_path'] = '/var/opt/gitlab/gitlab-rails/certificate.key'
gitlab_rails['registry_path'] = '/var/opt/gitlab/gitlab-rails/shared/registry'
gitlab_rails['registry_issuer'] = 'omnibus-gitlab-issuer'
registry['enable'] = true
registry['token_realm'] = 'https://git.example.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
 'Host' => '$http_host_with_default',
 'X-Real-IP' => '$remote_addr',
 'X-Forwarded-For' => '$proxy_add_x_forwarded_for',
 'X-Forwarded-Proto' => 'https',
 'X-Forwarded-Ssl' => 'on',
 'Upgrade' => '$http_upgrade',
 'Connection' => '$connection_upgrade'
}
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 80
registry_nginx['listen_https'] = false
registry_nginx['proxy_set_headers'] = {
 'Host' => '$http_host',
 'X-Real-IP' => '$remote_addr',
 'X-Forwarded-For' => '$proxy_add_x_forwarded_for',
 'X-Forwarded-Proto' => 'https',
 'X-Forwarded-Ssl' => 'on'
}
registry_nginx['custom_gitlab_server_config'] = 'proxy_cache_convert_head off;'

在這些變數變更之後,意味著以下工作你已經完成了:

  1. 為你的Git URLs設定主機名
  2. 配置GitLab將HTTP反向到HTTPS
  3. 啟用HTTP和HTTPS兩者的HTTPS gravatar URLs(在避免內容混合的錯誤時是必要的)
  4. 將報告的SSH埠設為2222
  5. 啟用來自GitLab的郵件
  6. 通過Postfix助手啟動郵件傳遞
  7. 啟用一個星期保留期的夜間備份
  8. 啟用容器registry
  9. 啟用GitLab的配置和必需的標題,讓GitLab知道它是在SSL負載均衡器之後

儲存此檔案,接著輸入gitlab-ctl reconfigure,按Enter鍵重新配置GitLab。GitLab將重建它的配置,重啟那些需要的服務。

登入

現在你已經準備好了!在你的瀏覽器中輸入https://git.example.com,會出現一個要求你輸入密碼的介面。這裡預設使用者是root,如果你設定了密碼,系統將要求你重新登入。

恭喜你!你有了一個正在執行的GitLab例項!

現在還有一些需要我們從GitLab內部做的工作來鞏固它,請你接著讀下去。

鎖定它

我建議你去做以下變更操作:

更改root使用者名稱

以root身份登入任何內容都是不安全的,因為該使用者名稱是一個眾所周知的目標。現在你是以唯一的使用者身份登入進來的,那麼第一件事就是更改你的使用者名稱。

  1. 點選位於右上角、在搜尋欄旁邊的扳手圖示
  2. 在中間列的底部選擇管理員
  3. 選擇右上角的編輯按鈕
  4. 更改你的名字、使用者名稱和郵箱地址
  5. 向下滾動並單擊“儲存更改”

管理員賬戶的舊郵箱地址是[email protected],更改此資訊只是嘗試向該賬戶傳送電子郵件來通知這些更改。我敢相信example.com郵箱的人會吃驚於他們收到的電子郵件數。

  1. 返回Rancher,找到你的postfix容器和Execute Shell
  2. 輸入mailq,按下Enter鍵。你應該看到延遲的郵件在佇列中,注意ID
  3. 輸入postsuper –d,按下Enter鍵,將從佇列中刪除該訊息。

禁止公開註冊

下一步的更改將使Internet不再接管你的新GitLab例項,也不能再將其用於惡意的目的。

  1. 再次點選扳手影象,返回到管理控制檯
  2. 點選右上角齒輪圖示的下拉選單,選擇設定
  3. 你可以根據需要調整其中任意一項,但你需要禁用在Sign-up Restrictions下的Sign-up enabled預設值

檢查你的埠

在這個例子中,我們使用了80、443、2222埠。GitLab不需要主機上的其他埠,不過2222埠並不是通用埠。你需要確認你已經在防火牆中打開了它(2222埠)。

這會有一個很棒的GitLab安裝過程。你可以立即為你的專案啟動它。是的,在GitLab中還有很多事情要做!

新增你的SSH金鑰

儘管你可以通過HTTPS使用GitLab,然而使用SSH指令執行則更為常見。在執行此操作之前,需要將你的SSH公鑰新增到GitLab,這樣它會識別你的身份。如果你沒有SSH金鑰,你可以用下列程式碼製作一個(Linux或Mac系統上):

ssh-keygen -b 2048

儘可能使用密碼口令確保安全——你的金鑰有以特權使用者身份登入的許可權,如果膝上型電腦遭到入侵,你也不願為攻擊者提供訪問級別。(如果你不想使用密碼口令或處理SSH代理,請訪問https://krypt.co上優秀的Kryptonite專案)

使用預設值(或選擇新的金鑰名稱)儲存,接著在GitLab中:

  1. 點選右上角的頭像旁邊的下拉選單,選擇設定,然後選擇SSH金鑰
  2. 將你的公鑰(.pub檔案中的內容)貼上到開啟頁面的框中

很快我們將釋出該系列的第二部分,其中將介紹如何使用GitLab CI Multi-Runner構建容器,以及如何使用GitLab容器registry配置專案。除此之外,我們還將涉及如何用GitLab CI建立容器並部署到Rancher上。

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

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

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

這裡寫圖片描述