Gitea 与 Drone 实践

之前搭建过 Gitlab,但是就只是搭建而已,并未实际使用,因为我大部分的代码还是存放在 Github 上。

并且大部分项目都是在 Vercel 上运行的(Vercel 是真好用),但是最近国内访问 vercel 情况不容乐观,貌似被墙了呜呜。然后 Gitlab 的资源占用非常严重,几乎占用了一半的服务器性能,可 点我 查看运行状态。与此同时,随着很多私有项目越来越多,使用 git 私有仓库以及 Vercel 部署,肯定不如自建私有 git 服务和自有服务器部署使用体验来好。

于是就想搭建一个轻量级仓库,同时支持 CI/CD。经过一番的调研,决定使用 Gitea 和 Drone 作为解决方案。

Gitea

Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证.

你可以在 横向对比 Gitea 与其它 Git 托管工具 查看 gitea 与其他 git 工具的优势与缺陷。

安装

这里我选用 Docker 进行安装,安装文档可在官方文档中查看其他安装方式

version: '3'

networks:
  gitea:
    external: false

volumes:
  gitea:
    driver: local

services:
  server:
    image: gitea/gitea:1.17.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - '10800:3000'
      - '2221:22'

根据自身需求配置 docker-compose.yml 内容。运行 docker-compose up 等待部署

服务器防火墙与云服务安全组都需要开放端口才可访问,服务器ip:10800,将会出现如下界面

因为修改配置相对比较麻烦,所以在首次安装的时候,请根据实际需求进行配置安装。

修改配置

假设要修改其中的配置的话,gitea 的后台管理面板是无法直接修改的。需要到 /data/gitea/conf/app.ini 中修改,具体修改的配置 参阅 自定义 Gitea 配置 - Docs

:::caution 注意
必须完全重启 Gitea 以使配置生效。
:::

迁移仓库

从其他第三方 git 仓库迁移到 gitea,可以访问https://git.kuizuo.cn/repo/migrate 来迁移仓库

稍等片刻,取决于访问 github 仓库的速度。有可能还会迁移失败,就像下面这样。

所以可以申请访问令牌(Access Token),在 New Personal Access Token 处创建。迁移成功后,如下图所示

镜像仓库

很大部分时间,gitea 只能作为我的副仓库,或者说 github 的镜像仓库。

gitea 也提供镜像仓库的方案,官方文档Repository Mirror

Drone

由于 Gitea 并没有内置 CI/CD(持续集成/持续部署) 的解决方案,所以需要配置第三方的,这里推荐使用 Drone CI。

安装

由于我们使用了 gitea,所以 drone 中选择 gitea 来安装,这是官方文档 Gitea | Drone,照着操作即可。

需要安装 Server 和 Runner,一个是 Drone 的服务,另一个用于检测 GIt 记录,以重新构建项目。

这里贴下 drone 的 docker 配置(根据文档和自己部署的 git 服务配置来替换)。

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITEA_SERVER=https://try.gitea.io \
  --env=DRONE_GITEA_CLIENT_ID=05136e57d80189bef462 \
  --env=DRONE_GITEA_CLIENT_SECRET=7c229228a77d2cbddaa61ddc78d45e \
  --env=DRONE_RPC_SECRET=super-duper-secret \
  --env=DRONE_SERVER_HOST=drone.company.com \
  --env=DRONE_SERVER_PROTO=https \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2
docker run --detach \
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=https \
  --env=DRONE_RPC_HOST=drone.company.com \
  --env=DRONE_RPC_SECRET=super-duper-secret \
  --env=DRONE_RUNNER_CAPACITY=2 \
  --env=DRONE_RUNNER_NAME=my-first-runner \
  --publish=3000:3000 \
  --restart=always \
  --name=runner \
  drone/drone-runner-docker:1

执行完毕后,然后访问线上的 drone 服务,点击 CONTINUE 将会跳转到你的 Git 授权页面

点击应用授权,再次回到 drone,此时页面 Dashboard 列出了 gitea 的所有仓库(如果没有的话,可以点击右上角的 SYNC 来同步)。

实战

上述只是安装了,我们还需要编写 .drone.yml 配置文件来告诉 drone 我们要做什么,编写过程与 Github Action类似。相关文档: Pipeline | Drone

部署前端项目

这里就选用 antfu/vitesse 作为演示。这里省略 clone 仓库的步骤。进入到自己的 gitea 仓库,然后添加 .drone.yml 文件,内容如下:

kind: pipeline
type: docker
name: ci

steps:
  - name: install & build
    image: node
    commands:
      - npm config set registry http://mirrors.cloud.tencent.com/npm/
      - npm i -g pnpm
      - pnpm i
      - pnpm run build

  - name: upload
    image: appleboy/drone-scp
    settings:
      host:
        from_secret: host
      username:
        from_secret: username
      password:
        from_secret: password
      port: 22
      command_timeout: 2m
      target: /www/wwwroot/${DRONE_REPO_OWNER}/${DRONE_REPO_NAME}
      source:
        - ./dist

这里对 .drone.yml 配置进行详解:

其中 build 这个不用多说,与 node 构建相关的,不过多介绍。

upload 则使用appleboy/drone-scp插件,可以将构建出来的文件通过发送到服务器指定位置。在这里 source 对应就是构建的文件,target 则是要移动的位置,这里的 /www/wwwroot/${DRONE_REPO_OWNER}/${DRONE_REPO_NAME} 对应本项目为 /www/wwwroot/kuizuo/vitesse。此外 ssh 的 host,username,password 或 key,都作为环境变量(私有变量的方式传递,这在 drone 的控制台中可以设置)。

由于每次构建可能需要删除原有的已部署的资源文件,那么可以使用 appleboy/drone-ssh 插件来执行终端命令来删除,例如

kind: pipeline
name: default

steps:
  - name: deploy
    image: appleboy/drone-ssh
    environment:
        DEPLOY_PATH:
            from_secret: /www/wwwroot/${DRONE_REPO_OWNER}/${DRONE_REPO_NAME}
    settings:
        host:
            from_secret: host
        username:
            from_secret: username
        password:
            from_secret: password
        port: 22
        command_timeout: 2m
        envs: [DEPLOY_PATH]
        script:
            - rm -rf $${DEPLOY_PATH}

具体就因人而异了,这里我仅作为演示。

大致介绍完毕(其实已经介绍差不多了),有关更多插件可以参阅 drone 插件。这里开始演示,进入 drone 页面,找到仓库,默认情况下,所有仓库都处于未激活状态。

点击 ACTIVATE REPOSITORY 根据选项选择,点击右上角的NEW BUILD选择分支,添加 drone 环境变量(私有变量),即上面的 from_secret 后面的内容(host,username,password),即可开始运行。

静等 PIPELINE 执行完毕,结果如下

image-20220928152635955

此时打开宝塔,跳转到指定目录下,就可以看到构建的内容都已经放到指定位置了

image-20220928152725853

这时候只需要配置下 nginx,就能将页面展示到公网上,这里就不在这里赘述。当完成上述配置完毕后,每次只需要 pull request,drone 就会自动拉取 gitea 的代码,并开始执行.drone.yml中的任务。

部署 nest 项目

TODO。。。

参考文章

【CI/CD】搭建 drone 服务,构建前端 cicd 工作流,实现博客的自动化打包并部署 - 掘金 (juejin.cn)

单机部署 CI/CD 进阶版:宝塔+gitea+drone | Laravel China 社区 (learnku.com)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值