Ⅰ Gitlab CICD實踐(Docker+Jenkins+Nginx)
首先,准備一台伺服器,這里使用的是阿里雲的centos系統。
在伺服器上安裝git並配置密鑰,連按enter鍵。
執行cd /root/.ssh、ls命令,可以看到生成了id_rsa(私鑰)和id_rsa.pub(公鑰)。
將公鑰復制到gitlab的SSH Keys中,驗證是否可以拉取gitlab上的代碼。
如果可以正常拉取,則表示配置成功。
接下來,安裝docker。具體安裝教程請參考:CentOS Docker 安裝。
Docker Compose是一個用於定義和運行多容器Docker應用程序的工具。它通過一個單獨的文件來配置應用程序的服務,並定義這些服務之間的關系。使用Docker Compose可以輕松地在不同的環境中部署和管理復雜的多容器應用程序。
安裝Nginx和Jenkins,並創建文件目錄。
創建配置文件docker-compose.yml和nginx.conf。
開放阿里雲埠:8080、8001、8002。
執行docker啟動命令systemctl start docker。
進入到對應目錄cd /docker/compose。
執行命令docker-compose up -d。
使用docker ps -a查看容器狀態。
在瀏覽器中輸入自己的伺服器IP:8080,可以看到jenkins頁面。
查看Jenkins密碼,可以使用docker ps查看Jenkins的CONTAINER ID。
使用docker exec -it 48575ad62348 /bin/bash進入容器內。
使用cat /var/jenkins_home/secrets/initialAdminPassword查看Jenkins密碼。
輸入密碼後進入主頁,點擊安裝推薦的插件。
安裝完成後設置用戶名密碼。
實例配置,保存,進入到Jenkins首頁。
點擊Manage Jenkins=>Plugins。
點擊Installed plugins,搜索框輸入local。
如果已經安裝,執行重啟:url輸入http://ip:埠/restart,重啟後面板變為中文。
搜索GitLab,Publish Over SSH,NodeJS,選中點擊安裝,安裝完成後重啟Jenkins。
配置Publish Over SSH連接遠程伺服器。
點擊系統管理=>系統配置,找到Publish Over SSH,點擊新增。
填寫信息,點擊高級,勾選use password,將伺服器上的id_rsa(私鑰)的內容填寫在Key裡面。
將伺服器上的id_rsa.pub(公鑰)內容放在同級目錄authorized_keys文件下。
往下滑動,點擊Test Configuration,顯示success則測試成功。
配置NodeJS。
點擊全局工具配置,找到NodeJS,點擊新增NodeJS,選擇node版本,保存。
添加憑據,方便後續使用。
輸入gitlab用戶名和密碼,保存。
創建Job。
保存後點擊立即構建,查看構建日誌。
配置gitlab的webhooks。
上面的url填寫Jenkins裡面的url,還需要填寫webhooks裡面的Secret token,secret token需要在jenkins生成。
繼續點擊jenkins的高級按鈕,往下滑,點擊Generate生成secret token,填寫到gitlab的secret token(上圖所示),最後點擊保存。
驗證webhooks,返回200表示驗證成功,打開Jenkins發現已新增一條記錄。
伺服器上也已經把源碼同步過來了。
配置構建步驟。
選擇之前配置的node版本,點擊保存。
點擊立即構建,系統會自動安裝對應的nodejs版本。
增加shell命令。
點擊立即構建,驗證環境可用。
添加yarn包管理器。
點擊立即構建,驗證yarn是否成功安裝。
安裝依賴,打包yarn install,yarn build。
伺服器也同步過來了dist和node_moles目錄。
自動把打包產物部署到對應環境的目錄。
把dist目錄壓縮成dist.tar壓縮包。
通過SSH把dist.tar壓縮包發送到伺服器上。
保存後點擊構建,運行成功。
可以看到伺服器上已經有了dist目錄。
訪問ip:8001,可以正常展示頁面。
流程:gitlab的dev分支提交代碼後會觸發webhooks,通知jenkins自動構建,jenkins會拉取gitlab的dev分支代碼,執行yarn build打包成dist,之後把dist壓縮成dist.tar,通過SSH把dist.tar包發送到dev環境的目錄,並把dist.tar包解壓成dist目錄,實現dev環境更新。
生產環境的部署可以參照dev環境再配置一個。
Ⅱ 使用Docker部署GitLab
查看是否拉取成功
編寫內容
在該文件目錄下,授予 gitlab_start.sh 執行許可權
要注意埠是否被佔用
修改 gitlab_start.sh 文件,將映射到宿主機的埠改為 8088 ,或者其它沒被佔用的埠
重新運行 ./gitlab_start.sh 文件,報錯如下
這是因為之前的容器雖然沒有運行起來,但是已經創建了,把它刪除掉
重新運行 gitlab_start.sh 文件
可以看到容器成功啟動
創建 docker-compose.yml 文件,並在該文件所在的文件夾目錄下運行 docker-compose up -d
需要事先安裝 docker-compose
安裝docker-compose
注 :埠和映射目錄可根據需要修改
若開放訪問埠為 80 , external_url 可不加埠號,默認80
若以 3.1 方法創建,需要修改相關配置文件
在Gitlab容器 運行狀態 時,重啟服務,並遠程訪問網站測試
*若訪問Gitlab出現502等錯誤,使用命令檢查錯誤原因
e.g.
查看上述配置文件,查找錯誤原因
[圖片上傳失敗...(image-e9789-1636370071222)]
雖然容器啟動成功,但是卻沒辦法根據 ip:port 訪問gitlab
拉取tomcat鏡像
為了測試8088埠是否可用,先把gitlab的容器暫停
啟動tomcat容器,並將tomcat容器的8080埠映射到宿主機的8088埠
一切正常,訪問ip:8088,還是和以前一樣訪問不了
因為之前系統的防火牆一直是關閉的並且其它的服務能正常訪問,所以沒有懷疑是防火牆的問題
把防火牆打開
訪問之前能正常訪問的服務,果然沒法正常訪問。
把該服務的埠開發,正常訪問。
打開8088埠
再次訪問
返回tomcat的404頁面: HTTP Status 404 – Not Found
雖然是404頁面,但是說明此時的埠是能正常訪問的
把tomcat的容器停止運行,重新運行gitlab容器
雖然沒啟動成功,但離成功更進一步了:)
嘗試把這個容器刪除掉,再創建一次後還是得到這個錯誤。
還是訪問不了,檢查一下GitLab內部是否有問題
一切正常
我再次換成tomcat容器進行測試,發現8088埠訪問不了了。
但是在宿主機內ping本機是可以的
但是,換成 ip:8088 則不行
根據以上兩篇文章,提出 阿里雲的內網eth0 網段正好跟Docker 的虛擬網卡都是 172 網段,有沖突
觀察發現我使用的雲伺服器也是阿里雲,並且通過 ifconfig 查看
並且查看阿里雲的內網ip確實也是 172 開頭。
編輯配置文件 /etc/docker/daemon.json ,若 daemon.json 文件不存在新建即可。
重新啟動docker服務
可以看到docker0 的地址變了。
但是要注意,使用 docker 啟動的服務會默認使用 docker0 ,如果是用 docker-compose 啟動的服務則不會。上面的 br-12aa369ee4a6 對應的是docker-compose啟動的服務,可以看到還是172的網段。
docker-compose up使用自定義的網段的兩種方式(從其根源指定)
根據該文使用方法2,即修改 daemon.json 。但並不能成功訪問,我的環境是: docker:20.10.7 , docker-compose:1.24.1
後面發現訪問不成功的原因在於 docker 與防火牆之間的關系,可以關掉防火牆,開啟 docker ,不能訪問則打開防火牆。在它們之間來回試探 = =。
後面嘗試過關閉 firewalld ,打開 iptables 。
在啟用 iptables 時,一般關掉 iptables 可以正常訪問,打開則不能正常訪問。
在啟用 firewalld 時,按照 docker 和 firewalld 之間啟動關閉的順序不同,有時是開著防火牆能訪問,有時是關了防火牆能訪問。
但是容器內不能訪問外部網路,該問題現在還未解決。 有一種迂迴的解決方法就是容器使用 host 網路模式
問題 :懷疑是docker,firewalld與iptables之間的設置問題
Docker與IPtables
docker 埠映射 及外部無法訪問問題
Docker and IPtables
還有一種訪問不了GitLab的情況是埠映射和配置文件有誤。
快速的解決方法:將宿主機埠號和容器號設置相同,可參考下面的博客。
利用GitLab Docker images安裝GitLab(填坑)
[圖片上傳失敗...(image-457ad3-1636370071221)]
如果系統環境正常,安裝會十分順利,一般不會有奇怪的問題。
我在不同的伺服器安裝過
阿里雲 CentOS 7.6 : 訪問正常,但是因內存不夠出現502錯誤,容器內可正常連接外部網路
阿里雲 Alibaba Cloud Linux 2 : 可能不能正常訪問容器,容器內不能正常連接外部網路。懷疑是防火牆與docker的問題。
修改密碼: