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

一般构建部署

以一个简单的前后端项目来说,分别编写前后端的 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-webCOPY . .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:latestLABEL 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: defaultconfig:- subnet: '177.7.0.0/16'services:web:container_name: kubemanagement-webimage: harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0restart: alwaysenvironment:BACKEND_HOST: 'http://177.7.0.12:8082/'ports:- '8081:80'depends_on:- servernetworks:network:ipv4_address: 177.7.0.11server:container_name: kubemanagement-serverimage: harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0restart: alwaysports:- '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: gogsimage: gogs/gogs:0.12.10volumes:- gogsdata:/datarestart: alwaysports:- '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:2container_name: drone-serverenvironment: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:/datarestart: alwaysports:- '9080:80'- '9443:443'drone-runner:image: drone/drone-runner-docker:1container_name: drone-runnerenvironment: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.sockrestart: alwaysports:- '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-publishenvironment:GOOS: linuxGOARCH: amd64steps:- name: buildimage: plugins/dockervolumes:- name: hostspath: /etc/hosts- name: docker-capath: /etc/docker- name: dockersockpath: /var/run/docker.socksettings:username: adminpassword:# 注意在 drone 页面的 Secrets 添加对应配置from_secret: harbor_passwordrepo: harbor.kubemanagement.com/kubemanagement/kubemanagement-webregistry: harbor.kubemanagement.comtags:- v1.1- name: ssh commandsimage: appleboy/drone-sshsettings:host: 192.168.65.134username: rootpassword:# 注意在 drone 页面的 Secrets 添加对应配置from_secret: ssh_passwordport: 22script:#拉取镜像并重启 注意--需要提前在目标主机完成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: hostshost:path: /etc/hosts- name: docker-cahost:path: /etc/docker- name: dockersockhost: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.hqwc.cn/news/61551.html

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

相关文章

数据库的存储过程、触发器、事件 实现(超精简)

一 存储过程 什么是存储过程 : 自己搜 和代码写的有什么区别: 没区别 为什么用存储过程: 快 例子 -- 创建 test名字的存储过程 CREATE PROCEDURE test(in idin INT) BEGIN-- 创建变量declare id int default 0;declare stopflag int defau…

tomcat入门介绍

tomcat官网下载8.5.9版本,官网地址:https://tomcat.apache.org/download-80.cgi 下载完成后直接解压即可 tomcat目录 解压后,可以看到tomcat有以下目录 /bin - 启动、关闭和其他脚本 *.sh后缀是linux下的脚本文件*.bat后缀windows系统下的…

【C语言学习】函数的定义和调用

一、函数定义 要有返回类型、函数名和函数体 二、调用函数 函数名(函数值); ()起到表示函数调用的重要作用,即使没有参数也需要() 若有参数,则需要给出正确的数量和顺序…

内网隧道—HTTP\DNS\ICMP

本文仅限于安全研究和学习,用户承担因使用此工具而导致的所有法律和相关责任! 作者不承担任何法律和相关责任! HTTP隧道 Neo-reGeorg Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,目的是: 提高可用性&#xff0…

innovus 报告多边形floorplan的boundary坐标

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球 历史文章: 常用dbGet命令 dbGet快速入门 使用"Cut Rectilinear"功能可以​调整floorplan形状,使其变成非矩形多边形(polygon)。​ …

前端面试自我介绍

前端面试自我介绍精选篇1 各位面试官大家好,我叫__,就读于__大学__学,大学本科学历,我的求职意向是与金融专业相关的职位,本人拥有较强的学习能力,能快速适应工作环境,兴趣爱好广泛&#xff0c…

计算机服务器被360后缀勒索病毒攻击怎么办,勒索病毒解密

计算机技术的不断发展,不仅方便了企业的生产生活,也为社会的发展带来了巨大贡献,但随之而来的网络威胁也不断增加,勒索病毒就是其中较为常见的常见的威胁。近期,我们收到很多企业的求助,企业的计算机服务器…

Stable Diffusion - 幻想 (Fantasy) 风格与糖果世界 (Candy Land) 的人物图像提示词配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132212193 图像由 DreamShaper8 模型生成,融合糖果世界。 幻想 (Fantasy) 风格图像是一种以想象力为主导的艺术形式,创造了…

Android:换肤框架Android-Skin-Support

gihub地址:https://github.com/ximsfei/Android-skin-support 样例: 默认: 更换后: 一、引入依赖: // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…

Spring MVC程序开发

目录 1. 什么是Spring MVC? 1.1 什么是MVC 1.2 MVC和Spring MVC 的关系 1.3 为什么要学Spring MVC? 2. Spring MVC的使用 2.1 Spring MVC的创建和连接 2.1.1 项目创建 2.1.2 项目连接 2.1.2.1 连接 2.1.2.2 RequestMapping注解介绍 2.1.2.3 GetMapping和 PostMapping 2.2 获取…

17.电话号码的字母组合(回溯)

目录 一、题目 二、代码 一、题目 17. 电话号码的字母组合 - 力扣(LeetCode) 二、代码 class Solution {const char*data[10]{"","","abc","def","ghi","jkl","mno","pq…

鸿蒙边缘计算网关正式开售

IDO-IPC3528鸿蒙边缘计算网关基于RK3568研发设计,采用22nm先进工艺制程,四核A55 CPU,主频高达2.0GHz,支持高达8GB高速LPDDR4,1T算力NPU,4K H.265/H264硬解码;视频输出接口HDMI2.0,双…