Align package and executable names with workspace directories
Verify databases and deploy Aster VM / verify-and-deploy (push) Successful in 15m7s
Verify databases and deploy Aster VM / verify-and-deploy (push) Successful in 15m7s
This commit is contained in:
Generated
+33
-33
@@ -8,39 +8,6 @@ version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
||||
|
||||
[[package]]
|
||||
name = "aster-cli"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"aster-core",
|
||||
"aster-storage",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aster-core"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "aster-server"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"aster-core",
|
||||
"aster-storage",
|
||||
"axum",
|
||||
"serde",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aster-storage"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"sqlx",
|
||||
"tempfile",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atoi"
|
||||
version = "2.0.0"
|
||||
@@ -159,6 +126,19 @@ version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
|
||||
|
||||
[[package]]
|
||||
name = "cli"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"core",
|
||||
"storage",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "cpufeatures"
|
||||
version = "0.2.17"
|
||||
@@ -1079,6 +1059,17 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "server"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"core",
|
||||
"serde",
|
||||
"storage",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.10.9"
|
||||
@@ -1292,6 +1283,15 @@ version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "storage"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"sqlx",
|
||||
"tempfile",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stringprep"
|
||||
version = "0.1.5"
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ rust-version = "1.91"
|
||||
license = "MIT"
|
||||
|
||||
[workspace.dependencies]
|
||||
aster-core = { path = "crates/core" }
|
||||
aster-storage = { path = "crates/storage" }
|
||||
core = { path = "crates/core" }
|
||||
storage = { path = "crates/storage" }
|
||||
axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio"] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
|
||||
+4
-4
@@ -13,19 +13,19 @@ ENV CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0
|
||||
CMD ["sh", "scripts/check.sh"]
|
||||
|
||||
FROM source AS build
|
||||
RUN cargo build --locked --release -p aster-server -p aster-cli
|
||||
RUN cargo build --locked --release -p server -p cli
|
||||
|
||||
FROM debian:bookworm-slim AS runtime
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& useradd --system --uid 10001 --create-home aster \
|
||||
&& mkdir -p /data && chown aster:aster /data
|
||||
COPY --from=build /build/target/release/aster-server /usr/local/bin/aster-server
|
||||
COPY --from=build /build/target/release/aster /usr/local/bin/aster
|
||||
COPY --from=build /build/target/release/server /usr/local/bin/server
|
||||
COPY --from=build /build/target/release/cli /usr/local/bin/cli
|
||||
USER 10001
|
||||
WORKDIR /data
|
||||
ENV ASTER_LISTEN=0.0.0.0:8080 SQLITE_PATH=/data/aster.db
|
||||
EXPOSE 8080
|
||||
HEALTHCHECK --interval=10s --timeout=6s --start-period=10s --retries=3 \
|
||||
CMD curl --fail --silent http://127.0.0.1:8080/health || exit 1
|
||||
CMD ["aster-server"]
|
||||
CMD ["server"]
|
||||
|
||||
@@ -21,7 +21,7 @@ VM 从空堆启动;尚无源码 lexer/parser、Python type/元类体系、
|
||||
|
||||
| 文件或目录 | 职责 |
|
||||
| --- | --- |
|
||||
| Cargo.toml / Cargo.lock | 工作区、包依赖、Rust 版本要求及依赖锁定;目录名无 aster- 前缀,包名保留 |
|
||||
| Cargo.toml / Cargo.lock | 工作区、包依赖、Rust 版本要求及依赖锁定;包名与目录一致:core、storage、cli、server |
|
||||
| crates/ | core、storage、cli、server 四个包,每个目录的 README 解释本目录 |
|
||||
| docs/ | 跨目录的架构、运行时契约、配置、运行、部署与维护说明 |
|
||||
| scripts/ | 指定远端环境中的检查、冒烟、CI 与部署脚本 |
|
||||
|
||||
+7
-5
@@ -1,12 +1,14 @@
|
||||
# Cargo 工作区
|
||||
|
||||
本目录包含四个 crate。目录名不用 aster- 前缀,Cargo 包名和二进制名保留现有名称;路径依赖定义在根 Cargo.toml。
|
||||
本目录包含四个 crate。Cargo 包名与目录一致,均不带项目前缀;路径依赖定义在根 Cargo.toml。
|
||||
|
||||
| 目录 | 包名/产物 | 职责 |
|
||||
| --- | --- | --- |
|
||||
| [core](core/README.md) | aster-core | 零外部依赖的对象运行时、堆与字节码 VM |
|
||||
| [storage](storage/README.md) | aster-storage | 宿主元数据与 SQLite/PostgreSQL 适配,不依赖 core |
|
||||
| [cli](cli/README.md) | aster-cli,二进制 aster | 引导演示和 metadata 命令 |
|
||||
| [server](server/README.md) | aster-server | 最小常驻 HTTP 宿主 |
|
||||
| [core](core/README.md) | core | 零外部依赖的对象运行时、堆与字节码 VM |
|
||||
| [storage](storage/README.md) | storage | 宿主元数据与 SQLite/PostgreSQL 适配,不依赖 core |
|
||||
| [cli](cli/README.md) | cli,二进制 cli | 引导演示和 metadata 命令 |
|
||||
| [server](server/README.md) | server | 最小常驻 HTTP 宿主 |
|
||||
|
||||
core 的 Rust 库目标明确命名为 endor_core,避免与 Rust 标准库 core 重名;storage 的引用名为 storage,两个二进制分别为 cli、server。Cargo 通过 [lib] 自定义库名,详见 [Cargo 目标说明](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field)。
|
||||
|
||||
CLI/Server 依赖 Core 和 Storage,Core 与 Storage 互不依赖。网络、数据库、浏览器、进程配置和信号留在宿主。全局说明见 [架构](../docs/architecture/README.md),查功能位置从 [文档索引](../docs/README.md) 进入。返回 [项目入口](../README.md)。
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
[package]
|
||||
name = "aster-cli"
|
||||
name = "cli"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[[bin]]
|
||||
name = "aster"
|
||||
name = "cli"
|
||||
path = "src/main.rs"
|
||||
|
||||
[dependencies]
|
||||
aster-core.workspace = true
|
||||
aster-storage.workspace = true
|
||||
core.workspace = true
|
||||
storage.workspace = true
|
||||
tokio.workspace = true
|
||||
|
||||
[lints]
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# aster-cli / aster
|
||||
# cli
|
||||
|
||||
命令行宿主。bootstrap 演示两个运行时对象并释放;metadata put/get 使用独立 Storage,不让数据库配置进入 Core。
|
||||
|
||||
| 内容 | 职责 |
|
||||
| --- | --- |
|
||||
| Cargo.toml | CLI 包、aster 二进制名称、core/storage/Tokio 依赖 |
|
||||
| Cargo.toml | CLI 包、cli 二进制名称、core/storage/Tokio 依赖 |
|
||||
| [src](src/README.md) | 参数路由、命令执行和退出码 |
|
||||
|
||||
用法见 [运行指南](../../docs/operations/README.md),文本参数与环境边界见 [配置](../../docs/operations/configuration.md)。此 CLI 当前不是 Endor 源码解释命令。返回 [工作区](../README.md)。
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
use std::error::Error;
|
||||
use std::process::ExitCode;
|
||||
|
||||
use aster_core::{Value, Vm};
|
||||
use aster_storage::{Storage, StorageConfig};
|
||||
use endor_core::{Value, Vm};
|
||||
use storage::{Storage, StorageConfig};
|
||||
|
||||
const USAGE: &str = "Usage: aster [bootstrap | metadata put <key> <value> | metadata get <key>]";
|
||||
const USAGE: &str = "Usage: cli [bootstrap | metadata put <key> <value> | metadata get <key>]";
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> ExitCode {
|
||||
match run().await {
|
||||
Ok(()) => ExitCode::SUCCESS,
|
||||
Err(error) => {
|
||||
eprintln!("aster: {error}");
|
||||
eprintln!("cli: {error}");
|
||||
ExitCode::FAILURE
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
[package]
|
||||
name = "aster-core"
|
||||
name = "core"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
# Keep the library distinct from Rust's built-in core crate.
|
||||
[lib]
|
||||
name = "endor_core"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# aster-core
|
||||
# core
|
||||
|
||||
Endor VM 内核,保持零外部依赖。负责 EndorObject、堆、代际句柄、引用计数/循环回收、基本载荷和小型 wordcode 执行器。公共 Rust API 从 src/lib.rs 导出。
|
||||
Endor VM 内核,保持零外部依赖。负责 EndorObject、堆、代际句柄、引用计数/循环回收、基本载荷和小型 wordcode 执行器。公共 Rust API 从 src/lib.rs 导出。Cargo 包名为 core,Rust 引用名为 endor_core,由 Cargo.toml 的 [lib] 设置,避免与标准库 core 重名。
|
||||
|
||||
| 内容 | 入口 |
|
||||
| --- | --- |
|
||||
| Cargo.toml | 包元数据和工作区 lint;没有外部依赖 |
|
||||
| Cargo.toml | 包元数据、endor_core 库目标和工作区 lint;没有外部依赖 |
|
||||
| [src](src/README.md) | 文件职责、公开接口和常见修改位置 |
|
||||
| [tests](tests/README.md) | 对象、基本载荷、执行语义与生命周期检查 |
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//! Python language type system; wordcode is not CPython bytecode compatible.
|
||||
//!
|
||||
//! ```
|
||||
//! use aster_core::{Value, Vm};
|
||||
//! use endor_core::{Value, Vm};
|
||||
//! let mut vm = Vm::new()?;
|
||||
//! let object = vm.new_object()?; // One owned external reference.
|
||||
//! vm.set_attr(object, "x", Value::Number(42_i64.into()))?;
|
||||
@@ -12,12 +12,12 @@
|
||||
//! assert_eq!(vm.ref_count(object)?, 1);
|
||||
//! vm.release(object)?; // The object is destroyed.
|
||||
//! assert_eq!(vm.object_count(), 0);
|
||||
//! # Ok::<(), aster_core::VmError>(())
|
||||
//! # Ok::<(), endor_core::VmError>(())
|
||||
//! ```
|
||||
//!
|
||||
//! Execute validated wordcode without a source parser:
|
||||
//! ```
|
||||
//! use aster_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm};
|
||||
//! use endor_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm};
|
||||
//! let mut vm = Vm::new()?;
|
||||
//! let globals = vm.new_dict()?;
|
||||
//! let code = EndorCode::from_instructions(
|
||||
@@ -35,7 +35,7 @@
|
||||
//! vm.release(code)?;
|
||||
//! vm.release(globals)?;
|
||||
//! assert_eq!(vm.object_count(), 0);
|
||||
//! # Ok::<(), aster_core::VmError>(())
|
||||
//! # Ok::<(), endor_core::VmError>(())
|
||||
//! ```
|
||||
|
||||
mod builtins;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Core 公开行为检查
|
||||
|
||||
本目录通过 aster_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。
|
||||
本目录通过 endor_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。
|
||||
|
||||
| 文件 | 覆盖 |
|
||||
| --- | --- |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use aster_core::{
|
||||
use endor_core::{
|
||||
CodeLayout, CompareOp, EndorBaseExceptionObject, EndorCode, EndorDictObject,
|
||||
EndorFunctionObject, EndorInteger, EndorNativeFunctionObject, EndorNumber, EndorNumberObject,
|
||||
EndorReal, EndorStringObject, EndorTracebackEntry, Instruction, Opcode, Value, Vm, VmError,
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::any::Any;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
|
||||
use aster_core::{
|
||||
use endor_core::{
|
||||
CodeLayout, CompareOp, EndorCode, EndorCodeObject, EndorNativeFunctionObject, ExecutionLimits,
|
||||
Instruction, ObjectPayload, ObjectRef, Opcode, Value, Vm, VmError,
|
||||
};
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::any::Any;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
|
||||
use aster_core::{CompareOp, NativeFunction, ObjectPayload, ObjectRef, Record, Value, Vm, VmError};
|
||||
use endor_core::{CompareOp, NativeFunction, ObjectPayload, ObjectRef, Record, Value, Vm, VmError};
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Resource {
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
[package]
|
||||
name = "aster-server"
|
||||
name = "server"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
aster-core.workspace = true
|
||||
aster-storage.workspace = true
|
||||
core.workspace = true
|
||||
storage.workspace = true
|
||||
axum.workspace = true
|
||||
serde.workspace = true
|
||||
tokio.workspace = true
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# aster-server
|
||||
# server
|
||||
|
||||
最小常驻 HTTP 宿主,提供数据库健康检查和只读 VM 引导信息。它通过 Arc 共享 Vm,没有语言执行接口或可变 VM 请求上下文。
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@ use std::future::Future;
|
||||
use std::process::ExitCode;
|
||||
use std::sync::Arc;
|
||||
|
||||
use aster_core::Vm;
|
||||
use aster_storage::{Storage, StorageConfig};
|
||||
use axum::{Json, Router, extract::State, http::StatusCode, routing::get};
|
||||
use endor_core::Vm;
|
||||
use serde::Serialize;
|
||||
use storage::{Storage, StorageConfig};
|
||||
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
@@ -32,7 +32,7 @@ async fn main() -> ExitCode {
|
||||
match run().await {
|
||||
Ok(()) => ExitCode::SUCCESS,
|
||||
Err(error) => {
|
||||
eprintln!("aster-server: {error}");
|
||||
eprintln!("server: {error}");
|
||||
ExitCode::FAILURE
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,7 @@ async fn run() -> Result<(), Box<dyn Error>> {
|
||||
storage: storage.clone(),
|
||||
});
|
||||
println!(
|
||||
"Aster host listening on {} (storage={})",
|
||||
"Endor host listening on {} (storage={})",
|
||||
listener.local_addr()?,
|
||||
storage.backend_name()
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "aster-storage"
|
||||
name = "storage"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# aster-storage
|
||||
# storage
|
||||
|
||||
宿主元数据存储,依赖 SQLx/Tokio,不依赖 VM 内核。一个 Storage 选择 SQLite 或 PostgreSQL;明确配置 PostgreSQL 后失败不回退。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//! Host metadata storage; deliberately has no dependency on aster-core.
|
||||
//! Host metadata storage; deliberately has no dependency on core.
|
||||
use std::fmt;
|
||||
use std::path::PathBuf;
|
||||
use std::str::FromStr;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use aster_storage::{Storage, StorageConfig};
|
||||
use storage::{Storage, StorageConfig};
|
||||
|
||||
/// Run explicitly against a disposable database; never silently skip a missing URL.
|
||||
#[tokio::test]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use aster_storage::{Storage, StorageConfig};
|
||||
use storage::{Storage, StorageConfig};
|
||||
|
||||
#[test]
|
||||
fn configuration_defaults_precedence_and_errors() {
|
||||
|
||||
@@ -11,7 +11,7 @@ Server ─→ Core
|
||||
└─────→ Storage
|
||||
```
|
||||
|
||||
Core 与 Storage 互不依赖。HTTP、Tokio、SQLx、数据库、网络和后续浏览器能力属于宿主,不进入零外部依赖的 aster-core。源码包导航见 [crates](../../crates/README.md)。
|
||||
Core 与 Storage 互不依赖。HTTP、Tokio、SQLx、数据库、网络和后续浏览器能力属于宿主,不进入零外部依赖的 core。源码包导航见 [crates](../../crates/README.md)。
|
||||
|
||||
| 组件 | 当前职责 | 全局契约 |
|
||||
| --- | --- | --- |
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
|
||||
```sh
|
||||
cargo build --workspace --locked
|
||||
cargo run -p aster-cli -- bootstrap
|
||||
cargo run -p cli -- bootstrap
|
||||
```
|
||||
|
||||
bootstrap 创建两个 Record,输出 runtime=EndorObject、type_system=disabled、objects_distinct=true 和 heap_objects=2,显式释放后输出 released heap_objects=0。它不读取数据库配置,因此无效 DATABASE_URL 也不影响该命令。
|
||||
|
||||
```sh
|
||||
cargo run -p aster-cli -- metadata put project 'Aster VM'
|
||||
cargo run -p aster-cli -- metadata get project
|
||||
cargo run -p cli -- metadata put project 'Aster VM'
|
||||
cargo run -p cli -- metadata get project
|
||||
```
|
||||
|
||||
每次 metadata 命令读取宿主存储配置、连接、操作并关闭连接池;缺失键显示 (missing)。命令和退出码的源码位置见 [cli/src](../../crates/cli/src/README.md)。
|
||||
@@ -23,7 +23,7 @@ cargo run -p aster-cli -- metadata get project
|
||||
## HTTP 宿主
|
||||
|
||||
```sh
|
||||
cargo run -p aster-server
|
||||
cargo run -p server
|
||||
curl --fail http://127.0.0.1:8080/health
|
||||
curl --fail http://127.0.0.1:8080/bootstrap
|
||||
```
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 镜像与独立运行
|
||||
|
||||
Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远端检查工具,build 阶段构建 aster-server 和 aster,runtime 阶段使用 Debian slim、UID 10001、/data 工作目录及 HTTP 健康检查。
|
||||
Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远端检查工具,build 阶段构建 server 和 cli,runtime 阶段使用 Debian slim、UID 10001、/data 工作目录及 HTTP 健康检查。
|
||||
|
||||
指定环境的 SQLite 方案:
|
||||
|
||||
@@ -12,7 +12,7 @@ Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远
|
||||
cp .env.example .env
|
||||
docker compose up --build -d
|
||||
curl --fail http://127.0.0.1:8080/health
|
||||
docker compose exec aster aster metadata put project 'Aster VM'
|
||||
docker compose exec aster cli metadata put project 'Aster VM'
|
||||
```
|
||||
|
||||
默认 docker-compose.yml 只向应用提供 SQLITE_PATH,使用 aster-sqlite 命名卷;不透传 DATABASE_URL。down 保留数据,down -v 会删除卷。
|
||||
@@ -21,7 +21,7 @@ docker compose exec aster aster metadata put project 'Aster VM'
|
||||
|
||||
```sh
|
||||
docker compose -f docker-compose.postgres.yml up --build -d
|
||||
docker compose -f docker-compose.postgres.yml exec aster aster metadata get project
|
||||
docker compose -f docker-compose.postgres.yml exec aster cli metadata get project
|
||||
```
|
||||
|
||||
仅使用该 Compose 文件,不与默认 SQLite 文件叠加。此方案使用 aster-postgres 命名卷、PostgreSQL 17;数据库不发布宿主端口。两个独立方案不要同时占用相同应用端口。内部示例连接禁用 TLS,跨不可信网络使用 PostgreSQL TLS 验证。
|
||||
@@ -38,6 +38,8 @@ docker compose -f docker-compose.postgres.yml exec aster aster metadata get proj
|
||||
|
||||
## 生产目录与数据
|
||||
|
||||
Cargo 包名为 core/storage/cli/server,core 的 Rust 库名为 endor_core,可执行文件为 cli/server。Compose 应用服务名 aster、数据库名、卷和生产路径是已有部署资源标识,运行命令为该服务中的 cli;包改名无需迁移这些数据或重建数据库。
|
||||
|
||||
| 路径 | 用途 |
|
||||
| --- | --- |
|
||||
| /opt/endorphin-aster-vm/releases/<sha>/ | 固定版本的 compose.yml 与 release.env |
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
```sh
|
||||
sh scripts/check.sh
|
||||
cargo test -p aster-storage --test postgres --locked -- --ignored
|
||||
cargo test -p storage --test postgres --locked -- --ignored
|
||||
python3 scripts/smoke.py
|
||||
```
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ Python 代码中的 `def greet(name): ...` 创建的是语言函数。函数需
|
||||
CPython 的 `len`、`print` 等宿主实现的内建函数则通过 C 函数入口调用。Endor 使用 Rust,所以命名为 `EndorNativeFunctionObject`,不把 C 写入名称。
|
||||
|
||||
```rust
|
||||
use aster_core::{EndorNativeFunctionObject, Value, Vm, VmError};
|
||||
use endor_core::{EndorNativeFunctionObject, Value, Vm, VmError};
|
||||
|
||||
fn echo(arguments: &[Value]) -> Result<Value, VmError> {
|
||||
match arguments {
|
||||
@@ -58,9 +58,9 @@ Native 函数和语言函数均通过 `Vm::call(&mut self, ...)` 调用。语言
|
||||
| Complex | 复数记录 | 实部与虚部各自的 Integer、Decimal、Rational 或 BinaryFloat 表示 |
|
||||
|
||||
```rust
|
||||
use aster_core::{EndorNumber, Value};
|
||||
use endor_core::{EndorNumber, Value};
|
||||
|
||||
fn main() -> Result<(), aster_core::VmError> {
|
||||
fn main() -> Result<(), endor_core::VmError> {
|
||||
let id = EndorNumber::integer("1234567890123456789012345678901234567890")?;
|
||||
let amount = EndorNumber::decimal("12345678901234567890.000100")?;
|
||||
let ratio = EndorNumber::rational("1", "3")?;
|
||||
@@ -105,9 +105,9 @@ print(read()) # updated
|
||||
`read` 与 `write` 必须引用同一个变量位置。若各自复制一份 `x` 的初始值,write 重新赋值后 read 就看不到变化。Cell 是这个共享位置:函数持有 Cell,Cell 持有当前值。外层函数返回后,Cell 仍被闭包持有。
|
||||
|
||||
```rust
|
||||
use aster_core::{Value, Vm};
|
||||
use endor_core::{Value, Vm};
|
||||
|
||||
fn main() -> Result<(), aster_core::VmError> {
|
||||
fn main() -> Result<(), endor_core::VmError> {
|
||||
let mut vm = Vm::new()?;
|
||||
let cell = vm.new_cell(None)?; // 空槽,不是 Nil。
|
||||
vm.cell_set(cell, Value::Text("first".into()))?;
|
||||
|
||||
@@ -94,9 +94,9 @@ Vm::execute(code, globals)
|
||||
## 最小示例
|
||||
|
||||
```rust
|
||||
use aster_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm};
|
||||
use endor_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm};
|
||||
|
||||
fn main() -> Result<(), aster_core::VmError> {
|
||||
fn main() -> Result<(), endor_core::VmError> {
|
||||
let mut vm = Vm::new()?;
|
||||
let globals = vm.new_dict()?;
|
||||
let code = EndorCode::from_instructions(
|
||||
|
||||
+2
-2
@@ -5,9 +5,9 @@
|
||||
| 文件 | 入口与副作用 |
|
||||
| --- | --- |
|
||||
| [check.sh](check.sh) | fmt 检查、workspace 测试、严格 Clippy;会使用 Cargo 依赖和构建产物 |
|
||||
| [smoke.py](smoke.py) | 标准库 Python 脚本;构建后用 Cargo metadata 定位 debug 二进制,支持 CARGO_TARGET_DIR;临时 SQLite 数据、HTTP 探测和 SIGTERM 退出,不改生产配置 |
|
||||
| [smoke.py](smoke.py) | 标准库 Python 脚本;构建后用 Cargo metadata 定位 cli/server 的 debug 二进制,支持 CARGO_TARGET_DIR;临时 SQLite 数据、HTTP 探测和 SIGTERM 退出,不改生产配置 |
|
||||
| [ci-ces-control.sh](ci-ces-control.sh) | 需要 ASTER_RELEASE_SHA;构建 ci 镜像、创建临时网络/PostgreSQL/检查容器,运行全部检查;退出清理临时容器和网络,保留专属远端 Cargo 缓存卷 |
|
||||
| [deploy-ces-control.sh](deploy-ces-control.sh) | ces-control root 执行;校验已构建镜像、锁定发布、保留密码和数据、验证新服务后切换 current,失败尝试恢复旧版;保留镜像 |
|
||||
| [deploy-ces-control.sh](deploy-ces-control.sh) | ces-control root 执行;校验已构建镜像、锁定发布、保留密码和数据、验证新服务后切换 current,失败尝试恢复旧版;保留镜像;应用服务 aster 内调用 cli |
|
||||
|
||||
CI/部署使用的镜像与路径仅属于本项目,禁止改动其他项目和共享 Runner。smoke.py 临时选择端口后再启动宿主,存在小的端口竞争窗口,指定环境遇到冲突可重试。
|
||||
|
||||
|
||||
@@ -47,6 +47,6 @@ docker run --name "$checks" --init --network "$network" \
|
||||
--env ASTER_TEST_POSTGRES_URL='postgres://aster:aster-ci-only@postgres:5432/aster?sslmode=disable' \
|
||||
"$image" sh -eu -c '
|
||||
sh scripts/check.sh
|
||||
cargo test -p aster-storage --test postgres --locked -- --ignored
|
||||
cargo test -p storage --test postgres --locked -- --ignored
|
||||
python3 scripts/smoke.py
|
||||
'
|
||||
|
||||
@@ -45,11 +45,11 @@ if ! compose_at "$release" up -d --no-build --wait --wait-timeout 180; then
|
||||
rollback
|
||||
exit 1
|
||||
fi
|
||||
if ! compose_at "$release" exec -T aster aster metadata put deployment.release "$release_sha"; then
|
||||
if ! compose_at "$release" exec -T aster cli metadata put deployment.release "$release_sha"; then
|
||||
rollback
|
||||
exit 1
|
||||
fi
|
||||
if ! actual=$(compose_at "$release" exec -T aster aster metadata get deployment.release); then
|
||||
if ! actual=$(compose_at "$release" exec -T aster cli metadata get deployment.release); then
|
||||
rollback
|
||||
exit 1
|
||||
fi
|
||||
|
||||
+2
-2
@@ -24,8 +24,8 @@ def main():
|
||||
# Cargo may use a configured CARGO_TARGET_DIR; discover the actual binaries.
|
||||
metadata = json.loads(run("cargo", "metadata", "--no-deps", "--format-version", "1", env=env))
|
||||
binary_dir = Path(metadata["target_directory"]) / "debug"
|
||||
cli = str(binary_dir / "aster")
|
||||
server = str(binary_dir / "aster-server")
|
||||
cli = str(binary_dir / "cli")
|
||||
server = str(binary_dir / "server")
|
||||
with tempfile.TemporaryDirectory(prefix="aster-smoke-") as directory:
|
||||
env["SQLITE_PATH"] = str(Path(directory) / "nested" / "aster.db")
|
||||
# This must succeed even when an explicit database URL is invalid.
|
||||
|
||||
Reference in New Issue
Block a user