Docker+Subversion+Jenkins在windows server部署.net core

之前在本机测试并成功完成Docker+Subversion+Jenkins部署 .net core(教程见https://www.jianshu.com/p/63b79dad2a10),然而服务器是阿里云虚拟出来的windows server 2019系统,并不能开启Hyper-V,提示处理器没有所需的虚拟化功能。因而再次开始踩坑。

1.安装docker

由于不支持hyper-v,服务器不能安装Docker Desktop,只能安装Docker Engine。可以访问 docker hub查看说明。
打开powershell,运行如下命令:

Install-Module DockerMsftProvider -Force
Install-Package Docker -ProviderName DockerMsftProvider -Force

而后重启服务器,就可以尝试运行hello-world container查看docker是否安装成功了。

PS> docker container run hello-world:nanoserver

Unable to find image 'hello-world:nanoserver' locally
nanoserver: Pulling from library/hello-world
bce2fbc256ea: Pull complete
3ac17e2e6106: Pull complete
8cac44e17f16: Pull complete
5e160e4d8db3: Pull complete
Digest: sha256:25eac12ba40f7591969085ab3fb9772e8a4307553c14ea72d0e6f98b2c8ced9d
Status: Downloaded newer image for hello-world:nanoserver

Hello from Docker!
This message shows that your installation appears to be working correctly.

注意,该版本的docker只能运行windows container,并不能运行linux container。

2.在docker中执行 .net core程序

这部分大部分与上一篇文章一致,dockerfile内有部分不同,我可以放心大胆的复制粘贴啦。
在项目的 根目录 创建Dockerfile文件,没有任何后缀名,写入如下:

#拉取镜像不同了
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-nanoserver-1903 AS base
#使用管理员权限,不然build的时候会有Access Denied的错误
USER Administrator
WORKDIR /app
EXPOSE 80

#拉取镜像不同了
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-nanoserver-1903 AS build
#使用管理员权限,不然build的时候会有Access Denied的错误
USER Administrator
WORKDIR /src
#注意文件路径
COPY ["SmartForest.Api/SmartForest.Api.csproj", "SmartForest.Api/"]
COPY ["nuget.config", ""]
RUN dotnet restore "SmartForest.Api/SmartForest.Api.csproj"
COPY . .
#注意文件路径
WORKDIR "/src/SmartForest.Api"
RUN dotnet build "SmartForest.Api.csproj" -c Release -o /app/build

##
FROM build AS publish
RUN dotnet publish "SmartForest.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SmartForest.Api.dll"]

或者有个简单的办法,使用vs重新创建项目,选择启用docker支持,注意.net core版本和项目名称和已有的应该一致,如下图所示:

image

项目创建好之后就会自带Dockerfile文件,添加USER Administrator,拷贝至对应目录 即可。
在控制台进入当前目录,执行命令docker build -t {tag} .,其中 {tag} 是该镜像的标签,可根据需求填写或省略,例如api. 代表当前目录,不可以省略。
运行成功后输入命令docker images可以查看全部镜像,会新增两个镜像:

REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
api                                    latest              abcc825dfaaa        53 seconds ago      406MB
                                               a9b1ff0f01f7        55 seconds ago      2.7GB

其中上面为发布的镜像,下面的为编译的镜像,可以使用docker image prune -f删除中间镜像。

3.安装Jenkins

因为该版本docker不能运行linux container,而关于windows container的资料又很少,而且可能又有其他的坑要踩,我选择直接把Jenkins安装到服务器上。
官网地址:http://Jenkins-ci.org/
windows稳定版下载地址:http://mirror.serverion.com/jenkins/windows-stable/
下载解压完成后,直接点击安装,直接默认下一步即可。完成后浏览器会自动打开localhost:8080,出现如下界面:

Jenkins等待界面

等待片刻后,自动跳转:
Jenkins解锁

使用记事本打开上述路径文件即可查看密码。
这里有个小插曲,因为服务器上8080和8081端口已经被GeoServer占用,所以上面界面打不开,可以修改安装目录下的jenkins.xml文件,将其修改为8082端口。

  -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8082 --webroot="%BASE%\war"

等待片刻后安装推荐组件即可,然后继续等待zzZZ
安装完成后创建管理员账户和配置实例后就可以继续了。

4.创建Jenkins任务

点击左上角创建任务,出现如下界面,选择自由风格软件项目,填入名称,确定。

image

输入项目描述,选择源码管理,我这里使用的是公司的svn。
image

第一次添加项目时需要添加授权方式,点击右边添加之后下拉选择即可。
image

下一步设置构建触发器,这个是用来设置什么时间或者动作触发构建行为,有定时构建、轮询SCM、远程触发构建。
这里选择轮询SCM构建,即为Jenkins在定期轮询代码管理器,看是否有版本更新,如果有则立即开始构建项目。日程表填写H/2 * * * *,代表每2分钟轮询一次,注意*之间有空格(这是crontab语法,教程可以查看https://www.cnblogs.com/yoyoketang/p/11167181.html)。
image

继续设置构建环境,选择在开始构建前删除工作空间,设置构造超时时间,如果超时即为认定构建失败。

设置构建步骤,选择执行windows批处理命令,如下所示。
image

贴入执行windows批处理命令
image

::docker 镜像/容器名字名字 这里都命名为这个
set SERVER_NAME=wuzhouapi
::获取容器id
for /F "delims=" %%i in ('docker ps -aqf "name=%SERVER_NAME%"') do ( set CID=%%i)
::获取镜像id
for /F "delims=" %%i in ('docker images -q "%SERVER_NAME%"') do ( set IID=%%i)

if not defined CID goto build
echo "停止容器docker stop  %CID%"
docker stop  %CID%
echo "删除容器 docker rm %CID%"
docker rm %CID%

if not defined IID goto build
echo "删除镜像 docker rmi -f %SERVER_NAME%"
docker rmi -f %SERVER_NAME%

:build
echo "构建镜像 docker build -t "%SERVER_NAME%"  ."
docker build -t="%SERVER_NAME%" .

echo "docker run创建容器... docker run -d --restart=always  --name=%SERVER_NAME% -p 8086:80   %SERVER_NAME%"
docker run -d --restart=always --name=%SERVER_NAME% -p 8086:80   %SERVER_NAME%
echo "删除中间镜像 docker image prune -f"
docker image prune -f
echo "%SERVER_NAME%容器创建完成"

点击保存,完毕。
可以在左侧点击立即构建如下图,或修改代码上传触发构建过程。


image

等待构建完成,如果出现红色圆圈代表构建失败,出现蓝色代表成功。


image

如果失败可以在控制台输出查看失败原因,排除错误后重新再来。

你可能感兴趣的:(Docker+Subversion+Jenkins在windows server部署.net core)