jenkins publish .net core application to linux server in docker

古人已用三冬足,年少今开万卷余。这篇文章主要讲述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改一改就好了.
【jenkins publish .net core application to linux server in docker】在服务器上的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即可访问成功, 大功告成!大功告成!大功告成!

    推荐阅读