1、准備工作
環境
- 本地:
Windows
、Docker
- 代碼倉庫:
Git
- 服務器:
Linux
、Docker
前提准備
- 創建個有
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"]
- 准備git倉庫,將項目的代碼上傳上去
- 構建有
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
- 打開jenkins,安裝推薦插件
打開 localhost:8080 ,可以看到
docker exec -it jenkins bash
dotnet --version
cat /var/jenkins_home/secrets/initialAdminPassword
<img style="width:500px;" src="https://img2018.cnblogs.com/blog/1624324/201912/1624324-20191208124555303-170629763.png" />
把密碼復制出來登錄,點擊`左邊按鈕`安裝推薦插件
<img style="width:500px;" src="https://img2018.cnblogs.com/blog/1624324/201912/1624324-20191208203620027-1679218834.png" />
> 這里時間也會比較長,如果有部分安裝失敗了,等剩余的安裝完后點擊重試即可,如果服務器上還沒有docker,現在可以去裝下,裝了的也可以連上服務器,去執行`docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim`拉取下dotnet core 3.1的鏡像,等會創建鏡像的時候就會快一點啦
插件安裝完后,會有一些創建管理員和地址配置,搞一下吧。
<img style="width:500px;" src="https://img2018.cnblogs.com/blog/1624324/201912/1624324-20191208150033306-489017996.png" />
> 如果有插件安裝失敗,點過重試安裝插件的,現在需要`docker restart jenkins`重啟下應用,然后重新打開[localhost:8080](http://localhost:8080)使用創建的管理員登錄。
2、搞好了,開始干活
哦,還有些需要安裝的插件 =.=||
需要安裝的插件:
- SCP publisher
- Publish Over SSH
- Environment Injector
進入 系統管理>插件管理->可選插件->輸入插件名稱->勾選需要插件->點擊安裝
安裝完后,設置下這些插件,進入系統管理->系統配置,
-
SCP publisher
設置
Ctrl + F 搜下SCP
找到SCP repository hosts
-SCP sites
設置位置,點新增
HostName: 服務器IP地址
Port:端口,默認22、
Root Repository Path:文件存放目錄
User Name:登錄用戶名
Password/Passphrase:密碼
-
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)
配置完后別忘記點保存。
創建構建任務第一種:自由風格的軟件項目
點擊新建任務
, 選擇構建一個自由風格的軟件項目
-
源碼管理設置
選擇Git,在Repository URL
填入Git倉庫地址
-
觸發構建器
可以配置一些定時構建等,我這里只是測試所以沒有選擇觸發器。
-
構建環境
- 勾選
Delete workspace before build starts
- 勾選Inject environment variables to the build process,存放構建是需要用到的環境變量
- 勾選
-
構建- 添加執行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
-
構建后步驟
-
上傳文件到服務器
增加構建后操作步驟
-選擇Publish artifacts to SCP Repository
,填入需要上傳的壓縮文件
這里文件目錄的基礎目錄是workspace,如果不知道具體的地址,可以先不創建構建后步驟保存下,然后點擊立即構建,等待成功后,點擊工作空間看下文件路徑是怎樣的,比如我的是這樣的:
得到壓縮文件目錄是WebApplication/bin/web-publish.tar
-
添加 服務器上要執行的shll命令 步驟
增加構建后操作步驟
- 選擇Send build artifacts over SSH
這里要新增兩個Transfers Set,在第一個
Transfers
的Exec 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會簡單快速一點,但還是花了不少時間~ 如果有什么問題,歡迎評論,大家一起學習解決。