通过 Azure Pipelines 实现持续集成之docker容器化

Intro

Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的好消息,在 Github 的 Marketplace 里有个 Azure Pipeline,就是微软的 Azure DevOps Pipeline。

实现 Docker 容器化的持续集成

实现的目标:

  • push 代码自动打包 docker 镜像并上传至docker hub

  • ssh 自动部署到虚拟机上

有了docker image 之后后面就可以按照自己的需求加以定制了,比如通过ssh部署到服务器或者进行服务通知等。

新建 Pipeline

可以在 Azure 的 devops 新建一个 pipelines 的项目来专门管理 Github 上的pipeline

新建一个pipeline

640?wx_fmt=png

第一次使用的话,会需要进行授权

640?wx_fmt=png

授权之后就可以选择 Github 上的项目了,选择要配置的项目

640?wx_fmt=png

可以基于模板创建也可以选择下面基于已有的 yaml 文件创建

Azure pipeline config

这里提供一份示例,源代码在这里:

# Docker image
# Build a Docker image to deploy, run, or push to a container registry.
# Add steps that use Docker Compose, tag images, push to a registry, run an image, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

pool:
vmImage: 'Ubuntu 16.04'

variables:
imageName: '$(dockerId)/activityreservation'

steps:

- script: |
docker build -f Dockerfile -t $(imageName) .
docker login -u $(dockerId) -p $(pswd)
docker push $(imageName)

pipeline 配置解析

  1. agent pool 配置

通过 vmImage 来指定要用来执行 build 任务的 agent

pool:
vmImage: 'Ubuntu 16.04'
  1. variables

可以通过 variables 来指定一些全局变量,这里我用了一个 imageName 的变量来设置 docker 镜像的名称

variables:
imageName: 'activityreservation'
  1. 敏感信息的存储

要上传 docker 镜像,我这里是直接上传到 docker hub 上,需要 docker 的用户名以及密码,pipeline 可以设置一些不配置在 pipeline 配置文件里的其它配置,一些敏感信息就可以这样配置来保证安全访问

可以将 pipeline 独有的一些配置放在 Pipeline Variables 里,一些比较通用的,别的 pipeline 也会使用的变量可以放到一个 Variable groups,然后在 pipeline 的 variables 里 link 一下对应的 Variable Group 就可以使用 group 里配置的变量了,我把 docker 的 username 和 password 配置在了一个 docker 的 Variable Group 里。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

  1. docker 镜像的打包以及上传

配置 pipeline 的 step,step 对应的就是需要 build agent 去执行的task

steps:

- script: |
docker build -f Dockerfile -t $(imageName) .
docker login -u $(dockerId) -p $(pswd)
docker push $(imageName)

配置上面的脚本我们就可以自动 build 并 push docker 镜像了。

build 完成之后再去 docker hub 上查看对应的 docker 镜像就会发现 docker 镜像已经更新了。

在 vm 上自动部署 docker 镜像

首先要在 pipeline 上新建一个 SSH 的 Service Connection

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

steps:

- script: |
docker build -f Dockerfile -t $(imageName) .
docker login -u $(dockerId) -p $(pswd)
docker push $(imageName)

- task: SSH
displayName: 'Run shell inline on remote machine'
inputs:
sshEndpoint: 'weihanli-vm'
runOptions: inline

inline: |
containers=$(docker ps -q --filter name=activityreservation)
if test -n "$containers"; then
docker stop $(docker ps -q --filter name=activityreservation) >> /dev/null 2>&1
rc=$?
if [[ $rc != 0 ]];
then
echo 'failed to stop container...'
exit $rc;
fi
fi

containers1=$(docker ps -q -a --filter name=activityreservation)
if test -n "$containers1"; then
docker rm $(docker ps -q -a --filter name=activityreservation) >> /dev/null 2>&1
rc=$?
if [[ $rc != 0 ]];
then
echo 'failed to remove container...'
exit $rc;
fi
fi


docker pull $(imageName):latest >> /dev/null 2>&1
rc=$?
if [[ $rc != 0 ]];
then
echo 'failed to pull container...'
exit $rc;
fi

docker run -d -p 7010:80 --name activityreservation --link redis:redis-server $(imageName):latest >> /dev/null 2>&1
rc=$?
if [[ $rc != 0 ]];
then
echo 'failed to run container...'
exit $rc;
fi

danglings=$(docker images -f "dangling=true" -q)
if test -n "$danglings"; then
docker rmi $(docker images -f "dangling=true" -q) >> /dev/null 2>&1
rc=$?
if [[ $rc != 0 ]];
then
echo 'failed to remove danglings container...'
exit $rc;
fi
fi

sshEndpoint 设置为连接的名称,inline 后面是在远程执行的脚本,大概流程如下:

  1. 检查是否有指定名称的 container 在运行,如果有 stop 并 remove

  2. 拉取最新的 docker 镜像

  3. 运行 docker 容器

  4. 移除可能的悬挂镜像(名称为 none 的中间镜像)

验证

配置完成之后我们就可以提交代码,就会自动出发 build,自动执行我们定义的 pipeline 任务,按照上面的配置的话,就会先 build 并 push Docker 镜像到 docker hub,然后 SSH 到远程服务器,远程过去之后执行脚本,停掉并移除指定的 docker 容器(如果有)然后拉取并部署最新的docker镜像,最后清理资源,删除 docker 悬挂镜像。

示例项目

现在有两个项目是这种模式去自动化部署的,源代码以及 pipeline 的配置都在 Github 上

  • 活动室预约系统 https://reservation.weihanli.xyz/

  • 简单账单系统

现在这两个项目的部署模式是这样的,以活动室预约系统为例:

前面一个 nginx 作为反向代理,后面是直接跑在 docker 容器里

nginx 示例配置:

server {
listen 80;
listen 443;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
server_name reservation.weihanli.xyz;

location / {
proxy_pass http://localhost:7010;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

这里会把 reservation.weihanli.xyz 的请求转发到 localhost:7010 ,也就是这个 docker 镜像映射的本地端口

Memo

如果有什么问题或建议,欢迎与我联系

原文地址:https://www.cnblogs.com/weihanli/p/10464507.html 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意: 现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。 题解: 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数,…

【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师

南京纳龙科技有限公司成立于2002年12月,隶属纳龙科技在南京成立的研发中心,坐落于南京市雨花台区。公司立志以守护人类心脏健康为使命,专注推动心电信息化技术的发展,为全国各级医疗机构提供心电检查、诊断一体化的解决方案。公司…

Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

题意: 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。 题解: 数位DP 技巧1:[X,Y]>f(Y)-f(X-1) 技巧2:用树的方式来考虑。 在本题中,题意是问[X,Y]中…

EFCore动态切换Schema

最近做个分库分表项目,用到schema的切换感觉还是有些坑的,在此分享下。 先简要说下我们的分库分表分库分表规则我定的规则是,订单号(数字)除以16,得出的结果为这个订单所在的数据库,然后他的余数…

东莞.NET俱乐部线下技术沙龙-活动报名

自广州.NET技术俱乐部在2018年12月08日线下活动顺利开展后,东莞作为兄弟城市,也想通过线下活动的方式,点燃东莞.NET技术的熊熊之火。现决定先借助广州、深圳兄弟城市的帮助下,开展一场东莞方主办的线下活动,聚集东莞本…

如何撰写较受欢迎的技术文章

本来我这篇文章的标题是 “如何撰写受欢迎的技术文章”,但反复斟酌之下,还是加了一个“较”字,这主要是考虑我不是什么知名作者,写的文章大多也谈不上很受欢迎,贸然地谈“受欢迎” 是有点忐忑的,而改成现在…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程&#xff0c;仅作探讨。不过由于篇幅有限&#xff0c;完整的DevOps&#xff0c;我们后续独立探讨。 为了降低容器的使用门槛以及便于大家将容器技…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质&#xff1a;vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献&#xff0c;当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然&#xff0c;编号更大的点不会比 vvv 先删去&#xff0c;所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代&#xff0c;究竟谁主沉浮&#xff1f;当这个系列本来打算是写人物的&#xff0c;而且是写我们身边那些优秀的开发者&#xff0c;然而当第一篇文章&#xff0c;写的是关于我们长沙.NET社区的优秀开发者邹琼俊&#xff0c;发表在博客园之后&#xff0c;有一…

Asp.NETCore轻松学系列阅读指引目录

前言耗时两个多月&#xff0c;坚持写这个入门系列文章&#xff0c;就是想给后来者更好更快的上手体验&#xff0c;这个系列可以说是从入门到进阶&#xff0c;适合没有 .NETCore 编程经验到小白同学&#xff0c;也适合从 .NET Framework 迁移到 .NETCore 的朋友。本系列从安装环…

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题&#xff0c;对于小型微服务应用&#xff0c;客户端与微服务可以使用直连的方式进行通信&#xff0c;但对于对于大型的微服务应用我们将不得不面对以下问题&#xff1a;如何降低客户端到后台的请求数量&#xff0c;并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意&#xff1a; 每个边有权值&#xff0c;求树的直径 题解&#xff1a; 两遍dfs可以求&#xff0c;这里用树形dp的方法&#xff0c;我们将1作为根节点来看这棵树 我们可以将点看作是钉子&#xff0c;边就是挂在钉子上的绳子&#xff0c;我们只…

.NET/C# 获取一个正在运行的进程的命令行参数

在自己的进程内部&#xff0c;我们可以通过 Main 函数传入的参数&#xff0c;也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。但是&#xff0c;可以通过什么方式来获取另一个运行着的程序的命令行参数呢&#xff1f;进程内部获取传入参数的方法&#xff0c;可以…

听说,霸都.NET技术社区准备搞线下聚会了?

.NET Core实战项目交流群日常交流嗨&#xff0c;你听说了没有&#xff1f;霸都.NET技术社区准备搞线下聚会了&#xff01;啥时候的事情啊&#xff1f;最近才知道的消息啊&#xff01;那你是从哪里知道的消息呢&#xff1f;.NET Core项目实战交流群&#xff08;637326624&#x…

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

解析 它还真的不难。 乐。 这题没做出来有些谔谔。 外层wqs二分显而易见&#xff0c;里面不知道为啥我总觉得这个题可以贪心。 然后一直试图在原树直径上下功夫&#xff0c;一筹莫展。 看到题解“dp”两个字这题也就做完了… 就相当于要把一棵树分成若干条无交链&#xff0c;每…

ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

标题&#xff1a;ASP.NET Core中实现单体程序的事件发布/订阅作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10468058.html项目源代码&#xff1a;https://github.com/lamondlu/EventHandlerInSingleApplication背景事件发布/订阅是一种非常强大…