转:基于 Drone + Gogs 构建私有 CI/CD 平台

2023-11-11

前言

很久之前、部署方案选择了基于 Docker 的容器化落地方案,极简描述与总结于 gogs_drone_docker。但是随着微服务抽象定义的服务越来越多、团队规模越来越壮大时,单机部署的自动化持续部署平台在并行处理任务可能会出现大量排队、扩容机制不灵活,同时为了统一、对齐部署姿势,因此将 DockerKubernetes

github/alicfeng/kubernetes_cicd

目的

拥抱云原生的敏捷开发姿势,践行持续集成 / 持续部署,标准化工作流程,自动化执行流程步骤,从而提升能效质量

devops.cicd

组件

此方案的组件选型并非唯一的选择,以自动化构建 Drone 作为基准,其它组件的选择是灵活可变的,每个组件支持丰富的选择,比如代码协作工具支持 GitlabGogs等,数据库支持SQLiteMySQLPostgres

看不到 mermaid 吗?那就安装谷歌浏览器 插件

graph LR
components(组件)

automate(自动化构建)
  drone(Drone)
    drone_server(Server)
    drone_runner(Runner)

git(代码协作)
 gogs(Gogs)

database(数据库)
  postgres(Postgres)

code_quality(代码质量检测)
  sonarqube(Sonarqube)


components-->automate
components-->git
components-->database
components-->code_quality

automate-->drone
drone-->drone_server
drone-->drone_runner

git-->gogs

database-->postgres

code_quality-->sonarqube

复制

部署

前置说明

  1. 持久化后端存储使用阿里云的 NAS
  2. VirtualService.yaml 为阿里云网格服务的虚拟服务编排定义,根据实际情况而定,常见 IngressTraefik ...
  3. 此方案上部分应用依赖 postgres,因便于调试采取容器化部署(生产上不推荐)
  4. 计划后续将支持 helm 部署

部署步骤

⚠️因为环境、配置、后端存储、调度策略等不一致,需要自定修改编排文件

创建命名空间

➜ kubectl create namespace devops

复制

创建节点标签

➜ kubectl label nodes ${cicd_node} cicd=true

复制

创建节点污点

➜ kubectl taint nodes ${cicd_node} operation=cicd:NoSchedule

复制

部署组件应用

# 部署数据库依赖.postgres
kubectl apply -f postgres

# 部署代码协作工具git.gogs
kubectl apply -f gogs

# 部署自动化构建工具dorne
kubectl apply -f drone/server
kubectl apply -f drone/runner

# 部署代码质量检测工具
kubectl apply -f sonarqube

复制

运行

drone

编排

kind: pipeline
name: Demo
type: kubernetes

clone:
  disable: true

steps:
- name: 克隆源码
  image: drone/git

- name: 加载缓存
  image: drillster/drone-volume-cache
  volumes:
  - name: cache
    path: /cache
  settings:
    restore: true
    mount:
    - ./vendor

- name: 安装依赖
  image: registry.cn-shenzhen.aliyuncs.com/tq_library/php8.0_runtime:develop
  commands:
  - composer config repo.packagist composer https://mirrors.aliyun.com/composer/
  - COMPOSER_MEMORY_LIMIT=-1 /usr/local/bin/composer install --optimize-autoloader -vvv
  when:
    branch:
    - develop

- name: 单元测试
  image: registry.cn-shenzhen.aliyuncs.com/tq_library/php8.0_runtime:develop
  commands:
  - ./vendor/phpunit/phpunit/phpunit

- name: 构建镜像
  image: plugins/docker
  settings:
    username:
      from_secret: DOCKER_USERNAME
    password:
      from_secret: DOCKER_PASSWORD
    repo: registry.cn-shenzhen.aliyuncs.com/application/demo
    registry: registry-vpc.cn-shenzhen.aliyuncs.com
    insecure: true
    purge: false
    tags: ${DRONE_BUILD_NUMBER}

- name: 部署开发
  image: quay.io/honestbee/drone-kubernetes
  settings:
    kubernetes_server:
      from_secret: KUBERNETES_DEV_SERVER
    kubernetes_token:
      from_secret: KUBERNETES_DEV_TOKEN
    namespace:
      from_secret: KUBERNETES_DEV_NAMESPACE
    deployment: demo
    container: [app]
    repo: registry.cn-shenzhen.aliyuncs.com/application/demo
    tag: ${DRONE_BUILD_NUMBER}

- name: 代码分析
  image: aosapps/drone-sonar-plugin
  detach: true
  settings:
    sonar_host:
      from_secret: SONAR_HOST
    sonar_token:
      from_secret: SONAR_TOKEN
  when:
    branch:
    - develop

- name: 构建文档
  image: registry.cn-shenzhen.aliyuncs.com/tq_library/apidoc_runtime:1.0.0
  commands:
    - apidoc -c apidoc.json -i app/Http/Controllers -o document/document/demo

- name: 文档部署
  image: alicfeng/publish_aliyun_oss:1.0.1
  settings:
    access_key_id:
      from_secret: DOCUMENT_ACCESS_KEY_ID
    access_key_secret:
      from_secret: DOCUMENT_ACCESS_KEY_SECRET
    app_publish_dir:
      from_secret: DOCUMENT_APP_PUBLISH_DIR
    oss_end_point:
      from_secret: DOCUMENT_OSS_END_POINT
    oss_bucket_name:
      from_secret: DOCUMENT_OSS_BUCKET_NAME
    cdn_object_path:
      from_secret: DOCUMENT_CDN_OBJECT_PATH
    cdn_object_type:
      from_secret: DOCUMENT_OSS_OBJECT_TYPE
    cdn_region_id:
      from_secret: DOCUMENT_CDN_REGION_ID

- name: 部署测试
  image: quay.io/honestbee/drone-kubernetes
  settings:
    kubernetes_server:
      from_secret: KUBERNETES_TEST_SERVER
    kubernetes_token:
      from_secret: KUBERNETES_TEST_TOKEN
    namespace:
      from_secret: KUBERNETES_TEST_NAMESPACE
    deployment: demo
    container: [app]
    repo:  registry.cn-shenzhen.aliyuncs.com/application/demo
    tag: ${DRONE_BUILD_NUMBER}
  when:
    target:
    - test

- name: 部署生产
  image: quay.io/honestbee/drone-kubernetes
  settings:
    kubernetes_server:
      from_secret: KUBERNETES_PROD_SERVER
    kubernetes_token:
      from_secret: KUBERNETES_PROD_TOKEN
    namespace:
      from_secret: KUBERNETES_PROD_NAMESPACE
    deployment: demo
    container: [app]
    repo:  registry.cn-shenzhen.aliyuncs.com/application/demo
    tag: ${DRONE_BUILD_NUMBER=latest}
  when:
    target:
    - production

- name: 构建缓存
  image: drillster/drone-volume-cache
  volumes:
  - name: cache
    path: /cache
  settings:
    rebuild: true
    mount:
    - ./vendor

volumes:
  - name: cache
    host:
      path: /data/drone/compose

# k8s.tolerations 部署时修改了调度策略 视情况而定
tolerations:
  - key: operation
    operator: Equal
    value: cicd
    effect: NoSchedule

 转:基于 Drone + Gogs 构建私有 CI/CD 平台 | Kubernetes 篇-腾讯云开发者社区-腾讯云

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转:基于 Drone + Gogs 构建私有 CI/CD 平台 的相关文章

  • kubectl:在 WSL 终端中找不到

    我按照以下说明在 Windows10 上安装了 WSL2 https learn microsoft com en us windows wsl install win10 https learn microsoft com en us w
  • Kubernetes,VolumeMount 一个文件,而不是一个目录

    我将使用 K8S 来编排 docker 容器 在 k8s 中 我需要从主机目录复制一个文件 configs nginx cas server conf 到 pod 容器目录 etc nginx nginx conf 但是目前的k8s只允许挂
  • 获取 Pod 处于挂起状态的平均时间

    我正在尝试使用 prometheus 计算 pod 在 grafana 中处于挂起状态的平均时间 我可以使用此查询生成一个图表 以获取一段时间内处于挂起状态的 Pod 数量 sum kube pod status phase phase P
  • Kubernetes 如何跟踪 StatefulSet 中哪个云盘挂载到哪个 Pod 上?

    我在 GKE 上创建了一个 StatefulSet 它配置了一堆附加到属于该 StatefulSet 的 Pod 的 GCE 磁盘 假设我将 StatefulSet 缩放为 0 组成的 Pod 被销毁并释放磁盘 当我扩大规模时 磁盘会重新连
  • 我应该在 Kubernetes 前面添加 DMZ 吗?

    Kubernetes Ingress 是否足够安全 可以避免在 Kubernetes 前面添加 DMZ 来暴露 Pod 和服务 如果有人 黑进 Pod 会发生什么 Thanks 这是一个意见问题 所以我会用一个选项来回答 如果您遵循 这是非
  • microk8s加入节点没有效果

    我确实命令 om 主节点 microk8s add node From the node you wish to join to this cluster run the following microk8s join 192 168 0
  • Windows 持久卷上的 Kubernetes

    Windows minikube 是否支持带有主机路径的持久卷 如果是这样 语法是什么 I tried apiVersion v1 kind PersistentVolume metadata name kbmongo002 labels
  • K8s更改配置映射并更新应用程序日志级别

    我想更改在 K8S 上运行的 Golang 应用程序的登录配置 我在本地尝试了以下代码 它按预期工作 我正在使用 viper 来监视配置文件更改 这是带有日志配置的配置图 apiVersion v1 kind ConfigMap data
  • 为什么ReadWriteOnce在不同的节点上工作?

    我们在 K8s 上运行的平台有不同的组件 我们需要在其中两个组件 comp A 和 comp B 之间共享存储 但我们错误地将 PV 和 PVC 定义为ReadWriteOnce即使这两个组件在不同的节点上运行 一切都正常 我们能够从两个组
  • 如何在 Helm 图表中配置 docker 入口点

    我有以下内容docker compose文件 我不明白如何设置working dir and entrypoint在掌舵deployment yaml 有人有关于如何执行此操作的示例吗 docker compose version 3 5
  • Microk8s 节点未准备好 - InvalidDiskCapacity

    microk8s的节点不想启动 Kube system Pod 处于挂起状态 kubectl describe nodes说是警告InvalidDiskCapacity 我的服务器有足够的资源 PODS NAMESPACE NAME REA
  • 如何从 minikube 中删除现有下载的 docker 镜像

    我正在将多个服务部署到本地集群 minikube using 开发空间工具 https devspace sh 一旦有人对其中一项服务进行更改并将图像推送到我们的私人存储库 我就需要这些更改在我的本地可用 我现在所做的就是完全删除minik
  • 如何在Prometheus中查询容器内存限制

    我正在使用 Prometheus 工具来监控我的 Kubernetes 集群 我在部署中设置了资源限制 内存限制 并且需要配置一个面板来显示可用的总内存 请让我知道在 Prometheus 中运行以获得可用于我的部署的总内存限制所需的查询
  • Kubernetes 集群中的 Websocket 连接与 nginx-ingress

    我正在尝试在 Kubernetes 集群中运行的服务器上建立一个简单的 Websocket 连接 Websocket 连接能够在我的本地测试计算机上建立 但在使用 nginx ingress 部署到 GKE 后 我无法将客户端连接到服务器
  • 如何在 minikube VM 中挂载 Host 文件夹

    我有一个用例 我需要 kubernetes 下的 Docker 容器来访问主机路径 我使用的是 minikube 容器能够访问 minikube VirtualBox VM 中的文件夹 但我不知道如何让它访问主机本身上的文件夹 我在主机上执
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 如何使用 nginx 入口控制器仅允许每个 pod 建立一个连接

    我的 Kubernetes 集群使用副本集来运行 N 个相似的 pod 由于资源限制 每个 Pod 只能处理一个 WebSocket 连接 我的 Kubernetes 使用 nginx 入口控制器 有没有办法让 nginx 每个 pod 仅
  • 列出命名空间中的所有资源

    我想查看命名空间中的所有资源 Doing kubectl get all尽管有名称 但不会列出服务和入口等内容 如果我知道类型 我可以明确要求该特定类型 但似乎也没有用于列出所有可能类型的命令 尤其kubectl get例如 不列出自定义类
  • 在 Kubernetes Pod 部署名称上添加随机字符串

    我有一个模板 它基本上是一个实用程序容器 用于在 pod 内运行 kubectl 我想要做的是能够使用不同的名称对同一模板进行多个部署 如 utilitypod randomID 中所示 有没有办法通过 kubectl 和一些 shell
  • 找不到 Kubernetes 持久卷挂载

    我正在尝试创建并安装卷 但陷入困境 这部分创建存储 apiVersion v1 kind PersistentVolumeClaim metadata name pvclaim2 spec accessModes ReadWriteOnce

随机推荐

  • msvcp120.dll文件缺失一键修复方法,靠谱的多种修复msvcp120.dll方案

    msvcp120 dll文件的丢失 其实是比较常见的 msvcp120 dll是一个Microsoft Visual C Redistributable的关键文件 它包含了一些用于C 编程的标准函数和类的定义 如果msvcp120 dll丢
  • [Telegram X]旧版分享 突破被锁群组

    Telegram X的锁群是由于 App Store 审核时发现Telegram官方并不限制18 社会舆论等的讨论 在 版本 5 0 2 版本号825487096 时就已经封禁该类群组 注 可能由于新版审核时由于存在这些内容被禁止发布在Ap
  • 初识OceanBase

    OceanBase 是一款由阿里巴巴公司自主研发的高性能 分布式的关系型数据库 支持完整的 ACID 特性 高度兼容 MySQL 协议与语法 能够以最小的迁移成本使用高性能 可扩张 持续可用的分布式数据服务 OceanBase 实现了数千亿
  • Redis面试题(IO多路复用)

    目录 Redis是单线程的 但是为什么还那么快 阻塞IO 非阻塞IO IO多路复用 网络模型 面试回答 Redis是单线程的 但是为什么还那么快 答 Redis是纯内存操作 执行速度非常快 采用单线程 避免不必要的上下文切换可竞争条件 多线
  • 铜缆有哪些优点?

    铜缆包含由铜金属制成的电线 长期以来一直用于传输数据 这些电缆使用流经铜线的电脉冲将数据从始发端传输到接收端 铜电缆通常用于电信行业 汽车行业和供电系统 铜缆有哪些优点 优质的电导体 铜是非常好的电导体之一 非常适合使用电脉冲传输数据 易于
  • CSS图标与链接

    目录 如何添加图标 Font Awesome 图标 实例 Bootstrap 图标 实例 Google 图标 实例 为图标添加样式或颜色 设置链接样式 实例 实例 文本装饰 实例 背景色 实例 链接按钮 实例 更多实例 如何添加图标 向 H
  • 结构体强制类型转换

    在c语言中 结构体和int等类型一样 都是数据类型 其他类型怎么转换 结构体就怎么转换 没有特殊的地方 对于这个问题 可能想问的是这个吧 如果将一个结构体强制类型转换为另一个结构体 或者类型 那这个结构体的成员怎么样了 如果将一个结构体强制
  • 智能化的设备管理系统,为企业信息化建设添砖加瓦

    设备管理的智能化 数字化 可视化是企业信息化建设的三大趋势 也是智能智慧工厂建设的重要内容 因此引进成熟先进的设备管理系统 是每一个企业当下的重要工作 璞华大数据HawkEye设备智能维保平台分为两个维度协助企业进行设备管理 即设备资产管理
  • 11-10 格式化文本的输入输出

    1 scanf 和 printf scanf 和 printf 函数日常使用较多 此处不多介绍了 详细内容可参考 https zh cppreference com w c io fscanf 2 sscanf 和 sprintf ssca
  • JVM虚拟机技术原理与实现

    一 Java语言与Java虚拟机 1 Java语言简介 Java是Sun公司推出的Java语言和Java平台的总称 在操作系统中安装Java平台后Java应用程序即可直接运行 Java程序被编译成字节码解释执行 使Java程序与平台无关 J
  • es根据条件删除数据

    es根据条件删除数据 POST请求 http localhost 9200 indexName delete by query 请求参数 query match columnName 搜索列的条件
  • 哪些元器件在未来会有更广泛的应用?

    随着科技的发展和进步 电子技术已经成为现代社会的重要组成部分 元器件作为电子产品的基本构成单元 其发展和应用对于电子技术的进步和创新有着至关重要的作用 随着人工智能 物联网和智能制造等新兴技术的快速发展 一些元器件已经或者将在未来得到更广泛
  • 解决 mysql 自动增长的 id 不是从 1 开始 或 不连续

    原因 1 insert 失败后 id 已自动增加 会造成 id 不连续 2 delete 后 再重新插入数据后 id 会从删除前最后的 id 开始增加 造成 id 不是从1开始增加 注意 删除全部数据时 不要用 delete from ta
  • Random.Range()的范围问题

    Random Range 方法的是进行差生随机数的一个方法 int i Random Range min max 这里进行产生的随机数 当min max相等 产生的随机数返回的是min 因为min max 产生的最大的也就是max 当min
  • HTML-页面经3秒之后自动跳转,动态刷新秒数

    样图 div div
  • MATLAB复习

    目录 矩阵 定义矩阵 查找矩阵元素 特殊矩阵 矩阵运算 乘方与点乘 字符串数组 创建字符串 查找字符 字符串转换 创建字符串数组 元胞数组 元胞数组的创建 元胞数组的显示 celldisp 和 cellplot 元胞数组的扩充和收缩 元胞数
  • VMware中安装mysql

    文章目录 1 将windows下的安装包上传到Linux服务器 安装包移动并解压 3 卸载系统自带的mysql 4 安装mysql服务端 5 安装mysql客户端 6 登录mysql 6 1 查看root密码 6 2 启动mysql服务 6
  • 刷脸支付自主创业超低门槛等您来

    新兴的人工智能技术不断被应用到支付场景中 指纹支付 声纹支付到刷脸支付 新技术的蔓延总是能出乎我们的意料 迅速地渗透进生活的方方面面 行业监管趋严 智能应用不断迭代 双重作用下 支付行业正迎来一次革命性的转折 刷脸支付开始普及 中国有700
  • Excel:LOOKUP函数的经典用法

    1 逆向查询 下面这个表中 A C列是员工基础信息表 分别是部门 姓名和职务 现在要根据E5单元格中的员工姓名 在这个信息表中查询属于哪个部门 也就是咱们常说的逆向查询 就可以使用LOOKUP函数了 F5单元格输入以下公式 LOOKUP 1
  • 转:基于 Drone + Gogs 构建私有 CI/CD 平台

    前言 很久之前 部署方案选择了基于 Docker 的容器化落地方案 极简描述与总结于 gogs drone docker 但是随着微服务抽象定义的服务越来越多 团队规模越来越壮大时 单机部署的自动化持续部署平台在并行处理任务可能会出现大量排