AspNetCore容器化(Docker)部署(四) —— Jenkins自動化部署

来源:https://www.cnblogs.com/wu_u/archive/2019/06/25/11039371.html
-Advertisement-
Play Games

一.前言 (Jenkins、Docker、Git/Svn組建一套簡單的自動化發佈流程) 文章中用到的相關伺服器角色 二.安裝jenkins 1.Windows下安裝jenkins 各環境下安裝教程 https://jenkins.io/zh/doc/book/installing/ Windows下 ...


一.前言

 

                                                 (Jenkins、Docker、Git/Svn組建一套簡單的自動化發佈流程)

 文章中用到的相關伺服器角色

角色 環境 功能
開發機 Win10、Docker(Linux OS) 編碼、調試
發佈機(與開發機共用) Win10、Docker(Linux OS)、Jenkins 自動化部署
測試伺服器 Ubuntu、Docker 測試環境

 

 

 

 

 

 

二.安裝jenkins

1.Windows下安裝jenkins

各環境下安裝教程 https://jenkins.io/zh/doc/book/installing/

Windows下載地址:https://jenkins.io/zh/download/thank-you-downloading-windows-installer-stable

建議jinkens還是安裝在docker的宿主機上,不論是windows還是linux,容器形式安裝雖然很方便!但是後續很多坑,比如jenkins容器內共用宿主機docker和容器內運行docker-compose

下麵是docker下安裝的一些筆記(沒走通),最終選擇了宿主機下安裝jinkens

PS C:\Users\Administrator> docker run -u root -d -p 8080:8080 -p 50000:50000 -v /e/DockerData:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
c8222a3716a327ce82770aa729fe80169cbcc28c4d2ada8891cf49ed0b38f3e3
PS C:\Users\Administrator> docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                      PORTS                                              NAMES
c8222a3716a3        jenkinsci/blueocean   "/sbin/tini -- /usr/…"   About a minute ago   Up About a minute           0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   serene_feistel
66ff08eda2ae        c42e9f575fc4          "dotnet HelloWorld.d…"   2 days ago           Up 2 days                   0.0.0.0:81->80/tcp                                 netcore_helloworld
5357b641a7b1        9c18561d7ab3          "nginx -g 'daemon of…"   2 days ago           Up 2 days                   0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp           mynginx

-v /e/DockerData:/var/jenkins_home,把jenkins_home目錄(包含插件、配置、工作數據)掛載到宿主機。

這裡宿主機是windows,/e/DockerData相當於"e:\DockerData",前提是e盤必須被設置為Shared Drives,如果未設置會彈出提示。

/var/run/docker.sock:/var/run/docker.sock,映射宿主機的docker到jenkins容器。

進入jenkins容器內,查看宿主機docker信息

PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash
bash-4.4# docker version
Client:
 Version:           18.09.1-ce
 API version:       1.39
 Go version:        go1.11.4
 Git commit:        4c52b901c6cb019f7552cd93055f9688c6538be4
 Built:             Fri Jan 11 15:41:33 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

還需要安裝docker-compose,否則shell腳本通過compose來構建鏡像時會報docker-compose not found。

docker-compose安裝教程 https://docs.docker.com/compose/install/

這裡跟宿主機不同的是,要選擇在容器內的安裝方式“INSTALL AS A CONTAINER”

PS C:\Users\Administrator> docker-compose -v  #查看宿主機docker-compose版本
docker-compose version 1.23.2, build 1110ad01
PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash  #進入jenkins容器
bash-4.4# curl -L --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose   #bash腳本安裝compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   596    0   596    0     0    587      0 --:--:--  0:00:01 --:--:--   587
100  1666  100  1666    0     0    831      0  0:00:02  0:00:02 --:--:--  2127
bash-4.4# chmod +x /usr/local/bin/docker-compose
bash-4.4#
Unable to find image 'docker/compose:1.23.2' locally
1.23.2: Pulling from docker/compose
4fe2ade4980c: Pull complete                                                                                                                                                                                                                                                    658ccff8d4f1: Pull complete                                                                                                                                                                                                                                                    71166c3c8d42: Pull complete                                                                                                                                                                                                                                                    c246ed86dd59: Pull complete                                                                                                                                                                                                                                                    Digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860
Status: Downloaded newer image for docker/compose:1.23.2
bash-4.4# docker-compose -v   #查看jenkins容器內compose版本
docker-compose version 1.23.2, build 1110ad01

 

2.登入jenkins

瀏覽器打開localhost:8080

根據提示找到initialAdminPassword文件中的初始密碼

接下來根據導航依次執行“安裝預設插件” ,“創建jenkins賬號”,“登入jenkins”

 

三.創建jenkins發佈項目

1.新建Item

 

2.源碼設置

如果是私有倉庫需要加憑據Credentials

Failed to connect to repository:Error performing command:git.exe,如果有安裝git,那就是“Global Tool Configuration”配置的git路徑不對。

 

Manage Jenkins - Global Tool Configuration

 

設置正確的git.exe路徑

設置好保存後再進入helloworld項目的配置頁面。

 

3.構建觸發器和構建環境

構建觸發器,就是設置如何進行自動構建。如其他項目構建完後觸發該項目的構建、定時構建(不論有沒有代碼變更)、輪詢代碼構建(jenkins輪詢遠程倉庫有代碼變更則進行構建)。

這裡都不選,則需要在工作台使用手動(點擊按鈕)構建。

 

4.添加PowerShell腳本

linux選擇shell,windows下建議用powershell,batch command對docker命令的支持不是很友好。

安裝powershell插件

切換到“可選插件”選項卡,搜索powershell安裝

 

添加構建命令

#定義變數
$IMAGE_VERSION='latest'
$REGISTRY_USER='鏡像倉庫賬號'
$REGISTRY_PWD='鏡像倉庫密碼'
$REGISTRY_HOST='ccr.ccs.tencentyun.com'
$REGISTRY_NAMESPACE='鏡像倉庫namespace'
$SERVICE_HELLOWORLD='helloworld'
$SERVICE_MYNGINX='mynginx'
#jenkins拉取的項目預設路徑 “安裝路徑根目錄/workspace/jenkins裡面建的項目名”
$COMPOSE_PATH='D:\Program Files (x86)\Jenkins\workspace\helloworld\docker-compose.yml'

echo "------------------------------ 構建鏡像 ------------------------------"
docker-compose -f "${COMPOSE_PATH}" build

echo "------------------------------ 登錄遠程倉庫 ------------------------------"
docker login --username=${REGISTRY_USER} --password=${REGISTRY_PWD} ${REGISTRY_HOST}

echo "------------------------------ 標記鏡像 ------------------------------"
docker tag ${SERVICE_HELLOWORLD}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION}
docker tag ${SERVICE_MYNGINX}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNGINX}:${IMAGE_VERSION}

echo "------------------------------ 推送到遠程倉庫 ------------------------------"
docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION}
docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNGINX}:${IMAGE_VERSION}

echo "------------------------------ 清理None ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)

 

5.遠程SSH

安裝”Publish Over SSH“插件,安裝完之後,進入到”Manage Jenkins“ - "Configure System"中配置遠程伺服器

 

Passphrase:SSH密碼

Path to key:SSH私鑰的文件路徑

Key:私鑰串,如果“Key”和“Path to key”都設置,則“Key”的優先順序較高

Disable exec:禁止在目標機上執行命令

SSH Server 配置(指定遠程伺服器的ip,可以配置多個ssh server )

Name:SSH節點配置的名稱,在Job中使用Publish over SSH插件時,此名稱將出現在“SSH Server”中“Name”的下拉列表中,如下圖:

Hostname:通過SSH連接到的遠程主機名或IP

Username:SSH服務使用的用戶名,使用key進行連接時為key指定的用戶名

詳見插件官方介紹頁 https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin

 

添加一個docker-compose.staging.yml提交到git倉庫,用於測試環境。

version: '3.4'

services:
  helloworld:
    image: ccr.ccs.tencentyun.com/wuuu/helloworld:latest
    environment: #環境變數
      - ASPNETCORE_ENVIRONMENT=Development
    ports: #埠映射
      - "81:80"
    container_name: netcore_helloworld
    deploy:
      restart_policy: #重啟策略
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks: #指定network
      - newbridge
      
  mynginx:
    image: ccr.ccs.tencentyun.com/wuuu/mynginx:latest
    ports:
      - "80:80"
      - "801:801"
    container_name: mynginx
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - newbridge

networks:
  newbridge: #新的network
    #name: newbridge  #compose版本3.5開始才支持自定義名稱

 

繼續之前的構建,“增加構建步驟“ - ”Send files or execute commands over SSH“

Name:選擇剛剛配置的遠程伺服器”Staging_Server“

Source files:要上傳的文件的相對路徑,多個文件以逗號分隔。相對workspace的路徑(其實是相對workspace下項目的路徑),也支持表達式,如上圖中的“**/*.war”。

 如:我的項目通過jenkins git插件拉取下來,所在的目錄是D:\Program Files (x86)\Jenkins\workspace\helloworld,docker-compose.staging.yml剛好在hellworld目錄下,所以此處直接填文件名

        如果yml文件在hellowrold/mycompose/目錄下,則需要填寫mycompose/docker-compose.staging.yml

Remove prefix:文件複製時要過濾的文件夾。

Remote directory:遠程伺服器上的文件夾,此文件夾路徑是相對於“SSH Server”中的“Remote directory”。如果該文件夾不存在將會自動創建。

        由於配置Staging_Server時Remote directory沒有設置,並且時直接使用root賬戶登錄Staging_Server的,所以Remote directory路徑預設為root/

        此處填/mydokcercompose,則文件會被覆制到伺服器的/root/mydokcercompose/docker-compose.staging.yml

Exec command:shell命令

#!/bin/bash

#定義變數
REGISTRY_USER='鏡像倉庫賬號'
REGISTRY_PWD='鏡像倉庫密碼'
REGISTRY_HOST='ccr.ccs.tencentyun.com'
COMPOSE_PATH='mydockercompose/docker-compose.staging.yml'

echo ------------------------------ 登錄遠程倉庫 ------------------------------
docker login --username=$REGISTRY_USER --password=$REGISTRY_PWD $REGISTRY_HOST

echo ------------------------------ 卸載服務 ------------------------------
docker-compose -f $COMPOSE_PATH down

echo ------------------------------ 拉取鏡像 ------------------------------
docker-compose -f $COMPOSE_PATH pull

echo ------------------------------ 啟動服務 ------------------------------
docker-compose -f  mydockercompose/docker-compose.staging.yml up -d

echo ------------------------------ 清除None ------------------------------
docker rmi $(docker images -f "dangling=true" -q)

 

6.手動構建

 

7.完成

構建完成之後,查看構建日誌是否有異常

 

查看jenkins伺服器上構建的image

PS C:\Users\Administrator> docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
ccr.ccs.tencentyun.com/wuuu/helloworld   latest              4024cdbb87dc        About an hour ago   265MB
helloworld                               latest              4024cdbb87dc        About an hour ago   265MB
ccr.ccs.tencentyun.com/wuuu/mynginx      latest              daca457eb2a9        7 hours ago         109MB
mynginx                                  latest              daca457eb2a9        7 hours ago         109MB
mcr.microsoft.com/dotnet/core/sdk        2.2-stretch         e4747ec2aaff        4 weeks ago         1.74GB
mcr.microsoft.com/dotnet/core/aspnet     2.2-stretch-slim    f6d51449c477        4 weeks ago         260MB

查看演示伺服器的image和container

root@VM-16-9-ubuntu:~# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
ccr.ccs.tencentyun.com/wuuu/helloworld   latest              4024cdbb87dc        About an hour ago   265MB
ccr.ccs.tencentyun.com/wuuu/mynginx      latest              daca457eb2a9        7 hours ago         109MB
root@VM-16-9-ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS                                      NAMES
e1dc94a1886b        ccr.ccs.tencentyun.com/wuuu/mynginx:latest      "nginx -g 'daemon of…"   8 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp   mynginx
3ad3db4fbd94        ccr.ccs.tencentyun.com/wuuu/helloworld:latest   "dotnet HelloWorld.d…"   8 minutes ago       Up 8 minutes        0.0.0.0:81->80/tcp                         netcore_helloworld

瀏覽器打開演示伺服器IP:801

 

示例代碼Github地址https://github.com/wwwu/AspNetCore_Docker

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 解析json字元串有很多方式, 1 : 在網上下載json解析的dll類庫並添加引用, 調用相關方法; 2 : 使用自帶類庫JavaScriptSerializer的序列號和反序列化; 對於以上兩個方法我沒有試用過, 應該很方便很簡潔性能很高吧! 自己根據遍歷字元串找json字元串規律, 自己寫了一 ...
  • 今天在知乎上看到一個問題【為什麼在同一進程中創建不同線程,但線程各自的變數無法線上程間互相訪問?】。在多線程中,每個線程都是獨立運行的,不同的線程有可能是同一段代碼,但不會是同一作用域,所以不會共用。而共用記憶體,並沒有作用域之分,同一進程內,不管什麼線程都可以通過同一虛擬記憶體地址來訪問,不同進程也可 ...
  • 如果你跟我一樣對微軟開源了哪些項目感興趣,或者想要在微軟開源項目中貢獻代碼,那麼一定很想要一個微軟的開源項目清單列表。 微軟也考慮到了這個問題,這是同理心的體現,源自微軟現任CEO薩提亞•納德拉的對微軟的文化重塑。 不多廢話,上地址: "https://opensource.microsoft.co ...
  • 客戶機與伺服器建立連接後,發送一個請求給伺服器,請求格式為:統一資源標識符、協議版本號。伺服器收到請求的信息(包括請求行,請求頭,請求體)。伺服器接收到請求後,給予相應的響應信息,格式為一個狀態行(包括響應行,響應頭,響應體)。在internet上,http通訊通常發生在TCP/IP連接之上。預設端 ...
  • 使用EF CodeFirst連接MySql資料庫 如何使用EF CodeFirst連接MySql資料庫? 我們這篇文章介紹怎麼使用EF連接MySql 作者的環境 VS2017、Win10、MySql5.x 前言 一般在EF中,預設是使用SqlServer資料庫。為什麼我們要使用Mysql呢?一方面現 ...
  • log4net在本地執行時候,日誌正常寫入,但是發佈到伺服器上的時候,日誌就無法正常寫入 解決方案: 1.文件許可權 在發佈到伺服器上的時候,可能文件沒有寫入許可權,導致日誌無法正常寫入 打開IIS 找到發佈的文件->點擊右鍵->編輯許可權,出現該文件的屬性 點擊安全->編輯->找到IIS_IUSRS給他 ...
  • 最近寫了一個桌面程式,裡面用了些讀取系統環境變數、提取文件圖標、啟動外部程式之類的操作。 然後…………卡巴斯基就把它識別成了HEUR:Trojan.Win32.Generic………… 咱遵紀守法好程式,怎麼說是木馬就是木馬了呢??? 然而問題就是問題,該解決還是得解決…… 在各種失敗的嘗試之後,試著 ...
  • Log4net是Apache log4j框架在Microsort.NET平臺實現的框架. 幫助程式員將日誌信息輸出到各種目標(控制台,資料庫,文件等) 1.新建一個ASP.NET項目 2.新建一個 log4net.config 文件,用來放置日誌的配置,為什麼不寫在在web.Config中呢,主要是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...