• jenkins publish .net core application to linux server in docker


    上一个Demo进行了单独的Jenkins远程部署, 本Demo将使用流行的Jenkins+Git+Docker进行持续部署.

    准备Linux服务器

    和上一篇Demo一样, 在Azure创建一台CentOS7服务器, 开放22端口供SSH使用, 并且开放了5000和5001端口.

    安装DotNet Core

    基于微软官方文档, SSH到服务器使用如下命令安装:

    sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    sudo yum install dotnet-sdk-3.0
    

    安装Docker

    这一步是比之前多出来的, 因为这次我们要基于Docker进行持续部署, 根据官方文件:

    # 卸载旧版本, 因为我是一台新的服务器, 这一步可以不做
    sudo yum remove docker 
                    docker-client 
                    docker-client-latest 
                    docker-common 
                    docker-latest 
                    docker-latest-logrotate 
                    docker-logrotate 
                    docker-engine
    # 安装需要用到的包
    sudo yum install -y yum-utils 
                        device-mapper-persistent-data 
                        lvm2
    # 设置docker安装仓库地址
    sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    # 安装Docker社区版引擎
    sudo yum install docker-ce docker-ce-cli containerd.io
    

    配置Jenkins

    有了上一篇Demo的基础, 这一次, 我们轻车熟路, 去配置添加一个Server即可.

    构建项目

    1. 新建一个Freestyle Project, 名字随便起, 然后确定进入配置页.
    2. 在Source Code Management选择git, 并且在Repository URL填入如下地址:
    https://gitee.com/jerryqi/JenkinsTest.git
    

    和上次不一样的一点是, 上次是在本地构建, 然后上传编译后的代码到服务器运行, 而这次是直接把源代码上传到服务器交给Docker来构建, 实际上这里绕了一个圈, 因为我的Jenkins在本地, 所以是本地下载了Gitee的代码然后上传到服务器, 实际上, 如果把Jenkins安装到服务器就可以在服务器直接拉取Gitee代码然后执行Docker脚本构建.

    1. 在Build Environment进行如下操作:
      • 勾选Delete workspace before build starts
      • 勾选Send files or execute commands over SSH after the build runs, 填写信息如下:
    Key Value
    Name 默认选择了你之前配置的Server
    Source files **
    Exec command docker build -t jenkinstest .
    docker run -d -p 80:5000 --name jenkinstestapp jenkinstest

    因为在服务器上构建, 因此这里不写build选项卡, 当然也可以在本地构建, 那么相应的把Dockerfile改一改就好了.

    在服务器上的docker构建可以参考我的另外一篇文章: 使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker

    编写Dockerfile

    因为这里在服务器上实现Docker来构建项目, 我们在项目根目录添加Dockerfile内容如下:

    # 第一部分是编译并发布项目
    # 以微软.Net Core SDK作为基础镜像, 并且以build作为别名
    FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
    # 切换build镜像工作目录到/app
    WORKDIR /app
    # 拷贝sln和csproj项目文件
    COPY *.sln .
    COPY JenkinsTest/*.csproj ./JenkinsTest/
    # Restore项目用到的包
    RUN dotnet restore
    # 拷贝项目文件到镜像里面相应到目录
    COPY JenkinsTest/. ./JenkinsTest/
    # 切换build镜像工作目录到/app/AliPay
    WORKDIR /app/JenkinsTest
    # 以Release模式发布应用到out文件夹
    RUN dotnet publish -c Release -o out
    # 第二部分是启动项目
    # 以微软.Net Core运行环境作为基础镜像, 并且以runtime作为别名
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
    # 切换runtime镜像工作目录到/app
    WORKDIR /app
    # 把build镜像里面编译出来的文件拷贝到runtime镜像
    COPY --from=build /app/JenkinsTest/out ./
    # 暴漏端口
    EXPOSE 5000
    # 启动应用
    ENTRYPOINT ["dotnet", "JenkinsTest.dll"]
    

    修正

    这里跑第一遍的时候提示如下错误:

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    

    通过如下命令查看Docker daemon状态:

    sudo service docker status
    # ● docker.service - Docker Application Container Engine
    #    Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
    #    Active: inactive (dead)
    #      Docs: https://docs.docker.com
    

    发现他的状态是inactive, 通过如下命令重启Docker:

    sudo service docker restart
    

    再次检查Docker daemon发现它变成了active. 但是再次构建是依然报上述错误.

    这个时候我直接在服务器上运行docker images, 发现如下错误:

    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied
    

    这个很明显是没有权限的问题, 这里有两种解决方法:

    • 第一种当然是sudo, 简单暴力.
    • 还有第二种方法就给他添加权限, 我这里使用第二种:
    sudo groupadd docker     #添加docker用户组
    sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
    newgrp docker     #更新用户组
    docker imges    #测试docker命令, OK
    

    最后就是, 一定要勾选Abort the build if it's stuck, 然后把超时时间改长一点, 因为第一次要拉取镜像, 默认的三分钟是不够用的.

    然后Build now, 因为我把docker的5000端口映射到了服务器的80端口, 所以直接访问服务器IP即可访问成功, 大功告成!大功告成!大功告成!

  • 相关阅读:
    IE安全级别没法定制
    将应用部署到Websphere的context root根/
    SqlServer插入慢的问题解决
    SqlServer中用@@IDENTITY取最新ID不准的问题
    分享我的戒烟经验
    Telnet发邮件过程
    .net垃圾回收和CLR 4.0对垃圾回收所做的改进之三
    Please pay more attention to the character set of your database
    翻旧贴: 什么是对象?
    C# Code in ASPX Page
  • 原文地址:https://www.cnblogs.com/jerryqi/p/11785604.html
Copyright © 2020-2023  润新知