微服务 云原生:基于 Gogs + Drone 实现 CI/CD 自动化

news2025/6/21 3:19:18

一般构建部署

以一个简单的前后端项目来说,分别编写前后端的 Dockerfile 文件并构建镜像,然后编写 docker-compose.yml 构建部署,启动运行。每次代码变更后都需重新手动打包、构建、推送。

一个简单的例子:

  • 前端:
    • 项目名:kubemanagement-web
    • 技术栈:Vue
  • 后端:
    • 项目名:kubemanagement
    • 技术栈:Golang

tips: 不同语言对应的构建逻辑编写不同。关于 Dockerfile 以及 docker-compose 如何编写,请查阅官方文档,此处不在赘述。

1. 编写前端 Dockerfile 文件:

#第一阶段构建
FROM node:16.13.2 as builder
WORKDIR /app/kubemanagement-web

COPY . .

RUN npm config set registry https://registry.npmmirror.com
RUN npm install

# 开始构建
RUN npm run build:prod

# 第二阶段构建
FROM nginx
COPY --from=builder /app/kubemanagement-web/dist/ /usr/share/nginx/html/
COPY --from=builder /app/kubemanagement-web/default.conf.template /etc/nginx/templates/default.conf.template
EXPOSE 80

2. 编写后端 Dockerfile 文件:

FROM golang:1.20-alpine3.16 as builder
WORKDIR /go/src/kubemanagement.com/server
COPY . .

RUN go env -w GO111MODULE=on \
   && go env -w GOPROXY=https://goproxy.cn,direct \
   && go env -w CGO_ENABLED=0 \
   && go env \
   && go mod tidy \
   && go build -o server .

FROM alpine:latest

LABEL MAINTAINER="zj20162325@163.com"

WORKDIR /go/src/kubemanagement.com/server
COPY --from=0 /go/src/kubemanagement.com/server/config.yaml ./config.yaml
COPY --from=0 /go/src/kubemanagement.com/server/.kube/config ./.kube/config
COPY --from=0 /go/src/kubemanagement.com/server/server ./
EXPOSE 8082
ENTRYPOINT ./server

3. 分别构建镜像:

  • 前端
docker build -t harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0 .
  • 后端
docker build -t harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0 .

结果如下:
在这里插入图片描述
如果需要推送镜像,比如推送到私有 Harbor 仓库,可执行:

docker push harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0
docker push harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0

Harbor 的搭建可参考 微服务 & 云原生:搭建 Harbor 私有镜像仓库。

4. 编写 docker-compose.yml 文件:

version: "3"

networks:
  network:
    ipam:
      driver: default
      config:
        - subnet: '177.7.0.0/16'

services:
  web:
    container_name: kubemanagement-web
    image: harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0
    restart: always
    environment:
      BACKEND_HOST: 'http://177.7.0.12:8082/'
    ports:
      - '8081:80'
    depends_on:
      - server
    networks:
      network:
        ipv4_address: 177.7.0.11

  server:
    container_name: kubemanagement-server
    image: harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0
    restart: always
    ports:
      - '8082:8082'
    networks:
      network:
        ipv4_address: 177.7.0.12

使用 docker-compose 自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作:

docker-compose up -d

结果如下:
在这里插入图片描述
此时通过相应 ip:port 即可访问页面,示例页面如下:
在这里插入图片描述

使用 Gogs & Drone 持续集成

在这里插入图片描述

Gogs

编写 gogs 的 docker-compose.yml 文件

version: "3"

volumes:
  gogsdata:

services:
  gogs:
    container_name: gogs
    image: gogs/gogs:0.12.10
    volumes:
    - gogsdata:/data
    restart: always
    ports:
      - '10880:3000'

执行:

docker-compose up -d

结果如下:
在这里插入图片描述
通过 10880 端口访问:
在这里插入图片描述
数据库根据需求来选,这里选择最轻量级的 SQLite3 作为演示,其他配置项可以默认,由于编写 docker-compose.yml 时做了端口映射,主要修改域名、端口号,如下:
在这里插入图片描述
编写完可选配置后点击立即安装,我这里就简单设置管理员信息:
在这里插入图片描述
gogs 的使用与 git 基本一致,简单创建一个仓库并提交信息:
在这里插入图片描述

Drone

编写 docker-compsoe.yml 文件:

version: "3"

volumes:
  dronedata:

services:
  drone-server:
    image: drone/drone:2
    container_name: drone-server
    environment:
      DRONE_AGENTS_ENABLED: "true"
      DRONE_GOGS_SERVER: "http://192.168.65.134:10880"
      # openssl rand -hex 16 生成, server 与 runner 的 DRONE_RPC_SECRET 设置相同
      DRONE_RPC_SECRET: "02cfbfe91f999c6f334158f4cf737490"
      DRONE_SERVER_HOST: "192.168.65.134:9080"
      DRONE_SERVER_PROTO: "http"
      # 必须是管理员身份,方便后续的配置选项等操作
      DRONE_USER_CREATE: "username:BetaCatPro,admin:true"
    volumes:
    - dronedata:/data
    restart: always
    ports:
    - '9080:80'
    - '9443:443'
  
  drone-runner:
    image: drone/drone-runner-docker:1
    container_name: drone-runner
    environment:
      DRONE_RPC_SECRET: "02cfbfe91f999c6f334158f4cf737490"
      DRONE_RPC_HOST: "192.168.65.134:9080"
      DRONE_RPC_PROTO: "http"
      DRONE_RUNNER_CAPACITY: "2"
      DRONE_RUNNER_NAME: "first-runner"
    volumes:
    - /etc/docker/:/etc/docker
    - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    ports:
    - '3000:3000'
    depends_on:
    - drone-server

部分参数说明:

  • DRONE_GOGS_SERVER : Gogs 服务地址(需要http://开头)
  • DRONE_RPC_SECRET: Drone 服务密匙(runner 也要使用相同密钥)
  • DRONE_SERVER_HOST: Drone 服务地址,外部可访问的域名或IP地址
  • DRONE_SERVER_PROTO: Drone提供服务的协议类型,可选为 http 或 https
  • DRONE_USER_CREATE: 设置Drone管理员账号(是Gogs平台里的账号)

执行 :

docker-compose up -d

结果:
在这里插入图片描述
浏览器访问 ip:port:
在这里插入图片描述
登录用户名密码为上一步注册 gogs 时所用的,登录成功进入主页:
在这里插入图片描述
这里会显示 gogs 中创建的代码仓库列表。

流水线配置

激活钩子

进入 drone 相应仓库页面,点击 ACTIVATE REPOSITORY 按钮,激活钩子:
在这里插入图片描述

激活后可以看到一些设置项,注意一定要把 Trusted 选型勾选,否则在后续编写钩子文件定义挂载操作时会出现下面错误:

Drone untrusted repositories cannot mount host volumes

在这里插入图片描述
进入到 gogs 中相应仓库,点击仓库设置:
在这里插入图片描述
可以看到管理的 Web 钩子:
在这里插入图片描述

编写 .drone.yml 钩子文件

在项目根目录下编写 .drone.yml 文件,用于定义触发 git 提交时的一系列操作,这里以文章开头描述的 kubemanagement-web 前端项目为例:

kind: pipeline
type: docker
name: kubemanagement-web-publish

environment:
  GOOS: linux
  GOARCH: amd64

steps:
  - name: build
    image: plugins/docker
    volumes:
      - name: hosts
        path: /etc/hosts
      - name: docker-ca
        path: /etc/docker
      - name: dockersock
        path: /var/run/docker.sock
    settings:
      username: admin
      password:
      	# 注意在 drone 页面的 Secrets 添加对应配置
        from_secret: harbor_password
      repo: harbor.kubemanagement.com/kubemanagement/kubemanagement-web
      registry: harbor.kubemanagement.com
      tags:
        - v1.1
  - name: ssh commands
    image: appleboy/drone-ssh
    settings:
      host: 192.168.65.134
      username: root
      password:
      	# 注意在 drone 页面的 Secrets 添加对应配置
        from_secret: ssh_password
      port: 22
      script:
        #拉取镜像并重启 注意--需要提前在目标主机完成docker login
        - if [ $(docker ps -a | grep kubemanagement-web | wc -l) -ge 1 ];then docker stop kubemanagement-web && docker rm kubemanagement-web; fi
        - docker pull harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.1
        - export BACKEND_HOST=http://192.168.65.134:8082/
        - docker run --name kubemanagement-web --restart=always -d -p8081:80 -e BACKEND_HOST=$BACKEND_HOST harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.1
volumes:
  - name: hosts
    host:
      path: /etc/hosts
  - name: docker-ca
    host:
      path: /etc/docker
  - name: dockersock
    host:
      path: /var/run/docker.sock

然后在 drone 页面的 Secrets 添加对应配置,这里按照 .drone.yml 文件中使用到的有 harbor_password 和 ssh_password,value 分别为对应平台的密码,我这里 harbor 的密码为123456,gogs 密码为 by6671715,分别添加即可:
在这里插入图片描述
编写好文件后,可进行代码提交。不过还需要查看 gogs 的配置文件中有没有将 ip 加入到白名单中,如果有多个 ip 则用 , 分隔。我这里 ip 为 192.168.65.134。具体配置如下:

  1. 首先查看 gogs 挂载的卷,查看 Mounts 里 Source 的内容(注意,时下图箭头指向的位置),配置文件即在此目录下:
docker inspect gogs

在这里插入图片描述

cd /var/lib/docker/volumes/gogs_gogsdata/_data
cd gogs/conf
vim app.ini
  1. 在 security 处加上配置:
LOCAL_NETWORK_ALLOWLIST = 192.168.65.134

在这里插入图片描述
3. 重启 gogs

# 返回存放 gogs 的 docker-compose.yml 的目录
docker-compose restart

如果没有配置,还继续提交代码的话,会出现下面情况:
在这里插入图片描述
在这里插入图片描述
可以看到,虽然提交成功,但点击仓库设置,进入管理 Web 钩子项,点击存在的钩子,如 http://192.168.65.134:9080/hook,可以看到:
在这里插入图片描述
钩子并没有生效,并报错:

Payload URL resolved to a local network address that is implicitly blocked.

提交代码,触发 Hooks

成功提交代码,并触发钩子后,gogs 页面中显示成功信息:
在这里插入图片描述
drone 页面信息如下:
在这里插入图片描述
点击进入,可以在 GRAPH VIEW 查看详细进度及日志:
在这里插入图片描述
可以看到目前处于 build 阶段。完全构建完成后,页面如下:
在这里插入图片描述
harbor 页面中对应的镜像版本也推送成功:
在这里插入图片描述

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

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

相关文章

解读HTML-入门第一文

HTML详细解读 概念解读基本结构常用标签标题标签(h1~h6)段落标签(p)链接标签(a)图像标签(img)列表标签(ul、ol、li)表格标签(table、tr、td&#…

轻量级锁实现1——结构体解析、初始化

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 从底层理解轻量级锁的实现,从保护共享内存的角度理解轻量级锁的使用场景,包括上锁、等待、释放,理…

android 如何分析应用的内存(十六)——使用AS查看Android堆

android 如何分析应用的内存(十六)——使用AS查看Android堆 在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。 本文将介绍,如何查看堆中的内容。大概有: 堆中的对象,有哪些堆中的对象&#xff0…

“Can‘t open perl script configure : No such file or directory”的解决办法

编译OpenSSL的时候执行到 perl configure 时提示找不到configure, 然后在网上搜了搜,大家给的解决办法一般都是说设置环境变量或者指定configure路径再执行;我试了都不行, 最后我把perl卸了重装就正常了; 然后我换了…

QEMU源码全解析32 —— Machine(2)

接前一篇文章:QEMU源码全解析31 —— Machine(1) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一篇文章给m…

【力扣每日一题】2023.8.11 矩阵对角线元素的和

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个矩阵,让我们把矩阵对角线上的元素都加起来返回。 那么矩阵的对角线是有两条的,一条是从左上到右下…

Maven安装与配置教程

目录 一、前言 1.什么是Maven 2.为什么要使用Maven 二、Maven安装与配置 1.官网下载 2.Maven配置 3.修改Maven仓库下载镜像及修改仓库位置 3.1.修改仓库下载镜像地址 3.2.修改默认Maven的仓库位置 三、eclipse配置Maven 四、eclipse部署Maven项目 注意事项&#xff…

Python非线性全局优化

文章目录 全局优化函数简介详解性能测试 全局优化函数简介 scipy的optimize模块非常强大,也是我个人使用最多的scipy模块,这里面封装的都是成熟且高效的算法,久经考验。对于参加数学竞赛的同学来说,辛辛苦苦撸出来的遗传算法、模…

Eudic欧路词典 for Mac v4.4.5增强版

欧路词典 (Eudic)是一个功能强大的英语学习工具,它包含了丰富的英语词汇、短语和例句,并提供了发音、例句朗读、单词笔记等功能。 多语种支持:欧路词典支持多种语言,包括英语、中文、日语、法语等等,用户可以方便地进…

Kubernetes 调度 约束

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIServer…

python——案例14:斐波那契数列

兔子生殖为例子而引入,故又称“兔子数列”, 其数值为:1、1、2、3、5、8、13、21、34……在数学上, 这一数列以如下递推的方法定义: F(0)1,F(1)1, F(n)F(n - 1)F(n - 2)(n ≥ 2,n ∈ …

液体神经网络:LNN是个啥概念?

一、说明 在在人工智能领域,神经网络已被证明是解决复杂问题的非常强大的工具。多年来,研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络(LNN)的概念,这是一个利用动态计算功能的迷人框…

Simpack助力中国铁路创新发展

中国铁路尤其是高铁的迅速发展是中国装备制造业走向世界一张名片,不仅为人们出行提供了便利,也为中国经济的快速增长提供了有力的支撑。同时,高速铁路的发展给产品研发带来了新的课题和挑战。尤其在动力学领域,各部件或子系统之间…

DP(区间DP)

石子合并 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆…

远程通信-RPC

项目场景: 在分布式微服务架构中,远程通信是最基本的需求。 常见的远程通信方式,有基于 REST 架构的 HTTP协议、RPC 框架。 下面,从三个维度了解一下 RPC。 1、什么是远程调用 2、什么是 RPC 3、RPC 的运用场景和优 什么是远程调用…

树莓派第一次开机

文章目录 基于树莓派的OpenEuler基础实验一一、树莓派介绍树莓派较普通电脑的优势1、廉价便携可折腾2、树莓派运行开源的Linux操作系统3、编程好平台4、开源大社区5、引脚可编程6、便携随身带7、灵活可扩展 二、openEuler embedded介绍三、树莓派开机指南1. 硬件准备2. 软件准备…

ROS入门-使用常用的ROS命令行工具:操作节点、话题、服务、消息和参数

目录 使用常用的ROS命令行工具:操作节点、话题、服务、消息和参数 1. rosnode:操作节点 2. rostopic:操作话题 3. rosservice:操作服务 4. rosmsg:操作msg消息 5. rossrv:操作srv消息 6. rosparam&am…

MySQL 存储过程、函数、触发器、事件

​ 目录 存储过程 创建存储过程 调用存储过程 查看存储过程 删除存储过程 进阶 变量 if条件判断 传递参数 case结构 while循环 repeat结构 loop语句 leave语句 游标/光标 存储函数 触发器 创建触发器 删除触发器 查看触发器 事件 查看事件调度器是否开启…

eNSP:ebgp和bgp的基础运用

实验要求&#xff1a; 拓扑图&#xff1a; 命令操作&#xff1a; r1: <Huawei>sys [Huawei]sys r1 [r1]int g 0/0/1 [r1-GigabitEthernet0/0/1]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/1]int lo0 [r1-LoopBack0]ip add 1.1.1.1 24[r2]ospf 1 router-id 2.2.2.2 [r2…

肉豆蔻酰五肽-8——祛眼袋和黑眼圈

肉豆蔻酰五肽-8 简介 眼袋和黑眼圈形成的原因&#xff1a; 1. 随着年龄的增大眼部皮肤会失去弹性, 眼部肌肉同时也会松弛, 从而在眼脸形成皱褶。衬垫在眼眶的脂肪从眼腔转移出并在眼脸聚集。袋状眼脸医学上称为皮肤松垂, 通常可以通过眼脸成形术得到改善。 2. 眼袋形成另外一…