1. 程式人生 > 實用技巧 >docker+aspnetcore+gogs+jenkisn 持續部署

docker+aspnetcore+gogs+jenkisn 持續部署

jenkins 是很好的一共CI/CD工具

我們現在用jenkins做個CD 玩玩,畢竟在開發階段,需要頻繁的提交。釋出,這樣繁瑣的工作,

如果由人工操作,會很累

安裝就不講了。看看我前面的文章

  docker 安裝:https://www.cnblogs.com/nsky/p/10372287.html

  jenkins安裝:https://www.cnblogs.com/nsky/p/13339473.html

  gogs安裝:https://www.cnblogs.com/nsky/p/13339343.html

首先我說下我遇到的坑,剛開始我是在阿里雲伺服器跑著玩的,環境都搭建好後,

我一構建開始,jenkins容器就掛了,檢視logs也沒有exit原因,

剛開始以為是許可權的問題,後來又以為是映象的原因,我用了jenkins映象自己打包

又用了jenkinszh/jenkins-zh,用了jenkins/jinkins,jenkinsci/blueocean 等沒錯都是一構建就掛

後來才發現是配置低了。我的配置是1核1G的。本來就是買來玩玩的。配置低,所以價格才便宜

我之所以不在本地玩,是想更趨向於實戰,

不過我還有一臺搬*工的是2H1G的。

既然有2臺電腦。所以,就完成2個目標

1:本地構建(jenkins和gogs都在同一臺伺服器)

2:遠端觸發構建(jenkins和gogs不在同一臺伺服器)

那麼阿里雲伺服器叫A,搬*工伺服器叫B

伺服器名稱  IP 安裝軟體
阿里雲伺服器(A) 39.105.144.51 gogs
搬*工(B) 104.128.92.44 jenkins,gogs

本地構建(jenkins和gogs都在同一臺伺服器)

這裡是操作伺服器B

機制:

就是當用戶提交程式碼到gogs上,gogs通知jenkins,構造部署。所以這裡用到了web鉤子:webhoot

其實jienkins 是把git程式碼拉取到了本地,下面可以演示出來

1:建立一共core程式,上傳到gogs上

core 專案的Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
-buster-slim AS base WORKDIR /app EXPOSE 80 #EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY . . RUN dotnet restore RUN dotnet build FROM build AS publish RUN dotnet publish "mytest.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app # 從釋出階段的中拷貝編譯結果到當前映象中 COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "mytest.dll"]

2:jenkins 安裝gogs外掛

在系統管理=》外掛管理=》可選外掛=》搜尋gogs

安裝後,開始配置,新建任務

幾個重點配置

Repository URL :填寫你的倉庫地址

Credentials:選擇你的憑據

如果你沒有新增全域性憑據,這裡下拉是沒有值的

1:可以在使用者憑據中新增

2:可以直接單擊這個新增,跳轉到新增憑據介面

輸入使用者名稱密碼。就是我們工作中拉取git的使用者名稱和密碼,其他的不填寫,單擊新增後,選擇剛新增的

提示成功了

這裡指定分支,我這是測試。預設就是master

連線上了gogs。那麼就是構建部署了。構建肯定要執行命令是吧。那麼這裡就要新增構建部署的命令

輸入命令:這命令我有參考網路修改,有很多提示的文字,自己修改,這不是重點

echo "獲取當前容器是否存在-----------------------------------------------------------------"
containerps=$(docker ps -f name=mymvc -q)
containerstop=$(docker ps -a -f name=mymvc -q)
for alpha in "$containerps";do
    if [ "$alpha" = "" ];then
    echo "檢查是否存在停止的容器-------------------------------------------------"
        for alpha1 in "$containerstop";do
          if [ "$alpha1" = "" ];then
          echo "不存指定容器-----------------------------------"
          else
          echo "存在停止了的 然後直接刪除-----------開始------------------"
          docker rm $alpha1
          echo "存在停止了的 然後直接刪除-----------完成------------------"
        fi
       done
    else
    echo "存在-停止執行 然後刪除----------------------開始-----------------"
    docker stop $alpha
    docker rm $alpha
     echo "存在-停止執行 然後刪除---------------------完成------------------"
    fi
done



echo "獲取當前映象是否存在-----------------------------------------------------------------"
dockerlist=$(docker images mvcimage:latest -q)
for alpha2 in "$dockerlist";do
  if [ "$alpha2" = "" ];then
     echo "不存在指定映象-------------------------------------------------" 
  else
       echo "存在當前指定的映象 刪除映象--------------開始-----------------------------------"
      docker rmi $alpha2
     echo "存在當前指定的映象 刪除映象--------------完成-----------------------------------"
  fi
done
echo "開始輸入工作目錄-----------------------------------------------------------------"
echo $WORKSPACE
echo "轉到專案工程目錄-----------------------------------------------------------------"
cd $WORKSPACE/myproject
echo "構建Docker映象-------------------------------開始----------------------------------"
docker build -t mvcimage .
echo "構建Docker映象-------------------------------完成----------------------------------"
echo "執行Docker容器-------------------------------------開始----------------------------"
docker run  --name=mymvc -p 8802:80 -d mvcimage

然後單擊儲存即可

jenkins是把git上的程式碼拉取到了workspace資料夾下。

所以你會看到命令中有cd $WORKSPACE

可以看看檔案具體位置。在jenkins_home/workspace下有拉取的專案

/docker/jenkins_home/workspace 這個目錄,是你掛在的目錄

如果想測試,看是否配置正確。可以單擊立即構建,我這裡就不演示了

jenkins配置完成了。然後去gogs配置

然後配置如下:推送地址中的引數,job=myproject,是必須跟我們在jenkins建立任務的名稱匹配才行

推送事件,根據自己的需求來。然後單擊新增

上面那個,是我之前測試的。可以忽略,然後單擊進去,可以測試推送下

測試成功

回到jenkins面板,看看構建記錄

進去,看控制檯輸出

看容器也已經啟動,埠是8802,嘗試訪問一下

訪問成功:

好了。接下來,開啟專案,修改下檔案,提交

至此,這樣在本地構建部署就完成了,

遠端觸發構建(jenkins和gogs不在同一臺伺服器)

說明:

阿里雲伺服器(A)上安裝了gogs

搬*工伺服器上(B)上安裝了jenkins

當有人提交程式碼給gogs,就會觸發jenkins

所以:

遠端觸發原理就是:

A觸發B。告訴B。有人提交程式碼,你需要觸發A構建程式碼,

B會把本地的一個命令檔案上傳到A,然後在A上執行這個命令,完成部署

那麼要保證A上的程式碼必須是最新的,所以在A上必定需要git操作,

現在阿里雲伺服器上的gogs是沒有任何倉庫的

把上面測試的專案新增到gogs上

在A上安裝git

yum install -y git

1.配置一個用於提交程式碼的使用者,輸入命令:

git config --global user.name "Your Name"

2.配置一個使用者郵箱,輸入命令:

git config --global user.email "[email protected]"

3.生成公鑰和私鑰,輸入命令後一路回車即可

ssh-keygen -t rsa -C "[email protected]"

公鑰路徑,待會會用到

進入gogs,倉庫設定=》管理部署金鑰

把密碼新增進去儲存

在伺服器A指定一個目錄,拉取程式碼

一段小插曲,如果clone的時候出現

用OpenSSH的人都知ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當

下次訪問相同計算機時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發出警告,

如果我們重新安裝系統,其公鑰資訊還在,連線會出現如上截圖情況

網路收集:

方法一:

rm -rf ~/.ssh/known_hosts

++++++++++++++++++

優點:乾淨利索

缺點:把其他正確的公鑰資訊也刪除,下次連結要全部重新經過認證

方法二:

vi ~/.ssh/known_hosts

刪除對應ip的相關rsa資訊(本例可知刪除53行資訊即可)

++++++++++++++++++

優點:其他正確的公鑰資訊保留

缺點:還要vi,還要找到對應資訊,稍微優點繁瑣

方法三:

清除舊的公鑰資訊

ssh-keygen-R 192.168.0.100

++++++++++++++++++

優點:快、穩、狠

缺點:沒有缺點

這樣的git算是弄好了。然後去jenkins上配置任務。

遠端觸發,需要安裝外掛:Publish Over SSH

安裝後。進入系統配置

這裡要配置被連線電腦的使用者名稱和密碼,

現在是B連線A。所以這裡配置A伺服器的地址

Passphrase:登入電腦的密碼

SSH Servers:伺服器的配置

  Name:名稱(自定義)

  Hostname:伺服器地址

  Username:使用者名稱

  Remote Directory:預設遠端伺服器的地址

這裡單獨建立個任務叫:remote

既然是遠端觸發,原始碼這裡就不用設定了

Transfers:

  Source files:原始檔地址,地址的目錄是相對於jenkins workspace的目錄,如果只需要執行命令不需要傳輸檔案的時候,此處可以為空

我這裡是上傳檔案,a.sh,那麼在workspace會有個對應的任務名稱的資料夾 remote

所以全路徑是:jenkins_home/workspace/remote/a.sh

  Remove prefix:去除的檔案地址。在Source files輸入框中填入的地址,會預設在伺服器下建立相同的資料夾,所以需要將我們不需要的資料夾在這裡剔除掉

比如:

Source files 填寫的是 u/a.sh,Remove prefix 為空,那麼就會在是這樣 /root/u/a.sh

如果Remove prefix 填寫u 就是剔除u資料夾,那麼在A伺服器上就是 /root/a.sh

  Remote directory:遠端伺服器接收檔案的地址,這裡配置的 就是在 根目錄 下

  Exec command:檔案傳輸任務執行完畢後,在遠端伺服器上執行的命令,要執行的命令,

檔案在根目錄下,那麼全路徑就是 /root/a.sh

a.sh輸入指令碼,其實就2句重點

/root/project/mytest/mytest:是我伺服器拉取git的路徑

sh publish.sh 是執行指令碼

那麼publish.sh放什麼指令碼命令呢?

就是上面測試過的打包命令

那麼在/root/project/mytest/mytest 中建立一個publish.sh

幾個重點,先切目錄,git下

然後在切到Dockerfile 目錄下。如果不想切。那麼得改打包的命令,指定Dockerfile目錄

docker build  -f  /root/project/mytest/mytest/Dockerfile  -t mvcimage /root/project/mytest/mytest

最後別忘了在A服務上gogs配置weghook

http://104.128.92.44:8080/gogs-webhook/?job=remote

然後自己測試,我就不演示了

當然。你這裡的jenkins遠端觸發,也可以直接執行伺服器A上的指令碼,不一定要上傳一個指令碼

總得來說,就研究和嘗試了這麼多,

哎,寫部落格太費時了。以後要少寫。。。。。