手把手带你搭建CI/CD工作流

news/2025/1/11 22:53:28/文章来源:https://www.cnblogs.com/o-O-oO/p/18666332

一、什么是CI/CD?

持续集成(ContinousIntergration,CI)是在源代码变更后自动检测、拉取、构建和进行自动化测试的过程,属于开发人员的自动化流程。
解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。其基本思路是,自动化监测代码仓库的变化并拉取最新代码、编译构建和自动化测试。
CI的触发方式可分为以下三种:

轮询:按一定的时间间隔反复询问代码仓库是否发生了变更,若发生了变更则开启CI流程。

定时:定期从代码仓库拉去最新代码并进行构建与测试,不必关心是否有变更发生。

推送:当代码仓库发生变更时,通过推送的方式(如webhook)通知CI进行任务,这需要CI环境被代码仓库访问到。

持续部署(ContinousDelivery,CD)通常是指开发人员对应用的更改会自动进行错误测试,并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。持续部署指的是自动将开发人员的更改从存储库发布到生产环境,它以持续交付为基础,实现了管道后续阶段的自动化。 CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。

二、什么是Drone?

Drone 是一种基于容器技术的持续交付系统。Drone 使用简单的 YAML 配置文件(docker-compose 的超集)来定义和执行 Docker 容器中的 Pipelines。

Drone 与流行的源代码管理系统无缝集成,包括 GitHub、GitHub Enterprise、Bitbucket、Gitee、Gitlab等。

三、自动化流程

四、基础设施

gitee代码托管:https://gitee.com
drone持续交付系统: https://drone.io
服务器信息:ubuntu、docker、docker-compose

五、部署步骤

5.1 配置Gitee第三方授权

5.2 安装Drone

docker-compose文件配置如下:

version: '3'
services:drone-server:restart: always  ## 容器自动重启image: drone/drone:latestports:- "20000:80"  ## 映射到宿主机的端口volumes:- ./drone_data:/var/lib/drone:rwenvironment:- DRONE_GITEE_CLIENT_ID=xxx  ## gitee中生成的CLIENT ID- DRONE_GITEE_CLIENT_SECRET=xxxx  ## gitee中生成的SECRET- DRONE_SERVER_HOST=192.168.0.2:20000  ## 端口需要和映射至宿主机的一致- DRONE_SERVER_PROTO=http- DRONE_RPC_SECRET=c64bab058885900124d31250b6780307  ## openssl rand -hex 16 自动生成- DRONE_USER_CREATE=username:beiming-talk,admin:true  ## gitee中的用户名- TZ=Asia/Shanghai#- DRONE_LOGS_DEBUG=true  ## 日志调试开关#- DRONE_LOGS_TRACE=true  ## 日志调试开关- DRONE_LOGS_TEXT=true- DRONE_LOGS_PRETTY=true- DRONE_LOGS_COLOR=truedrone-runner-docker:restart: always  ## 容器自动重启image: drone/drone-runner-docker:latestports:- "20001:3000"  ## 映射到宿主机的端口,用于提供web页面,显示任务执行情况,可不映射volumes:- /var/run/docker.sock:/var/run/docker.sockenvironment:- DRONE_RPC_PROTO=http- DRONE_RPC_HOST=drone-server- DRONE_RPC_SECRET=c64bab058885900124d31250b6780307  ## 与server服务中保持一致- DRONE_RUNNER_NAME=docker-worker- DRONE_RUNNER_CAPACITY=2- TZ=Asia/Shanghai - DRONE_DEBUG=true#- DRONE_LOGS_DEBUG=true#- DRONE_LOGS_TRACE=true#- DRONE_UI_USERNAME=admin   ## runner的web页面用户信息#- DRONE_UI_PASSWORD=password depends_on:- drone-server

5.3 SpringBoot工程配置

根目录下加入:.drone.yml配置文件:

kind: pipeline
type: docker # 定义管道类型
name: 北冥 - 后端服务
# 声明宿主机 映射到 drone执行器的数据卷
volumes:- name: maven_cache # 数据卷名称host:path: /home/drone/cache/maven # 宿主机的绝对路径- name: run_scripthost:path: /opt/beiming-talk/backend
steps:- name: 编译文件image: maven:3.8.3-openjdk-17pull: if-not-exists # always nevervolumes: # 当前步骤使用(挂载)的卷轴- name: maven_cache # 数据卷名称path: /root/.m2 # 容器内的绝对路径- name: run_scriptpath: /app/buildcommands:- mvn clean package- cp target/beiming-talk-backend-0.0.1-SNAPSHOT.jar /app/build/beiming-talk-backend-0.0.1-SNAPSHOT.jar- cp Dockerfile /app/build/Dockerfile- cp run.sh /app/build/run.sh- name: 部署image: appleboy/drone-ssh # SSH工具镜像settings:host: 172.17.0.1 # 远程连接地址username: root # 远程连接账号password: xxxxxport: 22 # 远程连接端口command_timeout: 5m # 远程执行命令超时时间script:- cd /opt/beiming-talk/backend # 进入宿主机构建目录- chmod -R 777 run.sh # 更改为可执行脚本- ./run.sh # 运行脚本打包应用镜像并运行- name: 构建通知image: plugins/webhooksettings:urls: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxcontent_type: application/jsontemplate: |{"msgtype": "markdown","markdown": {"content": "{{#success build.status}}✅{{else}}❌{{/success}}**{{ repo.owner }}/{{ repo.name }}** (Build #{{build.number}})\n>**构建结果**: {{ build.status }}>**构建详情**: [点击查看]({{ build.link }})>**代码分支**: {{ build.branch }}>**提交标识**: {{ build.commit }}>**提交发起**: {{ build.author }}>**提交信息**: {{ build.message }}"}}

增加run.sh脚本文件

#!/usr/bin/env bash
# 定义应用组名
group_name='turing'
# 定义应用名称
app_name='beiming-talk'
# 定义应用版本
app_version='latest'
# 定义应用环境
profile_active='prod'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

增加 Dockerfile 文件

FROM openjdk:17-oracle
ADD beiming-talk-backend-0.0.1-SNAPSHOT.jar beiming-talk-backend-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "beiming-talk-backend-0.0.1-SNAPSHOT.jar"]

效果演示



原创 fajian.chen 技术与业务融合思维

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

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

相关文章

非法闯入智能监测摄像机

非法闯入智能监测摄像机具备多项显著优势。首先,它能够智能分析画面中的人物和物体,通过对比数据库识别可疑目标,自动过滤正常活动,减少误报。其次,这些摄像机通常具备夜视功能和高清画质,确保在各种光线条件下都能清晰记录可疑行为。此外,很多智能摄像机支持远程监控,…

Java基础学习(六)

Java基础学习(六):面向对象 目录Java基础学习(六):面向对象概念类的结构对象的创建与初始化内存分析封装继承多态Instanceof 和 类型转换Static 关键字抽象类接口内部类 本文为个人学习记录,内容学习自 狂神说Java概念面向过程 vs 面向对象面向过程步骤清晰简单,第一步…

自如电费欺诈,屡教不改 All In One

自如电费欺诈,屡教不改 All In One 自如电费欺诈 常见手段汇总 💩 电表示数,自如抄表时候故意多抄、错抄! 导致使用电量和电费暴增,与国家电网 app 查询的实际使用量完全不一致!不严格按照国家和地方的居民电费分档计费标准的价格收费,随意向上跨档高价收费、多收费! …

插件广场

Obsidian 插件集市 (pkmer.cn)

ZooKeeper集群kafka集群安装

kafka的管理需要借助zookeeper完成,所以要先安装好zookeeper集群。 一、zookeeper集群安装 1.1 集群规划 在主机node1、node2和 node3 三个节点上都部署 Zookeeper。 1.2 解压安装 官网下载地址:https://zookeeper.apache.org/这里我安装的版本为3.5.7。在 node1服务器解压 Z…

Lec 12 进程间通信

Lec 12 进程间通信License 本内容版权归上海交通大学并行与分布式系统研究所所有 使用者可以将全部或部分本内容免费用于非商业用途 使用者在使用全部或部分本内容时请注明来源 资料来自上海交通大学并行与分布式系统研究所+材料名字 对于不遵守此声明或者其他违法使用本内容者…

老毛子PADAVAN为何不能挂载大容量移动硬盘/U盘?解决办法竟然如此简单

问题: 我用的是极路由B70,刷了PADAVAN,B70自身带有一个USB2.0,一个USB3.0,插入一个2TB的移动硬盘,NTFS格式,可以识别到,但没有挂载成功。 查看日志, 确实提示挂载失败,然后看到挂载的名字带有一些@@@@@。 解决办法: 联想自己移动硬盘的名字是中文。于是拔下移动硬盘,…

转:python的zmq模块

转自:https://www.jianshu.com/p/04660f746a16https://blog.csdn.net/SweetHeartHuaZai/article/details/1269348191、zmq介绍: 创建和销毁套接字:zmq.socket(), zmq.close() 配置和读取套接字:zmq.setsockopt(), zmq.getsockopt() 为套接字建立连接:zmq.bind(), zmq.conn…

深度强化学习实战:训练DQN模型玩超级马里奥兄弟

深度学习作为当前计算机科学领域最具前沿性的研究方向之一,其应用范围涵盖了从计算机视觉到自然语言处理等多个领域。本文将探讨深度学习在游戏领域的一个具体应用:构建一个能够自主学习并完成超级马里奥兄弟的游戏的智能系统。强化学习基础 强化学习是机器学习的一个重要分支…

导出和导入word样式模板

对于自己配置过之后常用的word样式可以导出作为样式模板, 可以重复使用.举例说一下哪些是常用的word样式, 例如: (常见的): 中文的内容的样式, 中英文分别设置不同的样式 (比较高级的)多级标题自动编号, 题注跟随标题的编号word功能 word自带导出导入模板样式的功能. word样式模…

远程连接和FTP传输问题

遇到的远程连接和FTP传输问题,我们进行了详细调查。以下是我们的分析和建议:远程桌面连接问题:端口检查:默认情况下,Windows系统的远程桌面服务使用的是3389端口。请确保该端口未被防火墙或其他安全软件阻塞。可以通过命令行工具netstat -an | findstr 3389来检查端口状态…