# Building and testing Manticore Search

Learn to contribute to Manticore Search with our guide on using Docker for manual builds and GitHub for automated CI. Simplify your development process, whether you prefer hands-on control or streamlined automation. A must-read for developers looking to enhance their workflow with Manticore Search

为像 Manticore Search 这样的 C++ 项目做贡献可能是一项具有挑战性的任务，因为该语言的底层特性通常需要特定版本的组件以及对系统内部结构的深入理解。然而，Manticore 团队通过使用专门的 Docker 镜像，使这一过程变得更加容易。这些镜像经过精心准备，包含所有必要的依赖项和配置，使贡献者能够专注于自己的贡献，而无需担心底层设置。

通过两种强大的方法可以简化对 Manticore Search 的贡献：
* 利用 Docker 进行手动构建和测试
* 并使用 GitHub 进行自动化流程。

本指南介绍了这两种方法，以满足不同开发阶段贡献者的需求。

## 在您的分叉中使用 CI

开始为 Manticore Search 做贡献的一种便捷方式是通过 GitHub 分叉该项目并启用项目内配置的持续集成（CI）系统。这种方法允许贡献者在无需设置本地开发环境的情况下轻松测试自己的更改。不需要特定的 CI 运行器；GitHub 的运行器会处理代码的编译（用于测试）以及所有受支持操作系统的软件包构建。因此，您可以在分叉中轻松复制整个 CI 过程，唯一的例外是将软件包发布到 https://repo.manticoresearch.com/。

### GitHub 入门

1. 在 GitHub 上分叉 [Manticore Search GitHub 仓库](https://github.com/manticoresoftware/manticoresearch) 以创建一个个人副本。
2. 使用命令 `git clone https://github.com/<your-username>/manticoresearch` 将您的分叉克隆到本地计算机。
3. 通过仓库设置在您的分叉中启用持续集成（CI）。
4. 将更改推送到您的 GitHub 仓库。CI 会自动编译和测试您的代码，并在您的仓库中直接提供反馈。
5. 向原始（上游）仓库创建拉取请求，请求合并您的更改。

这种以 GitHub 为中心的方法简化了初始设置，使贡献者能够专注于开发，而不是环境配置。

## 使用 Docker 手动构建和测试

对于那些更喜欢动手操作或需要更多控制构建和测试环境的人（例如重新创建特定测试），有另一种解决方案。这涉及手动使用 CI 系统所使用的相同 Docker 镜像来编译和测试 Manticore Search。

### 使用 Docker 编译 Manticore Search

在克隆的根目录中使用以下 Docker 命令来编译 Manticore Search：
```bash
docker run -it --rm -e SYSROOT_URL=https://repo.manticoresearch.com/repository/sysroots \
-e arch=x86_64 \
-e DISTR=jammy \
-e boost=boost_nov22 \
-e sysroot=roots_nov22 \
-e CTEST_CONFIGURATION_TYPE=Debug \
-e NO_TESTS=1 \
-e CACHEB="../cache" \
-v $(pwd):/in/ \
manticoresearch/external_toolchain:clang16_cmake3263 bash
```

请注意，您需要在从 https://github.com/manticoresoftware/manticoresearch 克隆的根目录中执行此操作。

运行此命令后，您将进入容器。按照以下步骤继续编译代码：

1. 导航到挂载的目录：
   ```bash
   cd /in/
   ```
2. 创建构建目录并启动编译过程：
   ```bash
   mkdir build
   ctest -VV -S misc/ctest/gltest.cmake --no-compress-output
   ```

`ctest -VV` 命令会触发详细测试模式，提供有关构建过程的详细输出。

### 测试 Manticore Search

编译完成后，您可以使用另一个 Docker 命令测试 Manticore Search：

```bash
docker run --rm -it \
-e DIAGNOSTIC=1 \
-e NO_BUILD=1 \
-e WITH_COVERAGE=0 \
-e CACHEB="../cache" \
--name test \
-v $(pwd):/in/ \
manticoresearch/ubertests_ctest:3263_mar_2024 bash
```

在容器内，运行以下命令开始测试：

1. 导航到挂载的目录：
   ```bash
   cd /in/
   ```
2. 删除上一次编译留下的 cmake 缓存：
   ```bash
   rm build/CMakeCache.txt
   ```
3. 执行通用测试套件：
   ```bash
   ctest -V -S misc/ctest/gltest.cmake --no-compress-output
   ```
   可选地，您可以通过包含 `CTEST_REGEX` 参数来运行特定测试：
   ```bash
   CTEST_REGEX=202 ctest -VV -S misc/ctest/gltest.cmake --no-compress-output
   ```

### 运行 Ubertests

运行特定测试的另一种方法是直接使用 `ubertest.php` 脚本（上述 `ctest` 命令也会在内部执行它）：

1. 导航到测试目录：
   ```bash
   cd /in/test/
   ```
2. 运行特定测试的 ubertest 脚本：
   ```bash
   php ubertest.php -s /in/build/src/searchd -i /in/build/src/indexer t 202
   # Or for multiple tests
   php ubertest.php -s /in/build/src/searchd -i /in/build/src/indexer t 201 202
   ```

# 结论
GitHub 和 Docker 方法都为为 Manticore Search 做贡献提供了不同的优势。Manticore 引入的专用 Docker 镜像显著降低了通常与 C++ 项目贡献相关的复杂性，使开发人员能够更专注于自己的贡献，而不是环境设置。无论您更喜欢 GitHub 的简单性和自动化，还是 Docker 方法的详细控制，这些工作流程都能促进您对该项目贡献的高效开发和测试。
