一步步入門Jenkins+Net Core3.1+Gitlab,實現 CICD

来源:https://www.cnblogs.com/wskxy/archive/2023/02/16/17125028.html
-Advertisement-
Play Games

架構說明: 由淺入深,我們暫時不考慮分散式,安裝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的環境配置刪掉了(不成功的留言溝通)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 給大家推薦一個比Redis性能更強的數據:KeyDB KeyDB是Redis的高性能分支,側重於多線程、記憶體效率和高吞吐量。除了性能改進外,KeyDB還提供主動複製、快閃記憶體和子密鑰過期等功能。KeyDB具有MVCC架構,允許您在不阻塞資料庫和降低性能的情況下執行密鑰和掃描等查詢。 KeyDB與Redi ...
  • ​ 函數的調用、定義、參數 ​編輯 #######命名關鍵字參數沒完 abs()函數:絕對值 >>> abs(100) 100 >>> abs(-20) 20 max()函數:接收任意多個參數,並返回最大的那個 >>> max(1, 2) 2 >>> max(2, 3, 1, -5) 3 數據類型轉 ...
  • 介紹 棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相 ...
  • leetcode《圖解數據結構》劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)的解題思路和java代碼,並附上java中常用數據結構的功能函數。 ...
  • 運算符 算術運算符 算數運算符: + - * / // % ** # + var1 = 7 var2 = 90 res = var1 + var2 print(res) # 97 # - var1 = 7 var2 = 90 res = var1 - var2 print(res) # 83 # * ...
  • synchronized 是 Java 語言的一個關鍵字,它允許多個線程同時訪問共用的資源,以避免多線程編程中的競爭條件和死鎖問題。 ...
  • 一 背景 在我們的工作中我們經常有一種場景就是要使用到隊列,特別是對於這樣的一種情況:就是生產的速度明顯快於消費的速度,而且在多線程的環境下消息的生產由多個線程產生消息的消費則沒有這種限制,通過使用隊列這種方式能夠很大程度上將多線程的問題通過入隊的方式變成單個線程內的消息的聚合,然後通過單獨的線程進 ...
  • Dapper 是一個 容易上手,輕量級,靈活高效,開源的 迷你 ORM,由 Stack Overflow 團隊的 Sam Saffron 出品,你可以利用 Dapper 簡化數據訪問並且支持高性能, 還有一點, Dapper 提供了很多非同步方法,本篇我們就來聊一聊如何在 ASP.NET Core 中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...