微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD

这篇具有很好参考价值的文章主要介绍了微服务 & 云原生:基于 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-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 .

结果如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
如果需要推送镜像,比如推送到私有 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

结果如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
此时通过相应 ip:port 即可访问页面,示例页面如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone

使用 Gogs & Drone 持续集成

微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,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

结果如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
通过 10880 端口访问:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
数据库根据需求来选,这里选择最轻量级的 SQLite3 作为演示,其他配置项可以默认,由于编写 docker-compose.yml 时做了端口映射,主要修改域名、端口号,如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
编写完可选配置后点击立即安装,我这里就简单设置管理员信息:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
gogs 的使用与 git 基本一致,简单创建一个仓库并提交信息:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone

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

结果:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
浏览器访问 ip:port:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
登录用户名密码为上一步注册 gogs 时所用的,登录成功进入主页:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
这里会显示 gogs 中创建的代码仓库列表。

流水线配置

激活钩子

进入 drone 相应仓库页面,点击 ACTIVATE REPOSITORY 按钮,激活钩子:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone

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

Drone untrusted repositories cannot mount host volumes

微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
进入到 gogs 中相应仓库,点击仓库设置:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
可以看到管理的 Web 钩子:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone

编写 .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 + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
编写好文件后,可进行代码提交。不过还需要查看 gogs 的配置文件中有没有将 ip 加入到白名单中,如果有多个 ip 则用 , 分隔。我这里 ip 为 192.168.65.134。具体配置如下:

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

微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone

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

微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
3. 重启 gogs

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

如果没有配置,还继续提交代码的话,会出现下面情况:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
可以看到,虽然提交成功,但点击仓库设置,进入管理 Web 钩子项,点击存在的钩子,如 http://192.168.65.134:9080/hook,可以看到:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
钩子并没有生效,并报错:

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

提交代码,触发 Hooks

成功提交代码,并触发钩子后,gogs 页面中显示成功信息:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
drone 页面信息如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
点击进入,可以在 GRAPH VIEW 查看详细进度及日志:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
可以看到目前处于 build 阶段。完全构建完成后,页面如下:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone
harbor 页面中对应的镜像版本也推送成功:
微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD,云原生与微服务,云原生,ci/cd,gogs,drone文章来源地址https://www.toymoban.com/news/detail-632035.html

到了这里,关于微服务 & 云原生:基于 Gogs + Drone 进行项目 CI/CD的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SNAT+DNAT发布内网K8S及Jenkins+gitlab+Harbor模拟CI/CD的综合项目

    目录 项目名称 项目架构图 项目环境 项目概述 项目准备 项目步骤 一、修改每台主机的ip地址,同时设置永久关闭防火墙和selinux,修改好主机名,在firewalld服务器上开启路由功能并配置snat策略。 1. 在firewalld服务器上配置ip地址、设置永久关闭防火墙和selinux,并修改好主机名

    2024年02月09日
    浏览(58)
  • 使用Kubernetes进行CI/CD的最佳实践

    CI/CD是指持续集成 (Continuous Integration) 和持续交付/部署 (Continuous Delivery/Deployment) 的缩写,是一种软件开发方法论。通过自动化的构建、测试、部署等过程CI/CD能够帮助开发者快速地将代码交付到生产环境中。 Kubernetes是一种容器编排工具,它非常适合用来部署和运行分布式应用

    2024年02月08日
    浏览(46)
  • 【基于 GitLab 的 CI/CD 实践】01、GitLab CI/CD 基础概念

    目录 一、为什么要做 CI/CD ? 1.1 背景-传统的应用开发发布模式 问题 1.2 持续集成与持续交付 持续集成(CI) 持续交付(CD) 持续部署(CD) 1.3 CI/CD 的价值体现 1.4 推荐常用的 CI/CD 工具 Jenkins GitLab 二、GitLab CI/CD 功能简介 2.1 GitLab 内置持续集成功能 持续集成(CI) 连续交付(

    2024年02月16日
    浏览(69)
  • 持续交付的力量: 使用Docker Swarm进行CI/CD

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 1.1 Docker Swarm 简介 Docker Swarm 是 Docker 官方的集群管理和编排工具,用于管理多个 Docker 节点和容器,并分发容器到这些节点上运行。Docker Swarm 具有可扩展性、故障转移和负

    2023年04月26日
    浏览(62)
  • Gitlab CI/CD入门(一)Python项目的CI演示

      本文将介绍CI/CD的基本概念,以及如何使用Gitlab来实现CI/CD。   本文介绍的CI/CD项目为个人Gitlab项目:gitlab_ci_test,访问网址为:https://gitlab.com/jclian91/gitlab_ci_test。 CI/CD的含义   在现代软件工程中,CI即 持续集成(Continuous integration) ,CD有两重含义,即 持续交付(Co

    2024年02月10日
    浏览(79)
  • GitLab Runner 实现项目 CI/CD 发布

    Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行作业,因此需要搭配Gitlab Runner来作为执行器实现具体的CICD工作。Gitlab Runner可以被安装在任

    2024年01月17日
    浏览(64)
  • 使用gitlab 自带 CI/CD 构建部署项目

    这里我用的是桥接模式 桥接模式方便局域网内的小伙伴一起使用 如果没有这个打算可跳过这步 编辑网络 vi /etc/sysconfig/network-scripts/ifcfg-你的网络名称 修改如下内容 这里我有句话要讲, 这些信息配置完成后出现\\\"网络不可达\\\" 需要把 BOOTPROTO 改为 dhcp 详情可参考 处理网络不可达

    2024年02月12日
    浏览(64)
  • jenkins容器内CI/CD 项目失败问题

    1.1 原因:jenkins容器内: docker.sock 权限 1.2 问题解决方案 文件权限如下: srw-rw---- 1 root 994 0 Jun 30 06:51 docker.sock 进行权限修改 最终权限修改成功为:srw-rw-rw- 1 root root 0 Jun 30 06:51 docker.sock 2.1 问题原因 项目为前端vue,依赖于nodejs 和 npm, 需要为容器安装npm, nodejs 2.2 问题解决方

    2024年02月13日
    浏览(49)
  • Gitlab CI/CD笔记-第二天-主机套接字进行构建并push镜像。

    一、安装gitlab-runner         1.安装查看我另外一篇文章很详细。                 Gitlab CI/CD笔记-第三天-使用主机docker in docker 进行构建并push镜像。_A ?Charis的博客-CSDN博客         2. 这篇文章的目的是使docker来构建镜像!         3.让docker使用你的主机的docker.sock构建

    2024年02月12日
    浏览(40)
  • 基于Jenkins实现的CI/CD方案

    最近基于Jenkins的基座,搭建了一套适用于我们项目小组的持续集成环境。现在把流程整理分享出来,希望可以给大家提供一些帮助和思路。 组件名称 组件版本 作用 Harbor 2.7.3 镜像仓库 Jenkins 2.319.2 持续集成工具 Pipeline 2.6 Jenkins插件,编排流水线脚本 SSH Pipeline Steps 2.0.0 Jenki

    2024年02月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包