OCurrent/OCaml-CI 项目:基于 Docker 的持续集成部署指南
ocaml-ci A CI for OCaml projects 项目地址: https://gitcode.com/gh_mirrors/oc/ocaml-ci
前言
OCaml-CI 是一个专为 OCaml 项目设计的持续集成系统,基于 OCurrent 框架构建。本文将详细介绍如何通过 Docker 方式部署 OCaml-CI 系统,并将其与代码托管平台集成,实现对 Pull Request 的自动化监控和测试。
系统架构概述
OCaml-CI 系统主要由两个核心组件构成:
- 服务组件:负责实际的任务调度和执行
- Web 组件:提供用户界面和 API 接口
这两个组件都可通过 Docker 容器化部署,通过 Docker Swarm 进行管理。
部署准备
1. 构建 Docker 镜像
首先需要从源码构建两个 Docker 镜像:
git clone --recursive 项目仓库地址
cd ocaml-ci
docker build -t ocaml-ci-service .
docker build -f Dockerfile.web -t ocaml-ci-web .
构建过程会自动安装所有依赖项并编译 OCaml-CI 系统。
2. 创建应用集成
为了使 OCaml-CI 能够与代码托管平台交互,需要创建一个应用集成:
- 在平台设置中找到开发者设置部分
- 创建新应用
- 填写基本信息:
- 应用名称(需全局唯一)
- 主页URL:https://ci.example.org/
- 回调URL:https://ci.example.org:8100/login
- Webhook URL:https://ci.example.org:8100/webhooks/github
- Webhook 密钥:使用安全随机字符串生成
3. 权限配置
为应用配置以下权限:
- 检查:读写
- 提交状态:读写
- 内容:只读
- 元数据:只读
- Pull 请求:只读
订阅以下事件:
- 创建
- Pull 请求
- 推送
安全配置
1. Docker Swarm 初始化
docker swarm init --advertise-addr 127.0.0.1:2377 --listen-addr 127.0.0.1:2377
2. 创建 Docker 密钥
需要创建以下密钥:
- 应用私钥
- Webhook 密钥
- OCurrent 集群提交能力文件
建议使用安全方式生成密钥:
ruby -rsecurerandom -e 'print SecureRandom.hex(20)' > example-ci-webhook-secret
然后创建 Docker 密钥:
docker secret create example-ci-github-key 私钥文件.pem
docker secret create example-ci-webhook-secret example-ci-webhook-secret
docker secret create ocaml-ci-submission.cap cluster.cap
网络配置
使用 Caddy 作为反向代理,配置示例:
ci.example.org:8100 {
reverse_proxy ci:8080
}
ci.example.org {
reverse_proxy web:8090
}
此配置将:
- 8100 端口用于服务组件
- 默认端口用于 Web 界面
部署服务
修改示例 stack 文件,确保:
- 密钥名称与创建的一致
- 应用ID正确
然后部署:
docker stack deploy example --compose-file example-stack.yml
验证与测试
- 在代码托管平台安装应用
- 选择要监控的仓库
- 访问以下URL验证:
- https://ci.example.org (Web界面)
- https://ci.example.org:8100 (服务状态)
常见问题排查
- Webhook 未触发:检查应用高级设置中的 Webhook 交付状态
- 权限问题:确认应用具有足够的仓库权限
- 网络问题:验证 Caddy 配置和端口映射
最佳实践建议
- 为生产环境配置 HTTPS
- 定期轮换密钥
- 监控服务日志
- 根据负载调整服务规模
通过以上步骤,您就可以成功部署一个完整的 OCaml-CI 系统,为 OCaml 项目提供可靠的持续集成服务。系统会自动监控代码变更,运行测试,并提供清晰的反馈。
ocaml-ci A CI for OCaml projects 项目地址: https://gitcode.com/gh_mirrors/oc/ocaml-ci
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考