.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)
前言
linux 大行其道的今天想必大家都已经拥抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是这样的方案不适合我这种懒人,一直在寻求简单的解决方案,在寻求方案的过程中发现目前国内的第三方的对c#不够友好啊,没发现好用的,所以就想到的Azure,不得不说MS还是挺给力的。
必备清单
- GitHub ==>GitHub 入门教程
- 阿里云容器镜像服务 或 https://hub.docker.com
- Azure DevOps 注册=》https://azure.microsoft.com/zh-cn/services/devops/
- 一台服务器 ps : 薅的299三年的阿里云ECS
一、 搞定GitHub
- 打开VS,新建
ASP.NET Core Web 应用程序,起名为WebNotebook - 点击下一步,记得启用 Docker 支持,点击 创建
- 如果上一步没有点击启用Docker支持,通过新建添加即可
- 把代码Push到GitHub
下面是我的Docker文件配置
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
RUN ls -al
COPY ["WebNotebook/WebNotebook.csproj", "WebNotebook/"]
RUN dotnet restore "WebNotebook/WebNotebook.csproj"
COPY . .
WORKDIR "/src/WebNotebook"
RUN dotnet build "WebNotebook.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "WebNotebook.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebNotebook.dll"]
以下是我的项目的Demo
https://github.com/zhaozhengyan/WebNotebook

二、配置阿里云容器镜像服务
- 登录阿里云,找到容器镜像服务=》https://cr.console.aliyun.com/
- 创建命名空间,起个名字,我这里叫
zohnz(PS:私有公开看个人需要) - 创建镜像仓库,起个名字,我这里叫
webnotebook(注意:只能小写) - 进去查看镜像仓库的基本信息,标红的复制下来,一会配置 Azure Pipeline 要用


三、Azure CI/CD 配置
- 首先注册注册Azure 账户,进入 https://dev.azure.com/
- 创建一个组织, 我这里叫
zohnz - 创建一个project,我这里叫
Nexter - 进入
Pipelines,添加一个新的 Build(PS:这个应该叫持续集成)





- 编辑
azure-pipelines.yml,复制如下代码,把下面参数替换成自己的
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
variables:
dockerId: xxx@163.com # 阿里云 login username
namespace: zohnz # 阿里云 命名空间
imageName: webnotebook # 阿里云 仓库名称
registry: registry.cn-hangzhou.aliyuncs.com # 阿里云 公网地址
dockerfilepath: WebNotebook/Dockerfile # Github Dockerfile相对路径
steps:
- script: |
docker build -f $(dockerfilepath) -t $(imageName) .
docker login -u $(dockerId) -p $(pwd) $(registry)
docker tag $(imageName) $(registry)/$(namespace)/$(imageName)
docker push $(registry)/$(namespace)/$(imageName)
displayName: push to aliyun
这里简要解释下 yaml 的脚本参数的大致意思
| 指令 | 注释说明 |
|---|---|
| $(xxx) | 这个是azure 的占位符,上面我用variables 声明了 |
| -f | 指定要使用的Dockerfile路径;这个很重要,不加会报找不到文件夹的错误 |
| -t | 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。 |
| $(pwd) | 这个pwd 可以直接写,但是出于安全考虑,配置到azure的variables(参数环境变量里面)了 |
读者可以通过如下方式设置

- 接下来添加一个新的
Release,主要功能是Pull镜像和Run镜像



- 配置Agent的名字我这里叫
Push and Run,还有一些其他配置,参考下图

- 点击刚刚的
Push and Run右边的+号,添加Task

- 搜索
SSH,点击ADD,这里的意思是在远程主机上执行自己的脚本

- 点击
Manage配置自己的登录账号和密码,添加一个 SSH Service connection

- 选择刚刚添加的名字为
ssh_aliyun的 SSH service connection

- 接下来填写需要配置的脚本,选择
Inline Script,我这里写了四个task

- 以下是我的四个task的脚本
Remove Container
#判断是否存在webnotebook容器
docker ps | grep webnotebook &> /dev/null
#如果不存在,则Remove
if [ $? -ne 0 ]
then
echo "webnotebook container not exist continue.. "
else
echo "remove webnotebook container"
docker rm webnotebook -f
fiRemove old Image
#判断是否存在registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook 镜像
docker images | grep registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook &> /dev/null
#如果不存在,不做操作
if [ $? -ne 0 ]
then
echo "image does not exist , continue..."
else
echo "image exists !!! remove it"
docker rmi --force registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
fiPull Image
#从阿里云拉取刚刚push的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
Run Image
# 运行镜像对宿主及暴露5003端口
docker run --restart unless-stopped -p 5003:80 --name webnotebook -d registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
配置完Task我们需要把刚刚的Build和Release串联起来,选择之前Build pipeline,添加完之后,记得Save

这里是我配置好的 build pipeline

四、配置阿里云
- 登录自己的阿里云服务器,用win自带的cmd就可以,我这里是ubuntu
C:\Users\zhaozy>ssh root@xx.xx.xx.xx
root@47.98.193.96's password:
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-52-generic x86_64)
- 安装Docker
sudo apt-get update #刷新源
sudo apt-get -y install docker.io #安装docker
- 输入
docker -v查看docker是否安装成功
root@iZs9kgd0x5xmhaZ:~# docker -v
Docker version 18.09.7, build 2d0083d
至此我们已经完成了所有配置阶段,下面我来提交一次代码,测试发布流程
github 提交代码

进入Azure查看Build构建进度,我这构建很快,我进去的时候已经构建Build完了

点进去查看Job日志,发现都已经执行完了

去阿里云容器镜像服务查看是否Push上来

去Azure 里面查看,Release 是否执行成功



去阿里云安全组添加
5003端口的外网访问

打开我们服务器的地址+端口号

总结
至此,我们的四部Linux发布之路已全部完成,大家可以根据自己的需要灵活配置
.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)的更多相关文章
- .Net Core DevOps - 四步实现Vue项目持续集成
众所周知,现在国内最火的前端框架非Vue莫属了,作为一个.net程序员,早就想体验一下了,但是无奈微软的项目模板不提供Vue的Spa模板,但是我们还是想用怎么办呢?下面来看下我的解决方案 目录 用vu ...
- DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】
[摘要] 持续集成/持续交付(CI/CD,Continuous Integration/Continuous Deployment)在DevOps CMALS理念中具有支柱性地位,因而CI/CD流水线 ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 打算用三个篇幅来记录完整的全过程 觉得有帮助的朋友~可以左上 ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...
- .Net core 使用Jenkins + Docker + Azure Devops 傻瓜式部署
这几天一直在搞 Jenkins + Docker + Azure Devops 部署,因为这种方式部署真的非常的省心,而且速度快,方便快捷,等等无数优点,感谢我的单身领导的支持,当然也感谢 晓晨大神, ...
- AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)
<黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打 ...
- 使用.NET Core 2.1的Azure WebJobs
WebJobs不是Azure和.NET中的新事物. Visual Studio 2017中甚至还有一个默认的Azure WebJob模板,用于完整的.NET Framework. 但是,Visual ...
- 【Azure DevOps系列】Azure DevOps生成代码覆盖率
前言 在做单元测试时,代码覆盖率可以作为我们衡量代码质量的一个指标,本章我们将使用Azure DevOps帮助我们生成代码覆盖率的结果.Azure DevOps构建管道还是具有代码覆盖率选项的,在Vi ...
- Azure Data Factory(三)集成 Azure Devops 实现CI/CD
一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...
随机推荐
- HBase 学习之路(八)——HBase协处理器
一.简述 在使用HBase时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求.在这种情况下,协处理器( ...
- Kafka 学习之路(三)—— Kafka生产者详解
一.生产者发送消息的过程 首先介绍一下Kafka生产者发送消息的过程: Kafka会将发送消息包装为ProducerRecord对象, ProducerRecord对象包含了目标主题和要发送的内容,同 ...
- 如何做一个大数据seo人员
作为流量运营者或者SEO人员,对于所从事行业领域的认识往往建立在一种直觉之上,我们很难对一个行业有一个全面的了解,这个行业领域有多宽,流量聚焦在哪里,那些是用户最关心的问题? 有的时候很难准确的把握, ...
- python统计字符串里每个字符的次数
方法一: 推导式 dd="ewq4aewtaSDDSFDTFDSWQrtewtyufashas" print {i:dd.count(i) for i in dd} 方法二: co ...
- 建设DevOps统一运维监控平台,全面的系统监控 Zabbix VS Nagios VS Open-Falcon OR Prometheus
前言 随着Devops.云计算.微服务.容器等理念的逐步落地和大力发展,机器越来越多,应用越来越多,服务越来越微,应用运行基础环境越来多样化,容器.虚拟机.物理机不一而足.面对动辄几百上千个虚拟机.容 ...
- CDH 5.15.2 离线安装
一.前置准备 1. 基础信息 1.1 机器 机器名 服务 hadoop1 主节点 hadoop2 data.task hadoop3 data.task 1.2 服务版本 服务 版本 cdh 5.15 ...
- mybatis的插入与批量插入的返回ID的原理
目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...
- 从零开始实现放置游戏(十)——实现战斗挂机(1)hessian服务端搭建
前面实现RMS系统时,我们让其直接访问底层数据库.后面我们在idlewow-game模块实现游戏逻辑时,将不再直接访问底层数据,而是通过hessian服务暴露接口给表现层. 本章,我们先把hessia ...
- HTML&CSS构建和设计网站
1.a链接:两个特性,href.target,href里添加mailto:邮箱可以直接链接到其它人的邮箱,添加#id,可以把窗口位置直接定位到该id的元素位置, target:_black可以在新的窗 ...
- Java面试题必备知识之ThreadLocal
老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题: ThreadLocal是用来解决什么问题的? 如何使用ThreadLocal? ThreadLocal ...