介紹
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: you@yourdomain.com
-
Volumes:
- postfix-log:/var/log/postfix
- postfix-spool:/var/spool/postfix
-
Health Check:
- TCP: Port 25
運行之前,你還需完成幾個選項來配置GitLab:
- 將所有的GitLab變量添加到GITLAB_OMNIBUS_CONFIG
- 稍后設置所有變量
對於首次使用的用戶來說,我建議選擇第二項。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;'
在這些變量變更之后,意味着以下工作你已經完成了:
- 為你的Git URLs設置主機名
- 配置GitLab將HTTP反向到HTTPS
- 啟用HTTP和HTTPS兩者的HTTPS gravatar URLs(在避免內容混合的錯誤時是必要的)
- 將報告的SSH端口設為2222
- 激活來自GitLab的郵件
- 通過Postfix助手啟動郵件傳遞
- 激活一個星期保留期的夜間備份
- 啟用容器registry
- 激活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、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中:
- 點擊右上角的頭像旁邊的下拉菜單,選擇設置,然后選擇SSH密鑰
- 將你的公鑰(.pub文件中的內容)粘貼到打開頁面的框中
很快我們將發布該系列的第二部分,其中將介紹如何使用GitLab CI Multi-Runner構建容器,以及如何使用GitLab容器registry配置項目。除此之外,我們還將涉及如何用GitLab CI建立容器並部署到Rancher上。
