本文面向具有一定gitlab和K8S使用經(jīng)驗(yàn)的讀者
持續(xù)集成,持續(xù)部署和持續(xù)交付是現(xiàn)代開發(fā)團(tuán)隊(duì)中越來越受歡迎的主題。 它們共同使團(tuán)隊(duì)能夠在任何提交時構(gòu)建,測試和部署代碼。 這些方法的主要好處是能夠通過自動化管道更頻繁地發(fā)布更高質(zhì)量的代碼。 困難的部分是建造這樣的管道。 我們需要選擇,學(xué)習(xí),安裝,集成和維護(hù)各種工具。
GitLab提供了一個功能齊全的工具生態(tài)系統(tǒng),使我們能夠在幾分鐘內(nèi)創(chuàng)建自動化管道! 從源代碼管理到問題跟蹤和CI,我們發(fā)現(xiàn)一切都在一個屋檐下,完全集成并隨時可用,如下圖所示:

在本文我們將在Kubernetes集群上創(chuàng)建一個使用GitLab CI構(gòu)建,測試和部署的Spring Boot應(yīng)用程序。 Spring Boot允許開發(fā)人員構(gòu)建生產(chǎn)級獨(dú)立應(yīng)用程序,如典型的CRUD應(yīng)用程序,以最少的配置公開RESTful API,從而大大減少了使用Spring Framework所需的學(xué)習(xí)曲線。 Kubernetes是一個受Google Borg啟發(fā)的開源容器協(xié)調(diào)器,可以編排,擴(kuò)展和管理容器化應(yīng)用程序。
一、環(huán)境介紹

在正式介紹之前,先需要準(zhǔn)備的環(huán)境清單:
- 搭建好Kubernetes集群
- GitLab實(shí)例
- 啟用GitLab容器注冊表。
- 創(chuàng)建一個Gitlab項(xiàng)目
- Gitlab 能夠訪問Kubernetes apiserver。
- 配置并啟用GitLab CI runner。
- kubectl 配置了Kubernetes集群訪問。
- Kubernetes ServiceAccount
二、啟用GitLab容器注冊表
參考官方文檔:https://docs.gitlab.com/ee/administration/container_registry.html
注釋:在GitLab 8.8中引入。 - 在GitLab 8.9中添加了Docker Registry清單v1支持,以支持早于1.10的Docker版本。
默認(rèn)情況下,容器注冊表在HTTPS下工作。使用HTTP是可能的,但不建議使用,超出了本文檔的范圍。
2.1 在現(xiàn)有GitLab域下配置Container Registry
如果注冊表配置為使用現(xiàn)有的GitLab域,則可以在端口上公開注冊表,以便您可以重用現(xiàn)有的GitLab TLS證書。
假設(shè)GitLab域是https://gitlab.example.com注冊表向外界公開的端口4443,如果您正在使用Omnibus GitLab,這里是您需要設(shè)置的內(nèi)容gitlab.rb。
注意: 請注意選擇與Registry偵聽的端口不同的端口(5000默認(rèn)情況下),否則會遇到?jīng)_突。
2.1.1 Omnibus GitLab安裝
1、/etc/gitlab/gitlab.rb應(yīng)該包含注冊表URL以及GitLab使用的現(xiàn)有TLS證書和密鑰的路徑:
registry_external_url 'https://gitlab.example.com:4443'
請注意registry_external_url在現(xiàn)有GitLab URL下如何監(jiān)聽HTTPS,但在另一個端口上。
如果TLS證書沒有在/etc/gitlab/ssl下面,并且/etc/gitlab/ssl/gitlab.example.com.crt 的證書沒有,/etc/gitlab/ssl/gitlab.example.com.key的密鑰也沒有,那么你可以自定義證書路徑,取消注釋以下行,寫你的證書路徑:
registry_nginx['ssl_certificate'] = "/path/to/certificate.pem"
registry_nginx['ssl_certificate_key'] = "/path/to/certificate.key"
配置實(shí)例:
egrep -v '(#|^$)' /etc/gitlab/gitlab.rb
external_url '[https://gitlab.xxxxx.com](https://gitlab.xxxxx.com/)'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '[shzabbix@xxxxxxx.com](mailto:shzabbix@xxxxxxx.com)'
gitlab_rails['gitlab_email_display_name'] = '隨便取'
gitlab_rails['gitlab_email_reply_to'] = 'noreply'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "[smtp.qiye.163.com](http://smtp.qiye.163.com/)"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "shzabbix@xxxxxx.com"
gitlab_rails['smtp_password'] = "*******************"
gitlab_rails['smtp_domain'] = "[163.com](http://163.com/)"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
registry_external_url '[https://registry.xxxxx.com:4443](https://registry.xxxxx.com:4443/)'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "registry.xxxxx.com"
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = false #由于開發(fā)使用的是內(nèi)網(wǎng),我這里配置不轉(zhuǎn)發(fā)到https,http和https共存。
nginx['ssl_client_certificate'] = "/etc/gitlab/ssl/ca.crt"
nginx['ssl_certificate'] = "/etc/gitlab/ssl/xxxxx.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/xxxxx.com.key"
nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
nginx['ssl_prefer_server_ciphers'] = "on"
nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
registry_nginx['enable'] = true
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/xxxxx.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/xxxxx.com.key"
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"
}
注意:作者使用的證書都是購買的,自建的沒測試過。 如果沒法買,建議用letsencrypt的免費(fèi)證書
2、保存文件并重新配置GitLab以使更改生效。
gitlab-ctl reconfigure
gitlab-ctl restart
3、現(xiàn)在我們訪問項(xiàng)目界面會出現(xiàn)注冊表

三、創(chuàng)建一個GitLab項(xiàng)目
要引導(dǎo)Spring Boot應(yīng)用程序,我們導(dǎo)航到Spring Initializr Web頁面并使用預(yù)先選擇的Spring Boot Version生成Gradle項(xiàng)目。Gradle是Java項(xiàng)目中新興的項(xiàng)目管理工具,用于定義依賴項(xiàng)和構(gòu)建生命周期。我們作為Group離開并設(shè)置為工件名稱。我們選擇依賴項(xiàng),它支持使用Tomcat和Spring MVC進(jìn)行完全堆棧Web開發(fā),以及實(shí)現(xiàn)某些生產(chǎn)級功能的依賴項(xiàng),這些功能對監(jiān)視和管理應(yīng)用程序(如運(yùn)行狀況檢查和HTTP請求跟蹤)非常有用。
我們將生成項(xiàng)目,名稱為actuator-sample.zip下載到我們的機(jī)器上。

通過如下命令行啟動Spring Boot應(yīng)用程序。
cd actuator-sample
gradle bootRun