主頁 > .NET開發 > 本地Docker Jenkins構建dotnet core web應用到Linux服務器 Docker上

本地Docker Jenkins構建dotnet core web應用到Linux服務器 Docker上

2020-09-20 01:37:32 .NET開發

1、準備作業

環境

  • 本地: WindowsDocker
  • 代碼倉庫:Git
  • 服務器:LinuxDocker

前提準備

  1. 創建個有dockerfile檔案的dotnet core 3 web專案
    新建一個dotnet 3.0的web專案,在專案檔案夾添加Dockerfile檔案,內容如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "WebApplication.dll"]
  1. 準備git倉庫,將專案的代碼上傳上去
  2. 構建有dotnet core 3.0 環境jenkins
FROM jenkins/jenkins:lts
# 切換root用戶安裝東西
USER root
# Show distro information!
RUN uname -a && cat /etc/*release
RUN apt-get update
RUN apt-get install -y curl libunwind8 gettext apt-transport-https
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list'
RUN apt-get update
RUN apt-get install -y dotnet-sdk-3.1
# 切換回來jenkins用戶
USER jenkins

因為jenkins里面是沒有dotnetcore環境的,所以需要本地創建個支持dotnetcore環境的,
找個地方新建檔案夾,創建dockerfile檔案,內容如上,
4. build鏡像并運行容器

docker build . -t jenkins_dotnet

這里等待時間會比較長~


# 運行剛剛構建好的容器
docker run -d  --name jenkins -p 8080:8080 jenkins_dotnet
  1. 打開jenkins,安裝推薦插件
    打開 localhost:8080 ,可以看到
docker exec -it jenkins bash
dotnet --version
cat /var/jenkins_home/secrets/initialAdminPassword
<img style="width:500px;" src=https://www.cnblogs.com/xiao24/p/"https://img2018.cnblogs.com/blog/1624324/201912/1624324-20191208124555303-170629763.png" />

把密碼復制出來登錄,點擊`左邊按鈕`安裝推薦插件


> 這里時間也會比較長,如果有部分安裝失敗了,等剩余的安裝完后點擊重試即可,如果服務器上還沒有docker,現在可以去裝下,裝了的也可以連上服務器,去執行`docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim`拉取下dotnet core 3.1的鏡像,等會創建鏡像的時候就會快一點啦

插件安裝完后,會有一些創建管理員和地址配置,搞一下吧,


> 如果有插件安裝失敗,點過重試安裝插件的,現在需要`docker restart jenkins`重啟下應用,然后重新打開[localhost:8080](http://localhost:8080)使用創建的管理員登錄,

2、搞好了,開始干活

哦,還有些需要安裝的插件 =.=||

需要安裝的插件:

  • SCP publisher
  • Publish Over SSH
  • Environment Injector

進入 系統管理>插件管理->可選插件->輸入插件名稱->勾選需要插件->點擊安裝

安裝完后,設定下這些插件,進入系統管理->系統配置,

  1. SCP publisher設定
    Ctrl + F 搜下 SCP找到SCP repository hosts-SCP sites設定位置,點新增
    HostName: 服務器IP地址
    Port:埠,默認22、
    Root Repository Path:檔案存放目錄
    User Name:登錄用戶名
    Password/Passphrase:密碼

  2. Publish Over SSH 設定
    Ctrl + F 搜下 SCP找到SCP repository hosts-SSH Server設定位置,點新增再點高級勾選上 Use password authentication, or use a different key
    Name:名稱
    Hostname:服務器IP地址
    Username:登錄用戶名
    Remote Directory:遠程目錄
    Passphrase / Password:密碼
    Port:連接埠(默認22)

配置完后別忘記點保存,

創建構建任務第一種:自由風格的軟體專案

點擊新建任務, 選擇構建一個自由風格的軟體專案

  1. 原始碼管理設定
    選擇Git,在Repository URL填入Git倉庫地址

  2. 觸發構建器
    可以配置一些定時構建等,我這里只是測驗所以沒有選擇觸發器,

  3. 構建環境

    1. 勾選Delete workspace before build starts
    2. 勾選Inject environment variables to the build process,存放構建是需要用到的環境變數
  4. 構建- 添加執行shell步驟
    增加構建步驟-執行shell,腳本如下:

#切換目錄
cd ./WebApplication
#還原nuget包
dotnet restore
#編譯
dotnet build
#洗掉之前發布檔案
cd ./bin
rm -rf web-publish
rm -f web-publish.tar
cd ..
#發布
dotnet publish -o ./bin/web-publish
#洗掉組態檔
cd ./bin/web-publish
cp ../../Dockerfile .
rm -rf config
cd ..
#壓縮
tar -cvf web-publish.tar web-publish 
  1. 構建后步驟

    1. 上傳檔案到服務器
      增加構建后操作步驟-選擇Publish artifacts to SCP Repository ,填入需要上傳的壓縮檔案

      這里檔案目錄的基礎目錄是workspace,如果不知道具體的地址,可以先不創建構建后步驟保存下,然后點擊立即構建,等待成功后,點擊作業空間看下檔案路徑是怎樣的,比如我的是這樣的:

      得到壓縮檔案目錄是WebApplication/bin/web-publish.tar

    2. 添加 服務器上要執行的shll命令 步驟

    增加構建后操作步驟- 選擇 Send build artifacts over SSH

    這里要新增兩個Transfers Set,在第一個TransfersExec command輸入創建鏡像腳本:

# 作業目錄
WORK_DIR="/root/publish/WebApplication";
cd ${WORK_DIR}
# 洗掉原有發布檔案夾
rm -rf web-publish;
# 解壓
tar -xvf web-publish.tar;
#洗掉檔案壓縮包
rm -f web-publish.tar;
#切換生成目錄
cd web-publish/
#備份鏡像
#停止容器
docker stop ${DOCKER_CONTAINER_NAME};
#洗掉容器
docker rm ${DOCKER_CONTAINER_NAME};
#洗掉鏡像
docker rmi $(docker images | grep ${DOCKER_IMAGE_NAME});
#創建鏡像
docker build -t ${DOCKER_IMAGE_NAME} ./;
在第二個`Transfers`的`Exec command`,輸入運行容器命令:
# 運行容器
docker run -d -p 8001:80 --name  ${DOCKER_CONTAINER_NAME}  ${DOCKER_IMAGE_NAME}

到這里所有的設定都已經搞好啦,別忘記點擊保存,點擊立即構建 測驗一下吧~

創建構建任務第二種:流水線[pipeline]

TODO:評論有位哥推薦流水線 可視化會好一點,馬上動手嘗試下~

首先創建任務,選擇流水線:

與自由風格的一樣也有觸發器,

然后就沒看到有其他設定有點懵 ?? ~百度了下發現流水線主要是用腳本寫的

粗略研究下流水線語法,然后在網上找了個 SSH Pipeline Steps 流水線插件, 可以以SSH方式登錄遠程機器,集sshCommand、sshPut、sshGet 、sshRemove等功能,很符合我的需求到插件管理安裝下

然后半懂不懂的開始擼腳本,不過基本上就是把自由風格的腳本復制過來,按照流水線腳本的風格,以及配合這個插件修改下,

流水線腳本如下:

def getHost(){
    def remote = [:]
    remote.name = 'aliyun-1'
    remote.host = '你的服務器IP'
    remote.user = '你的服務器登錄用戶名'
    remote.port = 22
    remote.password = '你的服務器登錄用戶密碼'
    remote.allowAnyHosts = true
    return remote
}

pipeline {
    agent {label 'master'}
    environment{
        def server = '';
        def local_work_dir="./WebApplication";
        def webpublish_name="web-publish";
        def ssh_work_dir="/root/publish/WebApplication";
        def ssh_docker_image_name="dotnet/webdemo";
        def ssh_docker_container_name="webdemo";
    }   
    stages {
        stage('init-server'){
            steps {
                script {                 
                   server = getHost()                                   
                }
            }
        }
        stage('git-checkout') {
            steps {
                git url: 'https://github.com/LXD24/DemoReposiroty.git'
            }
        }
        stage('dotnet-build-publish'){
            steps {
                sh  '''  
                #切換目錄
                cd ${local_work_dir};
                #還原nuget包
                dotnet restore;
                #編譯
                dotnet build;
                #洗掉之前發布檔案
                cd ./bin;
                rm -rf ${webpublish_name};
                rm -f ${webpublish_name}.tar;
                cd ..;
                #發布
                dotnet publish -o ./bin/${webpublish_name};
                #洗掉組態檔
                cd ./bin/${webpublish_name};
                cp ../../Dockerfile .;
                rm -rf config;
                cd ..;
                #壓縮
                tar -cvf ${webpublish_name}.tar ${webpublish_name}; 
                 '''
              echo '---------------- build complete ! ----------------' 
            }
        }
        stage('ssh-put'){
            steps {
                script {
                    sshPut remote: server, from: "${local_work_dir}/bin/web-publish.tar", into: "${ssh_work_dir}"
                    echo '---------------- sshput complete ! ----------------' 
                }
            }
        } 
        stage('ssh-build-docker-image'){
            steps {
                script {
                    sshCommand remote: server, command: """
                    # 作業目錄
                    cd ${ssh_work_dir}
                    # 洗掉原有發布檔案夾
                    rm -rf ${webpublish_name};
                    # 解壓
                    tar -xvf ${webpublish_name}.tar;
                    #洗掉檔案壓縮包
                    rm -f ${webpublish_name}.tar;
                    #切換生成目錄
                    cd ${webpublish_name}/
                    #備份鏡像
                    #停止容器
                    docker stop ${ssh_docker_container_name};
                    #洗掉容器
                    docker rm ${ssh_docker_container_name};
                    #洗掉鏡像
                    docker rmi \$(docker images | grep ${ssh_docker_image_name});
                    #創建鏡像
                    docker build -t ${ssh_docker_image_name} ./;
                    """
                    echo '---------------- ssh-build-docker-image complete ! ----------------' 
                }
            }
        }
        stage('ssh-docker-run'){
            steps {
                script {
                    sshCommand remote: server, command: """
                    docker run -d -p 8001:80 --name  ${ssh_docker_container_name}  ${ssh_docker_image_name}
                    """
                    echo '---------------- ssh-docker-run complete ! ----------------' 
                }
            }
        }

    }
}

成果展示 ??

自由風格的

流水線的

dotnet core web應用

第一次研究這個,本來以為本地用Docker直接拉取個jenkins會簡單快速一點,但還是花了不少時間~ 如果有什么問題,歡迎評論,大家一起學習解決,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/84797.html

標籤:.NET Core

上一篇:aspnet boilerplate 隨筆二

下一篇:dotnetcore執行shell腳本

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more