架構說明: 由淺入深,我們暫時不考慮分散式,安裝Jenkins到用戶伺服器進行CICD 需要兩台伺服器 Gitlab:192.168.232.128:12080 源代碼倉庫,可以參考《安裝gitlab》 用戶伺服器:192.168.232.130, 通過Jenkins自動構建服務:1、git clo ...
架構說明:
由淺入深,我們暫時不考慮分散式,安裝Jenkins到用戶伺服器進行CICD
需要兩台伺服器
Gitlab:192.168.232.128:12080
源代碼倉庫,可以參考《安裝gitlab》
用戶伺服器:192.168.232.130,
通過Jenkins自動構建服務:1、git clone源碼
2、Dockerfile編譯發佈生成鏡像
3、shell控制更新服務
1、前期準備
1.1用戶伺服器:CentOS系統
安裝Docker、Git環境
yum install -y docker-ce-18.06.0.ce-3.el7 #docker安裝高版本,不然AS base這些命令無法使用,詳細安裝步驟參考《安裝docker & 配置dotnet core 項目》 yum install -y git
1.2創建測試項目,長傳給gitlab
我的項目如下:
需要做幾步操作
1)定義站點埠,比如2202
Program
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseUrls("http://*:2202"); webBuilder.UseStartup<Startup>(); });
2)添加Dockerfile
記住一點,用VS生成的Dockerfile支持文件,一定要和.sln同目錄
(我就是VS生成在了MyApi/MyApi/Dockerfile,導致Docker build的時候找不到目錄,然後進入無止境的修改Dockerfile內部命令的目錄,最後發現只要保持和.sln同一級,就不會出錯)
2、使用Jenkins之前,先進行一個簡單的嘗試
將源文件打包成images,並生成容器服務,只有手動執行能成功,才能為後面Jenkins執行提供保障
cd /mysoft #自己建個目錄存一下 git clone http://192.168.232.128:12080/gitlab-instance-9d489b45/myapi.git cd myapi docker build -t myapi:V1.0 . docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0
build的時候可能會發生不成功的情況,自己根據情況進行修正
(其實無非就是docker版本和目錄的問題,嚴格按照上面說的做,基本沒問題)
[root@localhost mysoft]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a443b859a696 myapi:V1.0 "dotnet MyApi.dll" 18 minutes ago Up 18 minutes 80/tcp, 443/tcp, 0.0.0.0:2202->2202/tcp myapi-server
正常運行,嘗試訪問一下:
成功!!!
3、安裝Jenkins
yum安裝,官網步驟
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install fontconfig java-11-openjdk yum install jenkins
預設的是8080埠,打開頁面會進行初始化,
初始化完成後,先不著急安裝插件,做一些配置修改吧
1)修改網路協議
Jenkins的預設插件下載源地址為:https://updates.jenkins.io/update-center.json,有可能因為https的限制,導致一些插件下載失敗,
將https改成http即可
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
或者替換為國內的插件下載源地址,如
https://mirror.xmission.com/jenkins/updates/update-center.json
2)修改網路判定地址
Jenkins在下載插件之前會先檢查網路,通過訪問https://www.google.com來判斷,防止外網訪問延時,可用將其改為http://www.baidu.com
vim /var/lib/jenkins/updates/default.json
好了,回到界面,使用預設密碼:登錄->安裝預設插件->創建用戶...(最後截個圖,前面的步驟忘記截圖了)
4、構建我們的第一個任務吧
選擇【新建Item】->
【描述】隨便寫
【編碼管理】選擇git,輸入地址,添加登錄賬號,指定分支要保持和gitlab上的名稱一致
【構建觸發器】,先不填,手動觸發就行
【構建環境】,勾選build之前刪除工作目錄
【Build Steps】
選擇Execute shell
shell如下,這個很簡單,主要是先簡單跑起來,後面再改
echo "====開始構建====" cd /var/lib/jenkins/workspace/myapi #clone會存在workspace下麵 docker build -t myapi:V1.0 . docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0 echo "====構建結束===="
(先把2創建容器和鏡像刪除掉,不然構建會衝突)
構建產生的問題:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post
原因:jenkins調用docker需要授權
[root@localhost myapi]# sudo usermod -a -G docker jenkins
[root@localhost myapi]# systemctl restart jenkins
成功!!!
5、完善shell
#!/bin/bash echo "====開始構建====" cd /var/lib/jenkins/workspace/myapi #clone會存在workspace下麵 #刪除容器 docker ps -a | grep "myapi-server" if [ $? -eq 0 ];then docker container stop myapi-server docker container rm myapi-server fi docker build -t myapi:V1.0 . docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0 echo "====構建結束====" echo "====刪除虛懸鏡像====" docker rmi $(docker images -q -f dangling=true)
指令說明
1、#!/bin/bash:指定shell命令,需要以這個開頭
2、$? :指上一條指令的執行結果,成功為0,失敗為1,可用來判斷是否有返回結果
3、虛懸鏡像,鏡像名為<none>,build的時候舊版鏡像會被新版鏡像替代,變成虛懸鏡像
-q:精確匹配ID或者Name
-f:強制刪除
dangling:虛懸的意思
6、使用jenkins進行遠程伺服器服務構建
環境搭建:1)伺服器:192.168.232.129,安裝Docker,待用
2)Jenkins伺服器安裝Maven:yum install maven -y
3)Jenkins安裝插件:Maven Integration、SSH
Maven:構建maven任務
SSH:訪問遠程主機
4)配置Maven環境
Global Tool Configuration最底部,切記取消自動安裝
mvn -v:可用查看MAVEN_HOME
5)SSH連接伺服器配置
end、碰到的一些錯誤記錄
1)啟動jenkins不成功,提示:
[root@localhost ~]# systemctl start jenkins Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details. [root@localhost ~]# systemctl status jenkins.service ● jenkins.service - Jenkins Continuous Integration Server Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled) Active: failed (Result: start-limit) since 六 2023-02-18 20:46:51 CST; 15s ago Process: 3566 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE) Main PID: 3566 (code=exited, status=1/FAILURE) 2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service: main process exited, code=exited, status=1/FAILURE 2月 18 20:46:51 localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server. 2月 18 20:46:51 localhost.localdomain systemd[1]: Unit jenkins.service entered failed state. 2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service failed. 2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service holdoff time over, scheduling restart. 2月 18 20:46:51 localhost.localdomain systemd[1]: Stopped Jenkins Continuous Integration Server. 2月 18 20:46:51 localhost.localdomain systemd[1]: start request repeated too quickly for jenkins.service 2月 18 20:46:51 localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server. 2月 18 20:46:51 localhost.localdomain systemd[1]: Unit jenkins.service entered failed state. 2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service failed.
通過一下命令來查看詳細錯誤
[root@localhost init.d]# cd /etc/init.d [root@localhost init.d]# ./jenkins start Starting Jenkins Running with Java 8 from /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre, which is older than the minimum required version (Java 11). Supported Java versions are: [11, 17] See https://jenkins.io/redirect/java-support/ for more information. [失敗]
我們明明安裝的java11,這地方怎麼是java8?
vim /etc/init.d/jenkins #查看一下jenkins環境文件
#存在以下jdk路徑配置 candidates=" /etc/alternatives/java /usr/lib/jvm/java-1.8.0/bin/java /usr/lib/jvm/jre-1.8.0/bin/java /usr/lib/jvm/java-11.0/bin/java /usr/lib/jvm/jre-11.0/bin/java /usr/lib/jvm/java-11-openjdk-amd64 /usr/bin/java "
jdk安裝了兩個版本,我們刪掉一個
[root@localhost ~]# rpm -qa | grep java java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64 java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64 java-1.8.0-openjdk-devel-1.8.0.362.b08-1.el7_9.x86_64 javassist-3.16.1-10.el7.noarch tzdata-java-2022g-1.el7.noarch java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64 javamail-1.4.6-8.el7.noarch javapackages-tools-3.4.1-11.el7.noarch java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64 python-javapackages-3.4.1-11.el7.noarch [root@localhost ~]# yum remove java-1.8.0-openjdk-devel-1.8.0.362.b08-1.el7_9.x86_64 java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64 java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64
重啟成功,可用把java8的環境配置刪掉了(不成功的留言溝通)