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

前言

Docker 一直很火热,一直想把原本的 Jenkins 自动部署工具搬到 Docker 上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了 dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将 Jenkins 搬到 Docker上。为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于 Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2.0 的应用。当然笔者表示并不知道为什么 ubuntu 有这么多人青睐。接下来,笔者将从本片博文中,粗略的教大家怎么安装 Docker 和 Jenkins 并且使用 Visual Studio 2017 新建Demo 并实现自动部署

环境准备

  • 硬件配置: 1 核 1G 1M 带宽。50G 硬盘。

  • 系统环境:CentOS 7.3 (64位)

  • 其实用的就是腾讯云

安装 Docker

其实安装 Docker 的过程,大家可以到 Docker 官网找到自己相对应的安装文档进行安装,Docker 区分 CE 和 EE 的两个版本,具体这两个版本有什么区别,大家自行查阅相关资料,这里不再概述。教程用的是 CE 那么就找到对应的官方文档进行安装,以下是教程安装的步骤

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

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

配置 Docker 加速器

此步骤不是必须的,前提是你的环境有梯子或者网速可以的,那么可以忽略这个步骤。

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://mirror.ccs.tencentyun.com

使用 https://mirror.ccs.tencentyun.com 这个加速地址的前提是你必须要使用腾讯云,该地址外部无法访问,只有腾讯云才能使用此镜像地址。你可以使用 DaoCloud 加速地址,具体另行查阅相关资料。

安装 Jenkins

首先不直接从 Docker Store 上直接 Pull Jenkins 的 Image 文件,因为待会需要进行 dotnet core 的 Docker 自动部署,需要对宿主机上的 Docker 进行直接操作,那么需要挂载 Docker 给 Jenkins Image,所以现在需要自己动手编写 Dockerfile 构建自定义的 Jenkins。

# touch Dockerfile
# vim Dockerfile

插入以下内容:

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

出现以上 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 会提示成功

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

执行 docker ps -a 命令看看

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

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

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

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

##修改 /var/jenkins 文件夹权限
# chown -R 1000 /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

这时你会看到悲催的信息

容器之前已经运行过了,所以会有一个容器已经存在了。哥来给你搽眼泪。执行以下命令,删除原本 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 会发现容器已经启动了,正常了。这个时候是不是可以使用了?别着急,还有很长的路。

配置 Jenkins

打开浏览器输入地址 your IP:8080 进行访问,你会开心的看到这个界面,看到这个界面代表你的 Jenkins 已经安装成功了,但是需要进行配置,现在就教大家怎么去配置

首先,进入容器内

# docker exec -it jenkins /bin/bash

查看 /var/jenkins_home/secrets/initialAdminPassword 文件内的密码

# cat /var/jenkins_home/secrets/initialAdminPassword

其实不一定要进入容器内查看密码,可以直接在宿主机的环境下,查看 /var/jenkins//secrets/initialAdminPassword 的内容,因为之前笔者已经将这个目录挂载进 Docker 里面了。复制输出的内容,粘贴到 Administrator password,输入 exit 退出容器,此时进行下一步你会看到此界面,点击 Install suggested plugins

等待初始化完毕

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

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

为你们准备了一个地址,方便你们完成本教程:

http://git.oschina.net/wenalu/MvcTest

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

填写源代码管理

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

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

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

增加一个 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

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

打开浏览器,地址输入 your IP:8088/

遇到的问题

其实上面的篇幅为了大家能尽快的实现部署,只是简要的介绍了途中一些常犯的错误。其实在搭建这个 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


出现这个状况,当然是可以解决的。首先进入容器,然后找到官方的安装docker-compose 文档进行安装,jenkins 使用的是 Linux 直接找到对应的 Linux 安装资料即可。

第二:权限问题

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


解决上述问题,当然可以切换 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 。这里把实施过程的心得分享给大家,是因为怕很多人跟笔者一样重滔覆辙,没有人帮助的日子挺惨的,也就算为大家做些贡献吧。

作者: Loongle Tse

出处:http://www.cnblogs.com/LongJiangXie/p/7517909.html

技术交流QQ群 :238757010

关注微信公众号Reboot51 后台回复 python、自动化即可获得相应课程的试听资

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260