持续集成之应用容器化及自动化部署

通过 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 独有的一些配置放在 PipelineVariables 里,一些比较通用的,别的 pipeline 也会使用的变量可以放到一个 Variablegroups,然后在 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

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

640?wx_fmt=jpeg

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

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

相关文章

持续集成之 Nuget 进阶

持续集成之 Nuget 进阶Intro之前介绍了一篇基于 Azure pipeline 的 nuget 包的持续集成配置,但是比较粗糙,这里介绍一下结合 Cake 实现更优雅的 nuget 包发布流程。实现目标:分支(除master/preview)有代码 push 或者 pr 时 自动 buildpreview…

做“是非题”的正确姿势

这里是Z哥的个人公众号每周五11:45 按时送达有时也会有感而发,来加个餐~我的第「107」篇原创敬上大家好,我是Z哥。这两天中国男篮的事,让我有感而发。不知道你有没有留意到,我们身边总有类似下面这样的事情…

依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)(C#)

象的控制权交由配置文件控制,然后根据配置文件中的信息(程序集类型),通过反射来获取对象,而不是直接new对象,这也是控制反转的一种体现。IoC容器会连接程序中的所有模块,模块将所需对象的控制权…

四种为HttpClient添加默认请求报头的解决方案

HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式。直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。class Program{static Task Main()> SendAsync…

【盛派内部分享资料】本期主题:使用JavaScript HTML CSS构建跨平台桌面应用

先上录制视频友情提示:如果公众号内视频无法显示高清视频,您也可以在小程序内观看高清视频,点击下方按钮观看:【盛派内部分享资料】本期主题:使用JavaScript HTML CSS构建跨平台桌面应用本次活动由盛派技术人员伏允坤主…

负载均衡及负载均衡器

负载均衡在分布式系统中,负载均衡(load balancing)是一种有效的将网络请求分配到多个服务器的过程。通过将负载进行负载均衡,可以有效地改进系统响应时间,提高系统的可用性。随着系统变的愈发复杂,用户增多…

VS Code 摸鱼插件开发小记

插件地址:https://marketplace.visualstudio.com/items?itemNamebugbreeder.vscode-readhub原文链接:https://github.com/alex-yh99/vscode-readhub/blob/master/docs/develop-note.md一、关于插件在 VSCode 中快捷查阅科技动态、开发者资讯等 Readhub …

9月数据库排行:Microsoft SQL Server分数罕见下滑

DB-Engines 数据库流行度排行榜 9 月更新已发布,排名前二十如下:明显能看出来,整体排名和上个月的保持一致。而上个月出现分数下跌的 PostgreSQL 和 MongoDB 终于“回归正道”,分数有了稍微的上升。与上个月相比,Postg…

Exceptionless使用介绍

一.Exceptionless介绍Exceptionless专注于.net平台提供实时错误和日志报告。主要包括:错误通知、智能分组异常、详细错误报告堆栈跟踪、支持离线、UI查看重要错误和确定优先级、仪表板上的统计信息和趋势、对异常标记为已修复,监视回归、将事件标记为关键…

Net Core DocXCore 实现word模板导出

实际工作中,往往有这样的需求,需要导出word,还有各种各样的样式,于是有了word模板导出。实现以下几个需求:1、表单导出2、表格导出3、表单表格混合导出4、实际用例测试解决方案:实现是基于NET Core 2.1 &am…

密钥分离,.Net程序猿不再背锅

引言互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改】, 一茬又一茬背锅侠层出不穷。拯救自我软件工程理论早以加粗字体给出 经典原则:Never store production passwords or o…

Chrome让人失望,是时候转到Firefox或Edge?

我们曾报道过谷歌正在移除 Chrome 的关闭其他选项卡,这引起很多用户的讨论,很多用户表现出对 Chrome 浏览器的失望。而在国外,也有很多人认为谷歌这项修改使 Chrome 变得越来越臃肿。还有前段时间,谷歌在 Chrome 76 中隐藏了 “ht…

我认真写下9段如翔一般的代码,只为等你来品鉴

溪源 | 长沙.NET技术社区开篇我们总是很容易就能写出满足某个特定功能的代码,却很难写出优雅代码。又最欣赏那些优雅的代码,因为优雅代码更能体现一个开发者的积累。就像写一篇散文,有的就像初学者不得其门而入,遣词造句都非常困难…

「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等

最近一时兴起,研究了一些文件管理的方法论和笔记管理类的知识,自己想到一些不错的方法及落地方案,可能对一部分朋友来说,这些方法和工具的落地会有一些共鸣,故简单给大家做一下分享。跨界应用:数据表结构应…

Java之JMS

一:JMS简介   JMS即Java消息服务(Java Message Service),是一个Java平台定义的关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS是一个与具体平台无…

程序员过关斩将--更加优雅的Token认证方式JWT

点击上方“蓝字”带你去看小星星菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了结果怎么样?结果面试官问我还有没有更好的方式?看来你又挂了别说了,伤心呀。到底还有没有更好的方式呢?你猜&…

Java之JMX

JMX,即Java Management Extensions,Java管理扩展。是一个为应用程序、设备、系统等植入管理功能的框架。   JMX提供了一种简单、基础的方法,用来管理应用、设置、服务等资源。由于JMX是动态的,你可以使用JMX技术来监控和管理处于…

[NewLife.XCode]分表分库(百亿级大数据存储)

NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中&#xf…

你的技术债还了吗?

什么是技术债?技术债是由沃德坎宁安在1992年提出,指我们在软件架构或代码编写过程中有意无意地做了错误的决策。随着时间的累积,这种错误会越来越多,就像背负了很多债务一样。技术债的危害技术债同财务债一样,是有利息…

拿 C# 搞函数式编程

最近闲下来了&#xff0c;准备出一个 C# 搞 FP 的合集。本合集所有代码均以 C# 8 为示例。可能你说&#xff0c;为什么要这么做呢&#xff1f;回答&#xff1a;为了好玩。另外&#xff0c;意义党们请 gun cu ke&#xff01;C# 有委托&#xff0c;而且有 Func<> 和 Action…