jenkins publish .net core application to linux server in docker

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

准备Linux服务器

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

安装DotNet Core

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

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

安装Docker

这一步是比以前多出来的, 由于此次咱们要基于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便可.json

构建项目

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

和上次不同的一点是, 上次是在本地构建, 而后上传编译后的代码到服务器运行, 而此次是直接把源代码上传到服务器交给Docker来构建, 实际上这里绕了一个圈, 由于个人Jenkins在本地, 因此是本地下载了Gitee的代码而后上传到服务器, 实际上, 若是把Jenkins安装到服务器就能够在服务器直接拉取Gitee代码而后执行Docker脚本构建.centos

  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改一改就行了.bash

在服务器上的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"]

修正

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

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便可访问成功, 大功告成!大功告成!大功告成!

相关文章
相关标签/搜索