草庐IT

轻量级CI/CD自动构建平台Gitea+Drone保姆级实践教程

幸福指北 2025-05-11 原文

目录

1、关于Gitea

1.1 gitea特性

1.2 快速安装

1.2.1 环境依赖

1.2.2 安装gitea

1.2.3 启动

1.2.4 访问

1.2.5 创建一个测试仓库

2 关于Drone

2.1 CI/CD工具对比

2.2 快速安装

2.2.1 环境依赖

2.2.2 安装Dorne

2.3 启动drone

2.4 访问drone

2.5 使用pipeline

2.6 编写一个完整的pipeline

2.6.1 编写一个完整的pipeline文件,并部署spring boot应用到docker中

2.6.2 触发构建

2.7 其他

3 资源消耗对比

3.1 在使用gitea+drone构建时服务器的负载,看上起没任何压力

3.2 这是我安装gitlab后服务器的情况,云主机直接被打爆了

4 常见问题

4.1 linter: untrusted repositories cannot mount host volumes

4.2 gitea中私有仓库,无法clone


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

1.2 快速安装

1.2.1 环境依赖

安装依赖Docker, docker-compose

Linux中Docker安装参考下面任何一个即可:

阿里云:CentOS8 安装 Docker-阿里云开发者社区

腾讯云:云服务器 搭建 Docker-最佳实践-文档中心-腾讯云-腾讯云

docker-compose安装:Install Docker Compose | Docker Documentation

1.2.2 安装gitea

安装参考链接:使用 Docker 安装 - Docs

最简单的设置只是创建一个卷和一个网络,然后将gitea/gitea:latest 镜像作为服务启动。由于没有可用的数据库,默认使用 SQLite3 初始化数据库, 如果你想要换成其他数据库,可以参考前面的安装链接, 这里我使用简单的安装

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。

2、使用 docker-compose ps 将显示 Gitea 是否正确启动。

3、可以使用 docker-compose logs 查看日志。

4、要关闭设置,请执行 docker-compose down

1.2.4 访问

访问:http://server-ip:8090

1.2.4.1 初始化安装,标红的地方请注意修改, 管理员账户名admin是保留名,配置的时候可以换其他的,比如:root;

修改完后,点击“立即安装”,完成初始化。

1.2.4.2 完成安装后登录

1.2.4.3 控制面板中:认证源支持LDAP, 在企业内部很方便的接入

1.2.4. 4在控制面板中,可以看到gitea的系统资源占用是非常低,所以它是非常的轻量

1.2.5 创建一个测试仓库

1.2.5.1 先创建一个组织,这里组织我选择的是公开的

1.2.5.2 创建仓库, 这里我创建的是公开的

1.2.5.3 创建一个简单的Spring Boot项目,并提交

HelloController.java

@Slf4j
@RestController
@RequestMapping("/v1")
public class HelloController {
  @GetMapping("hello")
  public String SayHello() {
    log.info("SayHello: hello world!");
    return "hello world!";
  }
}

Dockerfile

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

#!/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

server.port=80

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

2.2.2.1 这里同样使用docker-compose.yml方式

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

2、 点击创建后如下:

客户端ID 与客户端秘钥需要妥善保存,并替换到上面docker-compose.yml对应的字段

- DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID

- DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥

3、生成令牌, 令牌妥善保管, 并替换上面docker-compose.yml对应的字段

- DRONE_GIT_USERNAME=部署账户的用户名

- DRONE_GIT_PASSWORD=部署账户的密码

4、生成Drone与runner通信密钥,并替换上面docker-compose.yml对应的字段

- DRONE_RPC_SECRET=自定义的Drone与runner通信密钥

$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6

2.3 启动drone

1、要基于 docker-compose 启动此设置,请执行 docker-compose up -d,以在后台启动 Gitea。

2、使用 docker-compose ps 将显示 Drone 是否正确启动。

3、可以使用 docker-compose logs 查看日志。

4、要关闭设置,请执行 docker-compose down

2.4 访问drone

1、访问:http://drone-server-domain

2、点击继续,然后跳转到gitea中授权登录, 点击应用授权

3、填写信息并登录

4、登录后可以看到我们gitea中的项目,点击红色的项目,到设置中激活它

5、激活后保存

2.5 使用pipeline

1、在gitea的项目中增加.drone.yml文件,内容如下

2、drone立马就收到提交事件,并及时构建

2.6 编写一个完整的pipeline

2.6.1 编写一个完整的pipeline文件,并部署spring boot应用到docker中

.drone.yml

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

#!/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、 触发构建

2、 由于使用的docker-maven没有配置国内镜像源,包下载时间有点长

3、访问部署的应用

4、修改java文件在,再构建一次

5、这次构建速度就会很快

6、再次访问

2.7 其他

1、可以增加构建状态icon到仓库的readme中

2、 如下

3、触发构建时的状态

4、构建状态图表,每个节点log日志都可以预览

3 资源消耗对比

服务器配置:标准型S4 - 4核 4G, 系统:Rocky Linux release 8.5 (Green Obsidian)

3.1 在使用gitea+drone构建时服务器的负载,看上起没任何压力

3.2 这是我安装gitlab后服务器的情况,云主机直接被打爆了

4 常见问题

4.1 linter: untrusted repositories cannot mount host volumes

解决方法如下:

4.2 gitea中私有仓库,无法clone

解决方案:

yml文件中需要开启:

- DRONE_GIT_ALWAYS_AUTH=true

- DRONE_GIT_USERNAME=部署账户的用户名

- DRONE_GIT_PASSWORD=部署账户的密码

到此教程结束了,谢谢阅读!

欢迎关注我的微信公众号,不定期更新,谢谢

有关轻量级CI/CD自动构建平台Gitea+Drone保姆级实践教程的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  4. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  5. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  6. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  7. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  8. ruby - 在 ruby​​ 中使用自动创建插入数组 - 2

    我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?

  9. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  10. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

随机推荐