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上的指令碼,不一定要上傳一個指令碼
總得來說,就研究和嘗試了這麼多,
哎,寫部落格太費時了。以後要少寫。。。。。