基于Drone实现CI/CD【0到1架构系列】

news/2024/11/14 5:42:01/文章来源:https://www.cnblogs.com/netcore3/p/18325616

CI/CD是持续性集交和持续性部署,简单来讲就是自动化构建和自动化部署。目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行。

目前很多源代码都集成了CI/CD功能,drone也是目前比较流行的一个方案,简单易用,高性能。

前提条件

已经使用Gitea部署作用源码管理,使用gitea搭建源码管理 。

已经使用Harbor部署私库,harbor 搭建和部署。

已经使用Portainer部署,portainer安装,配置,使用。

准备工作

拉取我们接下来CI/CD工作有可能会用到的docker镜像,后面会继续解释这些镜像的作用。

#自动构建
docker pull drone/drone
docker pull drone/drone-runner-docker#自动部署
docker pull drone/drone-runner-ssh
docker pull docker
docker pull plugins/docker
docker pull curlimages/curl

 自动构建

drone是服务中心或者理解成任务中心,Git的webhook会通知到这里。

drone-runner-docker相当于实际参于构建工作的作业容器,drone-runner-docker定时与drone通讯获取构建任务,然后按规定的流程执行相应工作。这个流程的设计由.drone.yml配置文件决定,所以编写.drone.yml也是主要核心。

步骤一,设置Gitea的OAuth2登陆,因为drone采用OAuth2登陆方案。

登陆Gitea -> 右上角 -> 管理后台 -> 管理设置 -> 集成 -> 应用。创建应用,重定向 URI地址填写你部署的dron域名,例如:htts://drone.xxxx.com/login

步骤二,启动容器,可以单个容器启动,这里使用docker-compose进行管理。

version: "3"services:drone-server:image: drone:latestcontainer_name: droneenvironment:- DRONE_GITEA_SERVER=https://gitea.xxxx.com   #你部署的源码地址- DRONE_GITEA_CLIENT_ID=dadda5f7-a951-4e8a-a2de-ebf737a5bef5 #Oauth2登陆,客户端Id- DRONE_GITEA_CLIENT_SECRET=******************************** #Oauth2登陆,客户端密钥- DRONE_RPC_SECRET=aaaaaaaaaaaaaaaaaaa #与drone-runner通讯的凭据,随便填写- DRONE_SERVER_HOST=drone.xxxxx.com #绑定你的drone域名,用IP也行- DRONE_SERVER_PROTO=https #http,https 都可以- DRONE_TLS_CERT=/SSL/SSL.crt  #HTTPS证书- DRONE_TLS_KEY=/SSL/SSL.key   #HTTPS证书- DRONE_USER_CREATE=username:giteauser,admin:true #创建账号,这里需要填写你的gitea账号,默认管理员- DRONE_USER_FILTER=giteauser  #限制指定账号登陆restart: alwaysvolumes:- /SSL:/SSL #挂载证书- /etc/timezone:/etc/timezone:ro- /etc/localtime:/etc/localtime:roports:- "443:443"drone-runner:image: 	drone-runner-docker:latestcontainer_name: drone-runnerenvironment:- DRONE_RPC_PROTO=https- DRONE_RPC_HOST=drone.xxxxx.com:443  #drone的域名或IP- DRONE_RPC_SECRET=aaaaaaaaaaaaaaaaaaa #drone通讯的凭据,填写上面的凭据- DRONE_RUNNER_CAPACITY=2 #工作线程数- DRONE_RUNNER_NAME=my-runnerrestart: alwaysvolumes:- /var/run/docker.sock:/var/run/docker.sock  #挂载docker.sock,必需- /etc/timezone:/etc/timezone:ro- /etc/localtime:/etc/localtime:ro

启动容器之后,访问drone域名就可以看到登陆页面,点击“CONTINUE”,就会跳转Gitea登陆,登陆就会授权成功返回drone界面。

步骤三,设置webhook。

进入drone界面之后,点击右上角的"SYNC"按钮,就会把Gitea项目同步过来,点击项目 -> Settings -> ACTIVATE REPOSITORY ,就自动在gitea相应的项目上面添加webhook。

查看Gitea的webhook。

在drone界面,设置项目的“Trusted”,这点非常重要,否则在后续构建中尽管挂载了docker.sock,仍然会提示如下错误,如果没有这个选项,是由于启动drone容器没有填写DRONE_USER_CREATE的原因。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
exit status 1

步骤四,至此自动构建就算搭建成功,接下来就是编写.drone.yml文件,需要将/var/run/docker.sock挂载进去,drone-runner实际上使用母机的docker在构建制品,也就是说构建成功之后镜像在母机上通过docker images就能查询出来。

下面示例使用Dockerfile文件进行构建,plugins/docker:latest镜像是预先设置好,具有基于dockerfile构建和推送功能的镜像。

kind: pipeline
type: docker
name: defaultsteps:- name: 构建&推送  #管道名称image: plugins/docker:latestvolumes:- name: dockersockpath: /var/run/docker.socksettings:registry: harbor.xxxxx.com #你部署的docker私库地址repo: harbor.xxxxx.com/project/webtags: latestdockerfile: ./Dockerfilepull_image: false #构建的时候是否强制拉取最新镜像username: abcpassword: 123volumes: #挂载
- name: dockersockhost:path: /var/run/docker.sock

 也可以使用docker镜像,自行编写命令进行构建。

kind: pipeline
type: docker
name: defaultsteps:- name: 构建&推送  #管道名称image: docker:latestvolumes:- name: dockersockpath: /var/run/docker.sockcommands:- docker build -t web:latest .- docker image tag web:latest harbor.xxxxx.com/project/web:latest- docker push web:latest harbor.xxxxx.com/project/web:latestvolumes: #挂载
- name: dockersockhost:path: /var/run/docker.sock

步骤五,至此自动构建和推送到私库,基本就搭建完成。每次打包制品之后镜像都不会主动删除,所以我们可以增加多一个流程来删除剩余的镜像。

kind: pipeline
type: docker
name: defaultsteps:- name: 清理镜像  #管道名称image: docker:latestvolumes:- name: dockersockpath: /var/run/docker.sockcommands:- docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {}volumes: #挂载
- name: dockersockhost:path: /var/run/docker.sock

自部部署

方式一,SSH远程登陆,拉取镜像,重新部署。

kind: pipeline
type: docker
name: defaultsteps:- name: SSH部署  #管道名称image: drone/drone-runner-ssh:latestsettings:host: 192.168.3.78username: rootpassword: 123port: 22script: #部署执行动的命令- echo ====开始部署=======- docker pull harbor.xxxxx.com/project/web:latest- docker stop web- docker rm web- docker run -d --name web -p 80:8080  harbor.xxxxx.com/project/web:latest- echo ====部署成功======

方式二,通过Portainer的webhook进行更新。

进入portainer管理界面,进入容器详情页,开启容器的webhook,复制通地址。

kind: pipeline
type: docker
name: defaultsteps:- name: Portainer部署 #管道名称image: curlimages/curl:latestcommands:- curl -X POST "https://portainer.xxxx.com/api/webhooks/983DB2D1-34B8-4527-087B-08D76FE58AE5"

部署完成通知

部署完成之后,开发者可以通过drone管理界面查看进度,或者通过webhook通知推送成功消息到微信,短信,邮件,钉钉等。

kind: pipeline
type: docker
name: defaultsteps:- name: 部署完成通知 #管道名称image: curlimages/curl:latestcommands:- curl -X POST "通知的webhook地址"

一个完整的示例如下:

kind: pipeline
type: docker
name: defaultsteps:- name: 构建&推送  #管道名称image: plugins/docker:latestvolumes:- name: dockersockpath: /var/run/docker.socksettings:registry: harbor.xxxxx.com #你部署的docker私库地址repo: harbor.xxxxx.com/project/webtags: latestdockerfile: ./Dockerfilepull_image: false #构建的时候是否强制拉取最新镜像username: abcpassword: 123- name: 清理镜像  #管道名称image: docker:latestvolumes:- name: dockersockpath: /var/run/docker.sockcommands:- docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {}- name: Portainer部署 #管道名称image: curlimages/curl:latestcommands:- curl -X POST "https://portainer.xxxx.com/api/webhooks/983DB2D1-34B8-4527-087B-08D76FE58AE5"- name: 部署完成通知 #管道名称image: curlimages/curl:latestcommands:- curl -X POST "通知的webhook地址"volumes: #挂载点,共用
- name: dockersockhost:path: /var/run/docker.sock

运行效果:

 

更多系列文章

构建高性能,可伸缩,高可用,安全,自动化,可溯源,整体式应用构架体系

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

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

相关文章

Django项目快速上手:从安装到创建应用

Django项目快速上手:从安装到创建应用 安装Django 首先,确保你已经安装了 Python 和 pip。然后,使用以下命令来安装 Django : pip install django安装成功后,你就可以开始创建Django项目了。 创建Django项目 打开你的终端或命令提示符,然后使用 django-admin 命令来创建一…

Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer

前段时间在 pulsar-client-go 社区里看到这么一个 issue:import "github.com/apache/pulsar-client-go/pulsar"client, err := pulsar.NewClient(pulsar.ClientOptions{URL: "pulsar://localhost:6650", }) if err != nil {log.Fatal(err) } consumer, er…

配置 setting.py

配置 setting.py Django项目的配置主要通过settings.py文件完成。这个文件位于项目的根目录下(与manage.py同级)。为了让你的应用更加本地化,你可能需要修改一些设置,比如语言、时区等。打开settings.py文件,并找到以下设置进行修改: # setting.py# 语言设置(en-us:英文…

关于GPIO输出模式下3种频率的解释

配置GPIO输出模式时,有3种频率可以选择,2MHz、10MHz和50MHz,如下图:这三个频率说的是I/O口驱动电路的响应频率而不是输出信号的频率。芯片的内部做了多个响应频率不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。通过选取不同频率的输出驱动电路达到最佳的…

二手车交易预测模型笔记

一、梯度下降法 梯度下降法就是一种通过求目标函数的导数来寻找目标函数最小化的方法。梯度下降目的是找到目标函数最小化时的取值所对应的自变量的值,目的是为了找自变量X。 梯度:是一个矢量,其方向上的方向导数最大(意味着在这个方向上,函数的值增加最快。从图形上看,就…

Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

前言Open CASCADE是由Open Cascade SAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。  本篇描述搭建Qt开发occ环境过程。 Demo注意:用的是…

7/26admin投放端代码理解

xorm是一个数据库映射框架

chsap连接Mysql

前置操作 打开MySql服务 添加引用MySql.Data.dll 数据库查询数据 读取一条数据,直接运行就能看到打印台输出。1 using Mysql.Data.MyAqlClient;2 static void Main(string[] args)3 {4 string connStr="Database=test007;Data Source=127.0.0.1;port=3306;User Id=ro…

论文阅读:BERT-Based Chinese Relation Extraction for Public Security

模型框架 包含一个BERT模型层(嵌入+编码+池化->得到句子的特征向量)、一个Dropout层(防止过拟合)。基于BERT的预训练模型 BERT模型是通过注意力机制对训练集进行处理。然后,通过Embedding层和Encoder层加载预训练的词向量。 最后,Pooling 层使用 BERT 模型来训练两个句…

现在有什么赛道可以干到退休?

一个小小评论区惊现阿里和腾讯的两位大佬!他们干到退休应该是没什么问题,那你们呢?文中还有粉丝投稿的一次完整面试的面经,速来围观。最近,一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传,也不知道是真是假,好巧不巧今天刷热点的时候又看到一条这样的热…