Docker+Subversion+Jenkins部署.net core

Jenkins是java开发的一种持续集成工具,主要用于持续、自动的构建/测试软件等相关项目。之前公司项目一直用IIS发布和管理后台 .net core应用,之后尝试使用nginx转发远程发布就变成了一种很麻烦的事情,因而尝试使用Jenkins。服务器使用的windows server 2019,就先在个人笔记本上先踩一遍坑。本机系统为windows 10旗舰版 1903。

1.docker的安装

开启Hyper-V

windows直接搜索【启用或关闭Windows功能】(或在控制面版-程序和功能-启用或关闭Windows功能),选中Hyper-V选项,确定。


hyper

下载安装Docker Desktop for Windows

下载地址:https://hub.docker.com/editions/community/docker-ce-desktop-windows
需要注册账号,安装过程很简单,直接下一步即可。

国内镜像加速

参考:https://www.runoob.com/docker/docker-mirror-acceleration.html

启动docker

启动docker服务,在cmd或者命令行界面输入docker version用于查看当前版本信息,证明安装成功。docker --helpdocker -h可以查看帮助信息,使用docker命令--help可以查看当前命令的说明,如docker image --help

执行hello word

执行如下命令:

docker run hello-world

hello-world是镜像名,后可以跟版本号,默认为latest版本。docker会在本地镜像库中查找hello-world:latest的镜像,如果本地找不到,会从dockerhub上拉取该镜像,而后运行,在控制台界面上输出hello world。得到日志如下:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

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

在项目的 根目录 创建Dockerfile文件,没有任何后缀名,写入如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
#暴露80端口
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
#注意目录结构
WORKDIR /src
COPY ["SmartForest.Api/SmartForest.Api.csproj", "SmartForest.Api/"]
#因为项目中使用了私有nuget包,所以配置了nuget源
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版本和项目名称和已有的应该一致,如下图所示(网图,项目名称不一致):

avastar

项目创建好之后就会自带Dockerfile文件,拷贝至对应目录 即可。
在控制台进入当前目录,执行命令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的配置

拉取并运行Jenkins镜像

docker run -u root --restart=always  -d -p 8081:8080 -p 50000:50000 -v /c/myjenkinsdata:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins jenkinsci/blueocean

参数解释:
-u root使用用户root;
--restart=always 自动重启该镜像;
-d在后台运行该镜像,并打印镜像id;
-p 8081:8080 -p 50000:50000将本机8081端口和50000端口分别映射到container的8080和50000端口上;
-v /c/myjenkinsdata:/var/jenkins_home将本机C:\myjenkinsdata文件夹映射到container的/var/jenkins_home文件夹中;
-v /var/run/docker.sock:/var/run/docker.sock映射docker执行命令,使用该映射才能让Jenkins运行docker命令;
--name jenkins指定container名称;
jenkinsci/blueocean镜像名称。
执行完成命令后会在窗口中打印container id,在浏览器中通过地址+端口号,如:localhost:8081,会显示如下界面:

avastar

配置Jenkins

安装成功后访问会如下图所示:

avastar

可以在使用文本文档打开C:\myjenkinsdata\secrets\initialAdminPassword文件查看密码。或执行docker exec -it {containerid} bash其中 {containerid} 应替换为之前打印的containerId,只输入前几个字符即可;而后在bash界面中输入cat /var/jenkins_home/secrets/initialAdminPassword即可查看密码;输入exit退出bash窗口。

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

4.创建Jenkins任务

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

avastar

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

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

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

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

设置构建步骤,选择执行shell,如下所示。
avastar

贴入执行shell命令
avastar

#!/bin/bash
#docker 镜像tag/容器名字 这里都命名为这个
SERVER_NAME=wuzhouapi
#获取容器id
CID=$(docker ps | grep "${SERVER_NAME}" | awk '{print $1}')
#获取镜像id
IID=$(docker images | grep "${SERVER_NAME}" | awk '{print $3}')

# 构建docker镜像
function build(){
    if [ -n "$IID" ]; then
        echo "存在${SERVER_NAME}镜像,IID=$IID"
        echo "停止容器docker stop  $CID"
        docker stop  $CID
        echo "删除容器 docker rm $CID"
        docker rm $CID
        echo "删除镜像 docker rmi ${SERVER_NAME}"
        docker rmi ${SERVER_NAME}
        echo "构建镜像 docker build -t "${SERVER_NAME}"  ."
        docker build -t="${SERVER_NAME}"  .
    else
        echo "不存在${SERVER_NAME}镜像,开始构建镜像  docker build -t ${SERVER_NAME} . "  
        
        docker build -t="${SERVER_NAME}"  .
    fi
}

# 运行docker容器
function run(){
    build
    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}容器创建完成"
}

#入口
run 

点击保存,完毕。

5.验证是否成功

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


avastar

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


avastar

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

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