ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )

Posted DotNet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )相关的知识,希望对你有一定的参考价值。


来源:Loongle

cnblogs.com/LongJiangXie/p/7517909.html



1、更新一下包吧,多更无害


# sudo yum -y update


2、安装所需的软件包 (其实这些腾讯云都具备了,只不过怕有些阉割版的系统缺少,所以贴上命令,安装过的使用该命令不会造成伤害)


# sudo yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2


3、使用稳定版的仓库(当然可以使用最新版或测试版的仓库,这个需要官方的说明)


# sudo yum-config-manager \

    --add-repo \

    https://download.docker.com/linux/centos/docker-ce.repo


4、安装Docker ce 


# sudo yum install docker-ce


tips:在生产系统上,您应该安装特定版本的Docker CE,而不是始终使用最新版本。


5、启动Docker


# sudo systemctl start docker


6、docker通过运行hello-world 映像验证是否正确安装。


# docker run hello-world


如果出现以下的界面,就代表安装成功


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


FROM jenkins


USER root

#清除了基础镜像设置的源,切换成腾讯云的jessie源

#使用非腾讯云环境的需要将 tencentyun 改为 aliyun

RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \

  && echo "deb http://mirrors.tencentyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \

  && echo "deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \

  && echo "deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list

#更新源并安装缺少的包

RUN apt-get update && apt-get install -y libltdl7 && apt-get update


ARG dockerGid=999


RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group 


# 安装 docker-compose 因为等下构建环境的需要

RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose


RUN chmod +x /usr/local/bin/docker-compose


如果不安装 libltdl7 会导致如下这个问题,原因是jenkins容器内部没有这个包


docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory

Build step 'Execute shell' marked build as failure


在Jenkins操作宿主的Docker的时候会出现拒绝访问的问题,其实就是容器的jenkins用户没有权限访问容器外的docker命令,所以 RUN命令 需要把Jenkins用户加入到Docker用户组


构建Image


# docker build . -t auto-jenkins


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


出现以上 Successfully 内容代表安装Jenkins成功


在启动Jenkins时,需要先创建一个Jenkins的配置目录,并且挂载到docker 里的Jenkins目录下


# mkdir -p /var/jenkins_home


运行 Jenkins


# docker run --name jenkins -p 8080:8080 -p 50000:50000 \

    -v /var/run/docker.sock:/var/run/docker.sock \

    -v $(which docker):/bin/docker \

    -v /var/jenkins_home :/var/jenkins_home \

    -d auto-jenkins


第一行:构建一个名称为jenkins的容器  -p 是容器运行开放端口


第二行 和第三行: -v 是将宿主机的docker文件挂载进容器里


第四行:建立宿主机的配置目录,挂载进docker容器里,这样容器里的Jenkins配置目录文件就会映射出来


第五行:使用auto-jenkins Image 并且后台启动


这个时候 run Jenkins 会提示成功


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


执行 docker ps 命令后,发现什么都没有


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


执行 docker ps -a 命令看看


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


执行 docker start -a jenkins 让容器前台输出运行信息的方式运行


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


不难看出其实 Jenkins 启动已经是可以了,只是权限问题导致这个错误的信息。


现在需要看一下Jenkins官方的Dockerfile 


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


 知道问题原因,贴上代码了。


##修改 /var/jenkins 文件夹权限

# chown -R 1000 /var/jenkins


继续执行运行Jenkins 代码


# docker run --name jenkins -p 8080:8080 -p 50000:50000 \

    -v /var/run/docker.sock:/var/run/docker.sock \

    -v $(which docker):/bin/docker \

    -v /var/jenkins_home:/var/jenkins_home \

    -d auto-jenkins


这时你会看到悲催的信息


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


容器之前已经运行过了,所以会有一个容器已经存在了。哥来给你搽眼泪。执行以下命令,删除原本 run 出来的容器


# docker rm -f jenkins


删除完容器后,继续执行运行命令


# docker run --name jenkins -p 8080:8080 -p 50000:50000 \

    -v /var/run/docker.sock:/var/run/docker.sock \

    -v $(which docker):/bin/docker \

    -v /var/jenkins_home:/var/jenkins_home \

    -d auto-jenkins


出现一串字符后,执行 docker ps 会发现容器已经启动了,正常了。这个时候是不是可以使用了?别着急,还有很长的路。


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


等待初始化完毕 


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


到了这一步,自己随缘去填吧。


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


使用VS2017创建一个ASP.NET Core 2.0 Web应用程序,并将代码上传到git。这里笔者就不演示上传代码的过程步骤了。


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )



新建一个自由风格的软件项目,并填名称 点击 OK


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


填写源代码管理


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


勾选 Poll SCM 设置拉取Git 上代码的间隔,笔者这里是两分钟拉取一次


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


勾上 Delete workspace before build start 是设置构建前删除工作区


勾上 Abort the build if it's stuck 是设定构建的超时时间,如果构建使用的时间超过设定的时间,那么就认为这次的构建是失败的。笔者这里超时设置的是10分钟


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


增加一个Execute Shell 脚本,并填写以下脚本内容


#!/bin/bash

# 获取短版本号


GITHASH=`git rev-parse --short HEAD`

echo ---------------Remove-Orphans------------------

docker-compose -f ./docker-compose.yml -f ./docker-compose.override.yml  -p dockercompose4255153253317384266 down --rmi local --remove-orphans

echo ------------------Config-----------------------

docker-compose -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 config

echo ------------------Build------------------------

docker-compose -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 up --build

echo ---------------Publishing...------------------

docker-compose -f "./docker-compose.yml" -f "./docker-compose.override.yml"  -p dockercompose4255153253317384266 up -d --build


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


应用保存,回到项目界面上。点击立即构建进行部署工作 SUCCESS


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )



ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )



 


遇到的问题


其实上面的篇幅为了大家能尽快的实现部署,只是简要的介绍了途中一些常犯的错误。


其实在搭建这个CI环境的时候遇到不止这些问题,比如说一开始的 Dockerfile 内容并不像教程中的一样。一开始是这样的:


FROM jenkins


USER root

#清除了基础镜像设置的源,切换成阿里云的jessie源

RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \

  && echo "deb http://mirrors.tencentyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \

  && echo "deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \

  && echo "deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list

#更新源并安装缺少的包

RUN apt-get update && apt-get install -y libltdl7 && apt-get update


ARG dockerGid=999


RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group 


USER jenkins


当你如果在网上找到其他教程,教你如何安装jenkins,而你使用了类似于这个内容的Dockerfile,那么会在Jenkins构建编译的时候产生如下两个错误:


第一:缺少 docker-compose 


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


出现这个状况,当然是可以解决的。


首先进入容器,然后找到官方的安装docker-compose文档进行安装,jenkins使用的是Linux直接找到对应的Linux安装资料即可。


第二:权限问题


从容器内手动安装 docker-compose 会出现无法安装的情况,原因是Jenkins 用户没有安装docker-compose 的权限


ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )


解决上述问题,当然可以切换 root 用户,但是笔者使用最笨最直接的方式,从构建镜像的时候就直接不使用 jenkins 用户,所以教程中并没有最后一句 USER jenkins 。这样做目的是让教程步骤更顺利


tips:正式生产环境不建议直接切换到 root 用户运行


运行 Jenkins 命令一开始是这样的:


# docker run --name jenkins -p 8080:8080 -p 50000:50000 \

    -v /var/run/docker.sock:/var/run/docker.sock \

    -v $(which docker):/bin/docker \

    -v /var/jenkins:/var/jenkins_home \

    -d auto-jenkins


这样会造成构建的时候找到一个根本不存在的目录上



其实就是第三句 将/var/jenkins 改成 /var/jenkins_home 就解决这个问题了。


此时此刻,如果你曾经遇到过这样的问题,哥现在已经给你擦眼泪了。


当然这里不仅仅有这些问题的存在,只是有一部分在做这个教程的时候没有截图,就不再阐述了。


写在最后


其实笔者曾Google过这些教程,但是一无所获,发觉挺多人使用Ubuntu的,就是找不到一个Centos的案例。


当然笔者也不知道他们为什么喜欢使用Ubuntu。这里把实施过程的心得分享给大家,是因为怕很多人跟笔者一样重滔覆辙,没有人帮助的日子挺惨的,也就算这么久以来为社区做些贡献吧。


看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能 

以上是关于ASP.NET Core 2.0 自动化发布和部署(Centos7 & Docker & Jenkins )的主要内容,如果未能解决你的问题,请参考以下文章

七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

跟着老桂学ASP.NET Core 2.0

ASP.NET Core 2.0 新特性全新体验

ASP.Net Core 2.0 FileTable 使用

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

Razor Page–ASP.NET Core 2.0 新功能