轻量级CI/CD自动构建平台Gitea+Drone保姆级实践教程
文章摘要
本文介绍了如何利用轻量级代码托管工具Gitea和持续集成平台Drone搭建高效的CI/CD系统,涵盖安装配置、Spring Boot项目示例、资源消耗对比及常见问题解决,突出其易用性和低资源占用优势。
**目录** [1、关于Gitea](about:blank#1%E3%80%81%E5%85%B3%E4%BA%8EGitea) [1.1 gitea特性](about:blank#1.1%20gitea%E7%89%B9%E6%80%A7) [1.2 快速安装](about:blank#1.2%20%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%85) [1.2.1 环境依赖](about:blank#1.2.1%20%E7%8E%AF%E5%A2%83%E4%BE%9D%E8%B5%96) [1.2.2 安装gitea](about:blank#1.2.2%20%E5%AE%89%E8%A3%85gitea) [1.2.3 启动](about:blank#1.2.3%20%E5%90%AF%E5%8A%A8) [1.2.4 访问](about:blank#1.2.4%20%E8%AE%BF%E9%97%AE) [1.2.5 创建一个测试仓库](about:blank#1.2.5%20%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E4%BB%93%E5%BA%93) [2 关于Drone](about:blank#2%20%E5%85%B3%E4%BA%8EDrone) [2.1 CI/CD工具对比](about:blank#2.1%20CI%2FCD%E5%B7%A5%E5%85%B7%E5%AF%B9%E6%AF%94) [2.2 快速安装](about:blank#2.2%20%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%85) [2.2.1 环境依赖](about:blank#2.2.1%20%E7%8E%AF%E5%A2%83%E4%BE%9D%E8%B5%96) [2.2.2 安装Dorne](about:blank#2.2.2%20%E5%AE%89%E8%A3%85Dorne) [2.3 启动drone](about:blank#2.3%20%E5%90%AF%E5%8A%A8drone) [2.4 访问drone](about:blank#2.4%20%E8%AE%BF%E9%97%AEdrone) [2.5 使用pipeline](about:blank#2.5%20%E4%BD%BF%E7%94%A8pipeline) [2.6 编写一个完整的pipeline](about:blank#2.6%20%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E7%9A%84pipeline) [2.6.1 编写一个完整的pipeline文件,并部署spring boot应用到docker中](about:blank#2.6.1%20%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E7%9A%84pipeline%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E9%83%A8%E7%BD%B2spring%20boot%E5%BA%94%E7%94%A8%E5%88%B0docker%E4%B8%AD) [2.6.2 触发构建](about:blank#2.6.2%20%E8%A7%A6%E5%8F%91%E6%9E%84%E5%BB%BA) [2.7 其他](about:blank#2.7%20%E5%85%B6%E4%BB%96) [3 资源消耗对比](about:blank#3%20%E8%B5%84%E6%BA%90%E6%B6%88%E8%80%97%E5%AF%B9%E6%AF%94) [3.1 在使用gitea+drone构建时服务器的负载,看上起没任何压力](about:blank#3.1%20%E5%9C%A8%E4%BD%BF%E7%94%A8gitea%2Bdrone%E6%9E%84%E5%BB%BA%E6%97%B6%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%EF%BC%8C%E7%9C%8B%E4%B8%8A%E8%B5%B7%E6%B2%A1%E4%BB%BB%E4%BD%95%E5%8E%8B%E5%8A%9B) [3.2 这是我安装gitlab后服务器的情况,云主机直接被打爆了](about:blank#3.2%20%E8%BF%99%E6%98%AF%E6%88%91%E5%AE%89%E8%A3%85gitlab%E5%90%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%83%85%E5%86%B5%EF%BC%8C%E4%BA%91%E4%B8%BB%E6%9C%BA%E7%9B%B4%E6%8E%A5%E8%A2%AB%E6%89%93%E7%88%86%E4%BA%86) [4 常见问题](about:blank#4%20%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) [4.1 linter: untrusted repositories cannot mount host volumes](about:blank#4.1%20linter%3A%20untrusted%20repositories%20cannot%20mount%20host%20volumes) [4.2 gitea中私有仓库,无法clone](about:blank#4.2%20gitea%E4%B8%AD%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93%EF%BC%8C%E6%97%A0%E6%B3%95clone) * * * 1、关于Gitea ========= Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。易于安装,它可以运行在任何 Go 能够编译的平台:Windows, macOS, Linux, ARM 等等,另外Gitea 拥有很低的系统需求,最低的系统硬件要求为一个廉价的树莓派。 1.1 gitea特性 ----------- * 支持活动时间线 * 支持 SSH 以及 HTTP/HTTPS 协议 * 支持 SMTP、LDAP 和反向代理的用户认证 * 支持反向代理子路径 * 支持用户、组织和仓库管理系统 * 支持添加和删除仓库协作者 * 支持仓库和组织级别 Web 钩子(包括 Slack 集成) * 支持仓库 Git 钩子和部署密钥 * 支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki * 支持迁移和镜像仓库以及它的 Wiki * 支持在线编辑仓库文件和 Wiki * 支持自定义源的 Gravatar 和 Federated Avatar * 支持邮件服务 * 支持后台管理面板 * 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 TiDB(MySQL) 数据库 * 支持多语言本地化(21 种语言) 这里有一个与其它Git托管工具的横向对比: [横向对比 Gitea 与其它 Git 托管工具 - Docs](https://docs.gitea.io/zh-cn/comparison/ "横向对比 Gitea 与其它 Git 托管工具 - Docs") 1.2 快速安装 -------- ### 1.2.1 环境依赖 安装依赖Docker, docker-compose Linux中Docker安装参考下面任何一个即可: 阿里云:[CentOS8 安装 Docker-阿里云开发者社区](https://developer.aliyun.com/article/753261 "CentOS8 安装 Docker-阿里云开发者社区") 腾讯云:[云服务器 搭建 Docker-最佳实践-文档中心-腾讯云-腾讯云](https://cloud.tencent.com/document/product/213/46000 "云服务器 搭建 Docker-最佳实践-文档中心-腾讯云-腾讯云") docker-compose安装:[Install Docker Compose | Docker Documentation](https://docs.docker.com/compose/install/ "Install Docker Compose | Docker Documentation") ### 1.2.2 安装gitea 安装参考链接:[使用 Docker 安装 - Docs](https://docs.gitea.io/zh-cn/install-with-docker/ "使用 Docker 安装 - Docs") 最简单的设置只是创建一个卷和一个网络,然后将gitea/gitea:latest 镜像作为服务启动。由于没有可用的数据库,默认使用 SQLite3 初始化数据库, 如果你想要换成其他数据库,可以参考前面的安装链接, 这里我使用简单的安装 ```java version: "3" networks: gitea: external: false services: server: image: gitea/gitea:1.16.7 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 restart: always networks: - gitea volumes: - /home/data:/data # /home/data可以替换成你想要的挂载目录 - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "8090:3000" # 8090可以替换成你想要的端口 - "8222:22" # 8222可以替换成22 ``` ### 1.2.3 启动 1、要基于 docker-compose 启动此设置,请执行 docker-compose up -d,以在后台启动 Gitea。 ![](https://oss.120120.top/blog/2024/01/08/070c2fff00f047bb80fcd34c963c0a74.png) 2、使用 docker-compose ps 将显示 Gitea 是否正确启动。 3、可以使用 docker-compose logs 查看日志。 4、要关闭设置,请执行 docker-compose down ### 1.2.4 访问 访问:[http://server-ip:8090](http://server-ip:3000/ "http://server-ip:8090") 1.2.4.1 初始化安装,标红的地方请注意修改, 管理员账户名admin是保留名,配置的时候可以换其他的,比如:root; 修改完后,点击“立即安装”,完成初始化。 ![](https://oss.120120.top/blog/2024/01/08/51aa556ba73e42818bfbcf8d155b6912.png) 1.2.4.2 完成安装后登录 ![](https://oss.120120.top/blog/2024/01/08/f8cc783be5a44e44a6097be7d48650b4.png) 1.2.4.3 控制面板中:认证源支持LDAP, 在企业内部很方便的接入 ![](https://oss.120120.top/blog/2024/01/08/bb067001f3594f35a5814e59d860d10d.png) 1.2.4. 4在控制面板中,可以看到gitea的系统资源占用是非常低,所以它是非常的轻量 ![](https://oss.120120.top/blog/2024/01/08/56ead776b8364fe4acbbff937152f330.png) ### 1.2.5 创建一个测试仓库 1.2.5.1 先创建一个组织,这里组织我选择的是公开的 ![](https://oss.120120.top/blog/2024/01/08/cfa986da43f8491ba397d93d3f21867d.png) 1.2.5.2 创建仓库, 这里我创建的是公开的 ![](https://oss.120120.top/blog/2024/01/08/d4ce64ad41974651b5ad2c696c7ad1d1.png) ![](https://oss.120120.top/blog/2024/01/08/870498d105f5408cb0cbe54061bf8678.png) 1.2.5.3 创建一个简单的Spring Boot项目,并提交 ![](https://oss.120120.top/blog/2024/01/08/b85a76ff9b4a40778eaa316535343124.png) HelloController.java ```java @Slf4j @RestController @RequestMapping("/v1") public class HelloController { @GetMapping("hello") public String SayHello() { log.info("SayHello: hello world!"); return "hello world!"; } } ``` Dockerfile ```java FROM openjdk:8-alpine3.9 ENV SERVICE_PORTS=80 RUN mkdir -p /app/ WORKDIR /app COPY ./entrypoint.sh /app/ RUN chmod 755 -R /app/ COPY ./mypubdemo*.jar /app/ ENTRYPOINT ["/app/entrypoint.sh"] ``` entrypoint.sh ```java #!/bin/sh java -Xms128m -Xmx128m -jar /app/mypubdemo*.jar --spring.profiles.active=dev if [ $? != 0 ]; then echo Failed to start java >&2 exit 1 fi ``` application-dev.properties ```java server.port=80 ``` ![](https://oss.120120.top/blog/2024/01/08/9f0c5e29d35c453f8d3535916f79df70.png) 2 关于Drone ========= Dron是一个现代化的持续集成平台,它使用强大的云原生pipeline引擎自动化构建、测试和发布工作流。Drone 与多个源代码管理系统无缝集成,包括 GitHub、GitHubEnterprise、Bitbucket、GitLab和Gitea;它的每个构建都在一个隔离的 Docker 容器中运行;另外它也支持插件,可以使用你熟知的语言轻松的扩展它们。 2.1 CI/CD工具对比 -------------

工具

优点

不足

GitLab

开发语言:Ruby On Rails

开源,不需要复杂的安装手段;

配置简单,与Gitlab可直接适配;

.gitlab-ci.yml,分阶段并行执行任务;

实时构建日志清晰,UI交互体验很好;

只支持Gitlab,yaml不能扩展;

需要为每个任务定义组件;

不支持一个大阶段中包含几个小阶段;

使用ruby开发,性能低,占用资源较多

Jenkins

开发语言Java;

web管理界面,社区庞大,

插件丰富,文档丰富,

历史悠久;分布式任务;

应用广泛,功能强大;

编写jenkins file

基于JVM运行环境;

插件以及自身安装较为复杂;

启动慢,运行慢,耗资源;

需要专人维护管理,新人学习成本较高;

只能用Java写插件;

Drone

开发语言Go;

轻量级,启动快,运行快,资源占用少;

云原生支持Docker;

新兴的CI/CD开源工具;分布式任务;

更加适合云原生应用,与k8s结合紧密;也可以单独部署;

插件可以使用多种语言编写;

可在本机运行测试;

编写流程yml,Pipline 比 Jenkins 语法简单,可以通过Hook动态获取

插件不多,资源没有Jenkins多,但也基本够用了。

2.2 快速安装 -------- ### 2.2.1 环境依赖 安装依赖Docker, docker-compose, 它们安装方式参考上面 ### 2.2.2 安装Dorne 安装参考: [Gitea | Drone](https://docs.drone.io/server/provider/gitea/ "Gitea | Drone") 2.2.2.1 这里同样使用docker-compose.yml方式 ```java version: '3' services: drone-server: restart: always image: drone/drone:2 ports: - "映射宿主机端口:80" volumes: - 宿主机挂载目录:/var/lib/drone/ - 宿主机挂载目录:/data/ environment: - DRONE_GITEA_SERVER=http://gitea服务器地址 # 支持http, https - DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID - DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥 - DRONE_SERVER_HOST=drone服务器地址 - DRONE_SERVER_PROTO=http # 支持http, https - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥 - DRONE_GIT_ALWAYS_AUTH=true - DRONE_GIT_USERNAME=部署账户的用户名 - DRONE_GIT_PASSWORD=部署账户的密码 - DRONE_USER_CREATE=username:你的管理员账户名,admin:true # 开启管理员账户 drone-runner-docker: restart: always image: drone/drone-runner-docker:1 ports: - "3000:3000" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RPC_PROTO=http # 支持http, https - DRONE_RPC_HOST=drone-server - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥 - DRONE_RUNNER_NAME=drone-runner-docker - DRONE_RUNNER_CAPACITY=2 ``` 2.2.2.2 在Gitea个人中心的应用设置创建Gitea OAuth application 1、重定向URI格式:http://你的dorne域名/login ![](https://oss.120120.top/blog/2024/01/08/d59d507530f24c4299f9b87820e4f96a.png) 2、 点击创建后如下: 客户端ID 与客户端秘钥需要妥善保存,并替换到上面docker-compose.yml对应的字段 \- DRONE\_GITEA\_CLIENT\_ID=gitea生成的OAuth2客户端ID \- DRONE\_GITEA\_CLIENT\_SECRET=gitea生成的OAuth2客户端密钥 ![](https://oss.120120.top/blog/2024/01/08/a50741d8954940c89b640707a5724675.png) 3、生成令牌, 令牌妥善保管, 并替换上面docker-compose.yml对应的字段 \- DRONE\_GIT\_USERNAME=部署账户的用户名 \- DRONE\_GIT\_PASSWORD=部署账户的密码 ![](https://oss.120120.top/blog/2024/01/08/5e02cd2eb77e4f32a1dde81ab7b18fce.png) 4、生成Drone与runner通信密钥,并替换上面docker-compose.yml对应的字段 \- DRONE\_RPC\_SECRET=自定义的Drone与runner通信密钥 ```java $ openssl rand -hex 16 bea26a2221fd8090ea38720fc445eca6 ``` 2.3 启动drone ----------- 1、要基于 docker-compose 启动此设置,请执行 docker-compose up -d,以在后台启动 Gitea。 2、使用 docker-compose ps 将显示 Drone 是否正确启动。 ![](https://oss.120120.top/blog/2024/01/08/927ca04ebbb14b859b967c4c4a2b573b.png) 3、可以使用 docker-compose logs 查看日志。 4、要关闭设置,请执行 docker-compose down 2.4 访问drone ----------- 1、访问:[http://drone-server-domain](http://server-ip:3000/ "http://drone-server-domain") ![](https://oss.120120.top/blog/2024/01/08/74fc243e5c9041c5b41414dd5afe1e8b.png) 2、点击继续,然后跳转到gitea中授权登录, 点击应用授权 ![](https://oss.120120.top/blog/2024/01/08/157af3fae6084b61835bd95f9373294f.png) 3、填写信息并登录 ![](https://oss.120120.top/blog/2024/01/08/2f076e3cbe7a4b17a283e93286a9fdfd.png) 4、登录后可以看到我们gitea中的项目,点击红色的项目,到设置中激活它 ![](https://oss.120120.top/blog/2024/01/08/f75cc6ef04604ec4a79be4d637c1c42b.png) ![](https://oss.120120.top/blog/2024/01/08/9311343ec13c4f41b06ef2f28de94e33.png) 5、激活后保存 ![](https://oss.120120.top/blog/2024/01/08/8069e44a42774f34a9bfeffda6f1a46d.png) 2.5 使用pipeline -------------- 1、在gitea的项目中增加.drone.yml文件,内容如下 ![](https://oss.120120.top/blog/2024/01/08/9e62a94d7dd54fb198b5b720262bd363.png) 2、drone立马就收到提交事件,并及时构建 ![](https://oss.120120.top/blog/2024/01/08/aa13e829f5fd422a9042b0a84f738515.png) ![](https://oss.120120.top/blog/2024/01/08/b1b01b5a24684ae18627b3e0cad4a5b2.png) 2.6 编写一个完整的pipeline ------------------- ### 2.6.1 编写一个完整的pipeline文件,并部署spring boot应用到docker中 .drone.yml ```java kind: pipeline type: docker name: mypubdemo steps: - name: build-jar # 流水线名称 image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package -DskipTests=true # 应用打包命 - cp target/mypubdemo-0.0.1-SNAPSHOT.jar /app/build/mypubdemo-0.0.1.jar - cp entrypoint.sh /app/build/ - cp Dockerfile /app/build/ - cp run.sh /app/build/ - name: build-docker image: plugins/docker volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: docker path: /var/run/docker.sock # 挂载宿主机的docker settings: dockerfile: /app/build/Dockerfile commands: # 定义在Docker容器中执行的shell命令 - cd /app/build - chmod +x run.sh - sh run.sh - docker ps volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: path: /home/data/maven/build # 从宿主机中挂载的目录 - name: maven-cache host: path: /home/data/maven/cache - name: docker host: path: /var/run/docker.sock ``` run.sh ```java #!/bin/sh # 定义应用组名 group_name='demo' # 定义应用名称 app_name='mypubdemo' # 定义应用版本 app_version='latest' 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:80 --name ${app_name} \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -d ${group_name}/${app_name}:${app_version} echo '----start container----' ``` ### 2.6.2 触发构建 1、 触发构建 ![](https://oss.120120.top/blog/2024/01/08/cc29e69abfc84378b9fa07703391aa08.png) 2、 由于使用的docker-maven没有配置国内镜像源,包下载时间有点长 ![](https://oss.120120.top/blog/2024/01/08/694dcd42f1944879b84c5685e4ab4502.png) 3、访问部署的应用 ![](https://oss.120120.top/blog/2024/01/08/62da21fa01f0454486fa1afcc4ad75ed.png) 4、修改java文件在,再构建一次 ![](https://oss.120120.top/blog/2024/01/08/a8f2bd4224d34667a76d85584c29101c.png) 5、这次构建速度就会很快 ![](https://oss.120120.top/blog/2024/01/08/7c12e6bf83e349cb9f2120b01fae3f42.png) 6、再次访问 ![](https://oss.120120.top/blog/2024/01/08/8d808035d0ba42008b5a54118748129c.png) 2.7 其他 ------ 1、可以增加构建状态icon到仓库的readme中 ![](https://oss.120120.top/blog/2024/01/08/db986f6a453f4740895234ee97e2a85b.png) 2、 如下 ![](https://oss.120120.top/blog/2024/01/08/af2e154876ad480a87268f9f9c7dae3c.png) ![](https://oss.120120.top/blog/2024/01/08/495f8da5d0424c4992c87acf7a0617bd.png) 3、触发构建时的状态 ![](https://oss.120120.top/blog/2024/01/08/0fb948b0616048f7adb26659ab5c86d0.png) 4、构建状态图表,每个节点log日志都可以预览 ![](https://oss.120120.top/blog/2024/01/08/6300e1bdaada4d32abcf8ca67e0f5f2f.png) 3 资源消耗对比 ======== 服务器配置:标准型S4 - 4核 4G, 系统:Rocky Linux release 8.5 (Green Obsidian) 3.1 在使用gitea+drone构建时服务器的负载,看上起没任何压力 ------------------------------------ ![](https://oss.120120.top/blog/2024/01/08/2cad6ed0267748019d5e1d1fc4b30596.png) 3.2 这是我安装gitlab后服务器的情况,云主机直接被打爆了 -------------------------------- ![](https://oss.120120.top/blog/2024/01/08/347c67f57c42451e9906840eddc09bd7.png) ![](https://oss.120120.top/blog/2024/01/08/5bf9fae6f48248888b4b0eafa7bf23bf.png) 4 常见问题 ====== 4.1 linter: untrusted repositories cannot mount host volumes ------------------------------------------------------------ ![](https://oss.120120.top/blog/2024/01/08/21fd56d47d174ee3b77cfea593604343.png) **解决方法如下:** ![](https://oss.120120.top/blog/2024/01/08/a6cbdc06f81546e28ac539e2f0b64631.png) 4.2 gitea中私有仓库,无法clone ---------------------- ![](https://oss.120120.top/blog/2024/01/08/e70a90ef31fd4959883792f6e3b0e2a7.png) **解决方案:** yml文件中需要开启: \- DRONE\_GIT\_ALWAYS\_AUTH=true \- DRONE\_GIT\_USERNAME=部署账户的用户名 \- DRONE\_GIT\_PASSWORD=部署账户的密码 本文转自 [https://blog.csdn.net/ywch520/article/details/124782654](https://blog.csdn.net/ywch520/article/details/124782654),如有侵权,请联系删除。
作者头像
admin
分享技术与生活
打赏作者

评论

暂无评论,快来抢沙发吧~