Jenkins部分

首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/

我们安装官网教程安装好jenkins,安装教程略....

嗯?不是说好手把手么?你妹的.

好好好,我们还是来手把手教程好了.

首先安装JDK8

添加安装源之后直接apt-get install就好,下面是ubuntu的安装命令,其他系统自己玩一下就好.


sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer

下载jenkins.war + 启动Jenkins

下载链接:http://mirrors.jenkins.io/war-stable/

在这里面找最新的下载,我当前最新的应该是2.107.2

下载好了jenkins.war之后,在当前目录创建一个jenkins-home文件夹,设置JENKINS_HOME环境变量为jenkins-home(不设置也可以,默认在~/.jenkins)


wget http://mirrors.jenkins.io/war-stable/2.107.2/jenkins.war;
mkdir ~/jenkins-home;
export JENKINS_HOME=~/jenkins-home;
tmux;
java -jar jenkins.war

一般建议开个后台进程来跑jenkins,免得终端退出之后jenkins就死掉了.

所以上面我先打开了tmux之后再跑java -jar jenkins.war.

如下图:

接着留意一下initialAdminPassword的输出


Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation: XXXXXXXXXXXXXX This may also be found at: /root/jenkins-home/secrets/initialAdminPassword

这个时候访问当前主机的8080端口已经可以看到jenkins正在启动了,稍等片刻就可以看到jenkins登录页.

这个时候把上面的XXXXXXXXXXXXXX复制出来,输进去点击继续配置jenkins账号密码信息之类的.

接着安装默认插件.

这里估计也要等几分钟不等,看你的机器性能和网络速度.

安装好了之后会进入配置登录账号密码,安装提示配置就完事.

最后进入jenkins页面是这样的.

到现在我们已经把jenkins跑起来了,也有了一些常用的插件.

我们先去把dotnet core docker 编译发布相关的东西弄好之后再回来继续做jenkins任务.

dotnet core docker 打包

在项目目录下新建Dockerfile文件,内容如下:


FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app # copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore # copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out # build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "你的dotnet core程序.dll"]

这个Dockerfile基本就是把当前目录的文件拷贝到aspnetcore-build镜像中,再里面编译好之后再发布到aspnetcore:2.0镜像中,

最后指定运行你的dotnet core程序

来源:https://github.com/DaoCloud/dotnet-docker-samples

docker build + run 脚本(非必须,可以使用jenkins中脚本编译替代)

HouseCrawler.Web为例,


#!/bin/sh
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
cd ~/code/58HouseSearch/HouseCrawler.Core/HouseCrawler.Web;
git pull --rebase origin master;
docker stop house-web;
docker rm house-web;
docker build -t house-web:$image_version .;
docker images;
docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile --restart=always --name house-web -d house-web:$image_version;
docker logs house-web;

通过上面这个build+run脚本,我们已经把dotnet core程序编译好了,并且打包成了docker images,还直接跑起来了.

但是我们想要的应该是自动化编译部署,而且上面我们都把jenkins跑起来了,所以....

jenkins job配置

新建Job

打开jenkins首页,左侧选择"新建任务"(newJob),如下图:

给新的job取个名字,然后选择"构建自由风格的软件项目",如图:

添加源码仓库

确认之后进入Job配置页面,源码管理里面选择git,如图:

如果git仓库是需要权限的话需要配置一下权限,我一般简单粗暴直接把jenkins主机的公钥添加到git仓库里面,所以这里直接配置成'From the Jenkins master ~/.ssh',也可以用账号密码访问等等的.

"Branch Specifier (blank for 'any') "默认master分支,根据自己的需求填入不同的分支.

构建触发器和构建环境先跳过,我们不管,待会弄.

构建

点击"添加构建步骤",选择"Execute shell",然后能看到如下图:

还记得我们上一步的脚本么?修改一下源码路径再放进去.

# 切换到源码目录,对应在jenkins-home的workspace下面
cd ~jenkins-home/workspace/项目名称/Dockerfile所在目录;
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
# 停止之前的docker container
docker stop house-web;
# 删除这个container
docker rm house-web;
# build镜像并且打上tag
docker build -t house-web:$image_version .;
docker images;
# 把刚刚build出来的镜像跑起来
docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile --restart=always --name house-web -d house-web:$image_version;
docker logs house-web;

如果jenkins主机和程序运行主机不在一台机器上,建议直接在把上面的脚本放在运行主机上,命名成 start_XXX.sh.

上面的命令直接就是成了

ssh username@发布主机的IP '~/start_XXX.sh'

ps:记得在jenkins主机配置ssh免登陆

构建触发器

构建触发器就是我们选择什么时候来触发构建任务,有几种方案可以做.

  1. 使用 Build periodically,定时 or 隔N久去拉一次代码构建
  2. Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有变化就去执行构建
  3. GitHub hook trigger for GITScm polling 或者其他Git平台提供的webhook
  4. 安装Generic Webhook Trigger插件之后,使用其他平台的webhook来触发构建任务.

我这里选择第4种方案,安装Generic Webhook Trigger插件,下面马上回告诉你为什么这样做的.

Generic Webhook Trigger插件在"系统管理-管理插件-可选插件"里面直接搜"Generic Webhook Trigger"安装就可以.

从上一步的构建步骤里面的脚本中我们就知道,其实我们现在要不就在jenkins主机上docker build,要不就在发布目标主机上build,

build过程比较慢而且还会产生镜像在本机or目标主机上,docker images也没有被管理起来.

有什么好的办法么?嗯,还真有.直接用阿里云"容器镜像服务"来构建镜像

使用阿里云-容器镜像服务

首先登录阿里云,然后进入容器镜像服务,地址是https://cr.console.aliyun.com/

首次进入估计需要创建一个命名空间,一般用公司名或者你的名字就完事.

接着选择"创建镜像仓库".

选地区-选命名空间-填仓库名称(就是镜像名称)-填摘要-设置代码源(支持GitHub/阿里云code/Bitbucket/私有Gitlab/本地Git等等,给个授权就完事)

构建设置选择"代码变更时自动构建镜像",然后选一下构建分支为你想要的分支,填入Dockerfile在源码中的路径,然后保存

接着我们进入管理平台看一下.

点击一下"立即构建",然后查看一下日志.

这个时候,我们用docker pull registry-internal.cn-hangzhou.aliyuncs.com/你的命名空间/你的镜像名称 就可以拉到这个阿里云build成功的镜像了.

镜像build的问题解决了,那么我们怎么自动把镜像发布到我们的运行主机呢?

这时候webhook又出来了.

jenkins webhook触发配置

我们看阿里云镜像构建服务里面,有一项是webhook的,官方介绍在这里:阿里云-webhook管理

这里就需要填入我们的webhook地址,还记得前面我无端端选择的第四种方案,然后让大家跟着安装的Generic Webhook Trigger插件么?

我们就是用这货来为我们提供webhook API.

理一下流程:

git仓库代码变化 ->阿里云容器构建服务启动 -> 构建好镜像之后触发webhook -> jenkins收到阿里云的webhook之后触发job执行部署脚本 ->部署脚本使用阿里云镜像run起来 ->完事.

我们继续配置Generic Webhook Trigger.

Generic Webhook Trigger支持的命名触发URL格式是这样的:

http://jenkins登录用户名:token授权码@jenkins IP:8080/generic-webhook-trigger/invoke?token=触发器名称

jenkins登录名和token在"账号-设置-API Token-Show API Token..."里面能看到,找出来之后填到上面去就可以.

最后一个token参数其实就是"构建触发器"中"触发远程构建"的参数,建议使用job名字.这里的配置大概是这样的:

最后我们还需要在jenkins全局安全设置中取消勾选“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)"选项,这样阿里云webhook才能过得来.

手动在浏览器中访问一下http://jenkins登录用户名:token授权码@jenkins IP:8080/generic-webhook-trigger/invoke?token=触发器名称

如果对应的jenkins Job能正常开始执行,说明整个流程已经ok了.

最后我们回到上面"阿里云-容器镜像服务-对应镜像仓库-webhook-添加记录"

PS:webhook名称不要带特殊字符or "-"之类的,不然一直保存失败而且还不会提示你是因为名字不合法,下午被这个坑了半个小时.

到这里,我们基本大功告成了.

最后我们再改一下jenkins的脚本,不在本地build docker了,直接拿阿里云镜像服务构建出来的镜像跑就可以.

# 停止之前的docker container
docker stop house-web;
# 删除这个container
docker rm house-web;
docker pull 你的阿里云镜像地址;
# 把刚刚build出来的镜像跑起来
docker run --restart=always --name 你的contianer名称 你的阿里云镜像地址;

总结一下我们做了什么

  1. 搭建jenkins
  2. 编写Dockerfile文件,直接编译发布+打包成docker镜像+部署脚本
  3. 使用阿里云-容器构建服务构建docker镜像,构建成功后使用webhook通知jenkins
  4. 配置jenkins webhook触发器,触发部署脚本
  5. 完事...

手把手教你用Jenkins自动发布dotnet core程序的更多相关文章

  1. Windows系统下使用Jenkins 自动发布 .NET core到Linux平台下Docker

    准备工作(安装过程可以百度,已安装的可以跳过) a)     安装Jenkins,安装包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/windows ...

  2. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  3. Jenkins自动发布代码实战篇

    Jenkins自动发布代码实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Jenkins服务器配置秘钥对并上传到Gitlab中 1>.在Jenkins后端生成秘钥 ...

  4. Docker 简单发布dotnet core项目 图文版

    原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 需要结合这个版本看哈 地址:https://ww ...

  5. Docker 简单发布dotnet core项目 文本版

    原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 照着步骤来基本没错 但是有几个要注意的地方: v ...

  6. 使用VS 2019发布.net core程序并部署到IIS的最新教程

    不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...

  7. 通过VS2017发布.net core程序并使用Web 部署到远程服务器最新教程

    最近一个项目中,为App开发后台接口,技术选型为最新 .net core版本,使用.net core开发web api接口过程中,为了方便app团队成员直接在线调用接口,找了公网上的一台服务器做为ap ...

  8. 来个干货——使用VS2019发布.NET Core程序并部署到IIS的最新教程

    使用VS2019发布.NET Core程序并部署到IIS,不管你是使用.NET Core开发的是Web API还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.NET Core ...

  9. ubuntu上部署windows开发的dotnet core程序

    目标:完成windows上开发的dotnet core程序部署至linux服务器上(Ubuntu 14.04) windows上开发dotnet core很简单,安装好VS2017,建立相关类型的项目 ...

随机推荐

  1. linux命令指usermod(管理用户以及权限的命令)

    usermod命令:用来修改用户帐号的各项设定. 示例:usermod -a -G usergroupnewuser 或者usermod -aGusergroup newuser 语法:usermod ...

  2. A*寻路算法入门(七)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  3. IOC 控制反转(Inversion of Control,英文缩写为IoC)

    在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿 ...

  4. 【一天一道LeetCode】#101. Symmetric Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. OJ题:奇偶归一猜想——求归一过程中的最大值

    题目: 题目内容: 奇偶归一猜想--对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1. 如n = 11,得序列:11, 34, 17, 52, ...

  6. Java模式之模板方法模式

    当我们遇到的业务逻辑具有大致相同的方式的时候,我们也许就该将这个业务逻辑抽象出来,采用模板方法,来进行封装我们的代码,提高代码的重用性,以及可维护性.下面是我的一个复习用的案例: 第一步:我们需要一个 ...

  7. [易飞]设置导入导出规则-小BUG

    易飞系统在系统设置中-有设置导入导出规则,进行数据导入导出. 测试一:导入录入交易对象.从A账套导出到B账套,OK没有问题. 测试二:设置采购单单据性质. 导出结果: 怎么回事?把所有单据性质都导出了 ...

  8. Microsoft Office Excel cannot access the file, There are several possible reasons

    今天在做EXCEL打印读取模板时报错了,错误信息如下: Microsoft Excel cannot access the file 'D:\xx.xlsx'. There are several p ...

  9. HTML5进阶(二)HBuilder实现软件自动升级

    HBuilder实现软件自动升级 前言 移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有"App资源在线升级更新"的功能,遂研究之. 经过一番测试 ...

  10. jsp中的路径与跳转

    在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发: 先说重定向,它的调用方式是这样的 response.sendredirect("uri&q ...