# circulation
**Repository Path**: cinematique/circulation
## Basic Information
- **Project Name**: circulation
- **Description**: MOBEBR admin后端项目
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-06-27
- **Last Updated**: 2024-07-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Library Simplified Circulation Manager
 
## 目录
* [概述](#概述)
* [Git分支工作流程](#git分支工作流程)
* [开发](#开发)
* [安装](#安装)
* [操作](#操作)
* [测试](#测试)
* [进行代码更改](#进行代码更改)
* [将集合添加到流通管理器管理界面](#将集合添加到流通管理器管理界面)
* [生成文档](#生成文档)
* [持续集成](#持续集成)
* [贡献](#贡献)
* [许可证](#许可证)
* [附录](#附录)
## 概述
这是[Library Simplified](https://www.librarysimplified.org/)的流通管理器。流通管理器是图书馆藏和Library Simplified的各种客户端应用(包括SimplyE)之间的主要连接。它处理用户认证,将有许可的作品与开放获取内容组合在一起,从分发商API和二级来源中提取更新的图书信息,并在适当组织的OPDS订阅中提供可用的图书。
## Git分支工作流程
默认分支是`develop`,在进行错误修复或新功能的分支时应使用该工作分支。一旦将功能分支合并到`develop`,更改可以合并到`main`分支以创建发布版本。
其名称遵循`-deploy-`模式的分支是受保护的,并作为名为`organization`的组织的CI/CD流程的一部分使用。这些分支包括:
* `nypl-deploy-qa`
* `nypl-deploy-production`
* `openebooks-deploy-qa`
* `openebooks-deploy-production`
* `bpl-deploy-qa`
* `bpl-deploy-production`
## 开发
运行流通管理器实例的首选方法是使用Docker容器。如果由于某种原因无法运行容器化的流通管理器版本,则可以在[docs/NonDockerInstallation.md](./docs/NonDockerInstallation.md)中找到直接安装的初始说明。
### 安装
获取本地开发环境的推荐方法是使用[Docker](https://www.docker.com/products/docker-desktop)。如果需要进行直接安装,请查看[Non-Docker Installation](./docs/NonDockerInstallation.md)文档。
_**注意:**流通管理器容器应在基于amd64和arm64的机器上构建和运行。然而,由于我们当前依赖的容器化版本的ElasticSearch存在差异,因此必须使用不同的Docker Compose文件(`docker-compose.arm64.yml`)来协调arm64机器上的群集,包括使用苹果的M1芯片系列的机器。如果您在本机上使用`make`命令来控制本地集群,这种差异并不重要,因为它会根据机器的体系结构选择正确的compose文件。然而,如果您在基于arm64的机器上直接运行`docker-compose`命令,请确保使用正确的compose文件,即`docker-compose --file docker-compose.arm64.yml `。_
#### Docker
除了安装Docker Desktop(上面的链接),还需要在[Docker Hub](https://hub.docker.com)上创建帐户。Docker工作原理是通过下载基础机器映像进行构建,并且其中大部分都可以从Docker Hub获得。然而,Docker Engine只能代表经过身份验证的用户定位并拉取图像。
一旦创建了帐户(或使用您已经拥有的帐户),您需要通过Docker Desktop安装来登录。您应该能够从Docker Desktop仪表板窗口的右上角执行此操作。
#### Make
为了简化流通管理器的本地容器管理,提供了一个[`Makefile`](./Makefile)。如果您的系统上尚未安装`make`,可以通过系统的软件包管理器(如`apt`,`brew`等)进行安装。如果您无法获取或不想安装`make`本身,您也可以通过手动复制和粘贴Makefile中的命令到您的shell中运行来执行其中的命令。
#### 克隆存储库并构建镜像
以下shell命令将克隆此存储库并为流通管理器Web应用程序和PostgreSQL数据库构建Docker镜像:
```shell
git clone https://github.com/NYPL-Simplified/circulation.git
cd ./circulation
make build
```
### 操作
成功构建镜像后,您可以使用以下命令启动本地集群:
```shell
make up
```
第一次启动集群时,数据库容器将运行初始化脚本 [`localdev_postgres_init.sh`](./docker/localdev_postgres_init.sh),该脚本会创建开发和测试数据库、安装 PostgreSQL 扩展,并创建具有凭证的用户。由于 PostgreSQL 数据目录被持久化在 Docker 卷中,后续的启动将不会重新初始化数据库。Webapp 容器将等待数据库可用并接受连接后才启动其 Web 服务器。如果您想观察初始化过程,请使用 `make up-watch` 替代 `make up`,以保持终端连接到正在运行的容器的输出。
如果您之前曾运行过容器化的 Circulation Manager 版本,可能仍然存在一个 Docker 卷,用于持久化 PostgreSQL 数据目录。如果是这种情况,并且该目录中的数据库配置不正确,您可能会在运行 `make up-watch` 时看到如下输出:
```Text
cm_local_db | PostgreSQL Database directory appears to contain a database; Skipping initialization
[...]
cm_local_db | 2021-11-19 22:20:06.563 UTC [74] FATAL: password authentication failed for user "simplified"
cm_local_db | 2021-11-19 22:20:06.563 UTC [74] DETAIL: Role "simplified" does not exist.
[...]
cm_local_webapp | --- Database unavailable, sleeping 5 seconds
```
如果是这样的情况,请运行 `make clean` 命令来删除现有的卷,然后再次运行 `make up-watch`,您应该能够看到数据库初始化过程。
当集群正在运行(并且 Web 服务器已经启动)时,您应该能够通过 `http://localhost` 访问 API 端点,并通过 `http://localhost/admin/` 访问管理 Web 应用程序。在您首次尝试登录管理应用程序时,将创建一个用户,其凭据由您提供。
其他生命周期管理命令(完整列表可通过 `make help` 查看):
* `make stop` / `make start` - 在运行 `make up` 后,您可以暂停和恢复集群而无需销毁容器
* `make down` - 停止集群并删除容器和虚拟网络
* `make clean` - 停止集群,删除容器和虚拟网络以及数据库卷
* `make full-clean` - 与 `make clean` 相同,但还删除集群的 Docker 镜像
#### 访问容器
在集群运行时,您可以使用以下命令访问容器:
* `make db-session` - 以超级用户身份在数据库容器上启动 `psql` 会话
* `make webapp-shell` - 在 webapp 容器上打开一个 bash shell
* `make webapp-py-repl` - 在 webapp 容器中的项目虚拟环境中打开一个 Python REPL 会话
* `make scripts-shell` - 在 scripts 容器上打开一个 bash shell
* `make scripts-py-repl` - 在 scripts 容器中的项目虚拟环境中打开一个 Python REPL 会话
### 测试
在运行集群的同时,您可以使用以下命令启动测试套件:
```shell
make test
```
这将通过 `pytest` 运行整个测试套件。如果您希望使用 `-x` 选项来使 `pytest` 在首次出现错误或失败时退出,可以使用以下命令:
```shell
make test-x
```
#### 运行特定的测试
您可以忽略 `Makefile`,直接通过 `docker exec` 向 webapp 容器发出 `pytest` 命令,如下所示:
```shell
docker exec -it cm_local_webapp pipenv run pytest tests
```
这样可以让您访问所有标准的 `pytest` 选项,例如:
```shell
# 使用 -x 快速失败
docker exec -it --env TESTING=1 cm_local_webapp pipenv run pytest -x tests
# 运行特定的测试类
docker exec -it --env TESTING=1 cm_local_webapp pipenv \run pytest tests/test_decorators.py::TestDecorators
# 运行特定的测试方法
docker exec -it --env TESTING=1 cm_local_webapp pipenv run pytest tests/test_decorators.py::TestDecorators::test_uses_location_from_ip
# 关闭警告输出
docker exec -it --env TESTING=1 cm_local_webapp pipenv run pytest --disable-warnings tests
```
完整的 `pytest` 可执行文件选项集可以在 [https://docs.pytest.org/en/6.2.x/usage.html](https://docs.pytest.org/en/6.2.x/usage.html) 上找到。
### 代码更改
用于本地开发 web 应用程序和脚本运行程序的 Docker 容器(`cm_local_webapp` 和 `cm_local_scripts`)在其虚拟化文件系统中没有代码库的副本。相反,将此存储库检出的本地目录作为只读 [bind mount](https://docs.docker.com/storage/bind-mounts/) 提供给容器,路径为 `/home/simplified/circulation`。该 bind mount 的设置是通过 `docker-compose` 完成的,并且可以在 `docker-compose.yml` 和 `docker-compose.arm64.yml` 的 `webapp` 和 `scripts` 部分中找到。
由于这些主机挂载是通过 Docker Compose 实现的,如果您通过 `docker run` 直接从构建的镜像创建容器,除非您通过命令行选项指定 bind mount,否则它们将不会存在,例如:
```shell
docker run -d --rm --mount type=bind,source="$(pwd)",target=/home/simplified/circulation \
--entrypoint tail circulation_webapp:latest -f /dev/null
```
通过将本地目录作为 bind mount,您应该能够在主机
机器上进行更改,并且可以在容器的行为中看到这些更改的反映。
### 向 Circulation Manager Admin 添加馆藏
如果您正在开发 Circulation Manager Admin,并且需要为测试目的向本地应用程序添加图书馆藏,您可以按照[这些说明](https://docs.google.com/document/d/1a0QNWTvt9NKChr8TcLJ3G1PfpBCKV6hC2JuB5Yk_CYY/edit?usp=sharing) 进行操作。
## 生成文档
使用 Sphinx 生成的代码文档可以在本存储库的 [Github Pages](http://nypl-simplified.github.io/circulation/index.html) 上找到。目前,它包含了本存储库的 `api` 目录、`scripts` 文件以及 `core` 子模块目录的文档。文档的配置可以在 `/docs` 中找到。
Github Actions 用于生成 `.rst` 源文件、生成 HTML 静态网站,并将构建部署到 `gh-pages` 分支。
要在 _本地_ 查看文档,请进入 `/docs` 目录并运行 `make html`。这将生成 .rst 源文件,并在 `/docs/build/html` 中构建静态网站。
## 持续集成
对于新的拉取请求和合并到默认的 `develop` 分支,此项目通过 Github Actions 运行所有单元测试。相关文件可以在 `.github/workflows/test.yml` 中找到。在提交更新或修复时,要求测试 Github Action 在所有 Python 3 环境中通过。在推送更改之前,请在本地运行 `tox` 命令以确保在提交之前找到任何失败的测试。
如上所述,Github Actions 还用于构建和部署 Sphinx 文档到 Github Pages。相关文件可以在 `.github/workflows/docks.yml` 中找到。
## 贡献
有关更多信息,请参阅[此处](CONTRIBUTING.md)。
## 许可证
本项目是根据 [Apache-2.0 许可证](LICENSE.md) 的开源软件。
## 附录
查看 [NYPL Simplified Wiki](https://github.com/NYPL-Simplified/Simplified/wiki) 以获取有关与流通管理器相关的各种主题的更深入信息。