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

介紹

GitLab核心是集成管理Git存儲庫的工具。好比你但願建立一個提供服務的平臺,那麼GitLab將提供強大的身份驗證和受權機制、工做組、問題跟蹤、wiki和片斷,除此以外還有公有、內部和私有存儲庫。nginx

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

這裏就有這樣一個疑問:爲何使用GitLab而不是直接使用SaaS 服務?答案只是我的品味而已。對大多數人來講,向SaaS提供商購買其提供的服務是一個很好的解決方案。你能夠專一於搭建你的應用程序,讓他們去操心維護這些工具。而若是你已擁有的基礎設施有備用容量怎麼辦?若是你只想私有化存儲庫而不想爲該權限付費時該怎麼辦?若是你想運用你的數學頭腦由本身託管來省錢該怎麼辦?若是你只想擁有你本身的數據該怎麼辦?shell

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

部署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應用添加一個服務dom

  • Image: gitlab/gitlab-ce:latest
  • Volumes:ssh

    • gitlab-etc:/etc/gitlab
    • gitlab-opt:/var/opt/gitlab
    • gitlab-log:/var/log/gitlab
  • Networkingide

    • 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: you@yourdomain.com
  • 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區域文件中,且這些記錄均指向運行均衡器的主機。(PS:這裏須要籤的域名必須是公網可解析)

部署LetsEncrypt

  • 從Rancher社區Catalog中,選擇LetsEncrypt服務。接受第一個下拉列表中的TOS,而後按如下設置準備HTTP驗證:

    • 你的Email地址: you@yourdomain.com
    • 證書名: gitlab
    • 域名: git.example.com,registry.example.com
    • 域驗證方法: HTTP
  • 單擊Launch以發佈容器。如今開始你有120秒來完成下一步。

部署負載均衡器

  • 在gitlab棧中,單擊「添加服務」旁邊的下拉菜單,而後選擇添加負載均衡器。給它取個名字,接着添加下面的服務選擇器。另外,若是你已經有了一個負載均衡器的環境,編輯它,添加下面的服務。

    • Public / HTTP
    • Port: 80
    • Path: /.well-known/acme-challenge
    • Target: letsencrypt
    • Port: 80
  • 單擊「編輯」保存你所作的變動。

監控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'] = 'git@example.com'
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
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身份登陸任何內容都是不安全的,由於該用戶名是一個衆所周知的目標。如今你是以惟一的用戶身份登陸進來的,那麼第一件事就是更改你的用戶名。

  • 點擊位於右上角、在搜索欄旁邊的扳手圖標
  • 在中間列的底部選擇管理員
  • 選擇右上角的編輯按鈕
  • 更改你的名字、用戶名和郵箱地址
  • 向下滾動並單擊「保存更改」

管理員帳戶的舊郵箱地址是admin@example.com,更改此信息只是嘗試向該帳戶發送電子郵件來通知這些更改。我敢相信example.com郵箱的人會吃驚於他們收到的電子郵件數。

  • 返回Rancher,找到你的postfix容器和Execute Shell
  • 輸入mailq,按下Enter鍵。你應該看到延遲的郵件在隊列中,注意ID
  • 輸入postsuper –d<id>,按下Enter鍵,將從隊列中刪除該消息。

禁止公開註冊

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

  • 再次點擊扳手圖像,返回到管理控制檯
  • 點擊右上角齒輪圖標的下拉菜單,選擇設置
  • 你能夠根據須要調整其中任意一項,但你須要禁用在Sign-up Restrictions下的Sign-up enabled默認值

檢查你的端口

在這個例子中,咱們使用了80、44三、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中:

  • 點擊右上角的頭像旁邊的下拉菜單,選擇設置,而後選擇SSH密鑰
  • 將你的公鑰(.pub文件中的內容)粘貼到打開頁面的框中

很快咱們將發佈該系列的第二部分,其中將介紹如何使用GitLab CI Multi-Runner構建容器,以及如何使用GitLab容器registry配置項目。除此以外,咱們還將涉及如何用GitLab CI創建容器並部署到Rancher上。


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

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

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

圖片描述

相關文章
相關標籤/搜索