通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署
通过 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

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

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

可以基于模板创建也可以选择下面基于已有的 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 配置解析
- agent pool 配置
通过 vmImage 来指定要用来执行 build 任务的 agent
pool:
vmImage: 'Ubuntu 16.04'
- variables
可以通过 variables 来指定一些全局变量,这里我用了一个 imageName 的变量来设置 docker 镜像的名称
variables:
imageName: 'activityreservation'
- 敏感信息的存储
要上传 docker 镜像,我这里是直接上传到 docker hub 上,需要 docker 的用户名以及密码,pipeline 可以设置一些不配置在 pipeline 配置文件里的其它配置,一些敏感信息就可以这样配置来保证安全访问
可以将 pipeline 独有的一些配置放在 Pipeline Variables 里,一些比较通用的,别的 pipeline 也会使用的变量可以放到一个 Variable groups,然后在 pipeline 的 variables 里 link 一下对应的 Variable Group 就可以使用 group 里配置的变量了,我把 docker 的 username 和 password 配置在了一个 docker 的 Variable Group 里。




- 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


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 后面是在远程执行的脚本,大概流程如下:
- 检查是否有指定名称的 container 在运行,如果有 stop 并 remove
- 拉取最新的 docker 镜像
- 运行 docker 容器
- 移除可能的悬挂镜像(名称为 none 的中间镜像)
验证
配置完成之后我们就可以提交代码,就会自动出发 build,自动执行我们定义的 pipeline 任务,按照上面的配置的话,就会先 build 并 push Docker 镜像到 docker hub,然后 SSH 到远程服务器,远程过去之后执行脚本,停掉并移除指定的 docker 容器(如果有)然后拉取并部署最新的docker镜像,最后清理资源,删除 docker 悬挂镜像。
示例项目
现在有两个项目是这种模式去自动化部署的,源代码以及 pipeline 的配置都在 Github 上
现在这两个项目的部署模式是这样的,以活动室预约系统为例:
前面一个 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
如果有什么问题或建议,欢迎与我联系
通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署的更多相关文章
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- Jenkins + Github持续集成构建Docker容器,维基百科&人工自能(AI)模块
本文分两部分,第一部分是手动计划任务的方式构建Github上的Docker程序,第二部分是用Github webhook Trigger一个自动构建任务. Jenkins采用2.5版本Docker采用 ...
- ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx
一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...
- 利用 ELK 搭建 Docker 容器化应用日志中心
利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...
- [ci]jenkins-slave-ssh docker容器化-用户名密码
jenkins-slave-ssh docker容器化 架构 参考:https://www.youtube.com/watch?v=OxrBCt1JLuQ https://github.com/Dav ...
- ASP.NET Core使用Docker进行容器化托管和部署
一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...
- Docker容器化技术(下)
Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...
- Docker容器化技术(上)
目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
随机推荐
- java之servlet入门操作教程一续
本节主要是在java之servlet入门操作教程一 的基础上使用myeclipse实现自动部署的功能 准备: java之servlet入门操作教程一 中完成myFirstServlet项目的创建: ...
- C# 打印PDF文档的10种方法
操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...
- 如何在WSL下使用VS Code
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.本有由葡萄城技术团队翻译并整理 自微软开始宣布拥抱开源以来,我认为微软发布的最棒的两大功能是:Visual S ...
- webpack打包nodejs项目(前端代码)
PS.若本文没有帮到你可以看看我的进阶版点此前往 适用情况 首先说明,此情况不具备普遍性.若你的情况与笔者类似那么希望这篇文章能够帮到你. 我的项目情况是这样的:用node.js做后台,ejs做模板引 ...
- 常见hash算法
hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...
- 二、使用docker-compose搭建AspNetCore开发环境
1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ...
- java上传excel到后台解析入库
背景:最近需要做一个excel模板导入的功能,以便用户可以自己增删改查数据,当然,只有特别的用户才能有此权限,捋了捋思路,还是从前端写起 实现: 页面最后的效果如下,可以自己修改,删除,导入导出数据, ...
- MySQL 查询出的时间相差几个小时
最近做的一个springboot2.0项目. 前提是我的服务器时区没有问题: [root@wangbo ~]# date -R Mon, 22 Apr 2019 19:24:33 +0800 可以参考 ...
- springcloud~配置中心的使用
配置中心作为springcloud里最底层的框架,所发挥的意思是举足轻重的,所以的组件的配置信息都可以通过springcloud config来管理,它会把配置信息分布式的存储到git上,所以信息安全 ...
- springboot~zuul实现网关
网关在微服务里的角色 在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了: 统一授权 统一异常处理 路由导向 跨域处理 限流 实践一下 1 添加依赖 dependen ...