首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年07月29日 10:34

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:latest
    container_name: drone
    environment:
      - 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: always
    volumes:
      - /SSL:/SSL #挂载证书
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "443:443"

  drone-runner:
    image: 	drone-runner-docker:latest
    container_name: drone-runner
    environment:
      - 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-runner
    restart: always
    volumes:
      - /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: default

steps:
  - name: 构建&推送  #管道名称
    image: plugins/docker:latest
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    settings:
      registry: harbor.xxxxx.com #你部署的docker私库地址
      repo: harbor.xxxxx.com/project/web
      tags: latest
      dockerfile: ./Dockerfile
      pull_image: false #构建的时候是否强制拉取最新镜像
      username: abc
      password: 123

volumes: #挂载
- name: dockersock
  host:
    path: /var/run/docker.sock

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

kind: pipeline
type: docker
name: default

steps:
  - name: 构建&推送  #管道名称
    image: docker:latest
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    commands:
      - 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:latest

volumes: #挂载
- name: dockersock
  host:
    path: /var/run/docker.sock

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

kind: pipeline
type: docker
name: default

steps:
  - name: 清理镜像  #管道名称
    image: docker:latest
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    commands:
      - docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {}

volumes: #挂载
- name: dockersock
  host:
    path: /var/run/docker.sock

自部部署

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

kind: pipeline
type: docker
name: default

steps:
  - name: SSH部署  #管道名称
    image: drone/drone-runner-ssh:latest
    settings:
      host: 192.168.3.78
      username: root
      password: 123
      port: 22
      script: #部署执行动的命令
        - 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: default

steps:
  - name: Portainer部署 #管道名称
    image: curlimages/curl:latest
    commands:
      - curl -X POST "https://portainer.xxxx.com/api/webhooks/983DB2D1-34B8-4527-087B-08D76FE58AE5"

部署完成通知

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

kind: pipeline
type: docker
name: default

steps:
  - name: 部署完成通知 #管道名称
    image: curlimages/curl:latest
    commands:
      - curl -X POST "通知的webhook地址"

一个完整的示例如下:

kind: pipeline
type: docker
name: default

steps:
  - name: 构建&推送  #管道名称
    image: plugins/docker:latest
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    settings:
      registry: harbor.xxxxx.com #你部署的docker私库地址
      repo: harbor.xxxxx.com/project/web
      tags: latest
      dockerfile: ./Dockerfile
      pull_image: false #构建的时候是否强制拉取最新镜像
      username: abc
      password: 123

  - name: 清理镜像  #管道名称
    image: docker:latest
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    commands:
      - docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {}

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

  - name: 部署完成通知 #管道名称
    image: curlimages/curl:latest
    commands:
      - curl -X POST "通知的webhook地址"

volumes: #挂载点,共用
- name: dockersock
  host:
    path: /var/run/docker.sock

运行效果:

 

更多系列文章

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

From:https://www.cnblogs.com/netcore3/p/18325616
本文地址: http://shuzixingkong.net/article/545
0评论
提交 加载更多评论
其他文章 Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer
前段时间在 pulsar-client-go 社区里看到这么一个 issue: import "github.com/apache/pulsar-client-go/pulsar" client, err := pulsar.NewClient(pulsar.ClientOpti
Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer
keycloak~为微信二维码添加动态kc认可的动态state
本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的。 动态state 在Keycloak中使用微信二维码登录时,state参数确实是由后端生成的,并且用于确保登录过程的安全性,防止CSRF攻击等
keycloak~为微信二维码添加动态kc认可的动态state
上周热点回顾(7.22-7.28)
热点随笔: · 周边上新,T恤上星:博客园T恤幸运闪系列,上架预售,上照预览 (博客园团队)· 强烈推荐!!!阿里旗下10款顶级开源项目 (程序员晓凡)· 给园子的会员送送优惠,和你的数据库聊聊天:会员权益「Chat2D
Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
前言 Open CASCADE是由Open Cascade SAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。 本篇描述搭建Qt开发occ环境过程。 Demo 注意:用的
Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
h5py文件写入之——flush和update
hdf5是一个在量子化学和分子动力学模拟中经常有可能被用到的一种数据存储格式,得益于其良好的压缩率和完整性校验,一定程度上保障了其数据/轨迹存储的可靠性。本文介绍了关于hdf5文件的两个操作:更新已有的hdf5文件中的数据内容,以及flush同步更新的方法。
h5py文件写入之——flush和update h5py文件写入之——flush和update h5py文件写入之——flush和update
我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”
大家好,我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 ,并且针对该项目做了一个官网: 很多同学表示官网很好看,还好奇是怎么做的,其实这个网站的背后还有个有趣的小故事。。。 鱼皮:我们要做个官网,能下载应用就行,一周时间怎么样? 我们的前端开发 - 多喝热水同学:一周?太小瞧我了吧,1 小时
我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱” 我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱” 我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”
搭建自动化 Web 页面性能检测系统 —— 部署篇
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:琉易 liuxianyu.cn 这一篇是系列文章: 搭建自动化 Web 页面性能检测系统 —— 设计篇 搭建自动化 Web 页面性能检测系统 —— 实现篇 作
搭建自动化 Web 页面性能检测系统 —— 部署篇 搭建自动化 Web 页面性能检测系统 —— 部署篇 搭建自动化 Web 页面性能检测系统 —— 部署篇
git篇-- Git在项目实操中常见的使用命令--02
Git是现代软件开发中不可或缺的版本控制工具。它能帮助开发者跟踪项目的所有变更,并与团队成员高效协作。本文将介绍一些在项目实操中常见的Git命令,帮助你更好地管理代码。 1. 初始化和配置 初始化仓库 在一个新的项目目录中,初始化Git仓库: git init 配置用户信息 在提交代码之前,需要配置