Align package and executable names with workspace directories
Verify databases and deploy Aster VM / verify-and-deploy (push) Successful in 15m7s

This commit is contained in:
2026-10-18 21:15:10 +08:00
parent 8bbe78e01e
commit 18cd24a203
33 changed files with 111 additions and 103 deletions
Generated
+33 -33
View File
@@ -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
View File
@@ -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
View File
@@ -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"]
+1 -1
View File
@@ -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
View File
@@ -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)。
+4 -4
View File
@@ -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]
+2 -2
View File
@@ -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)。
+4 -4
View File
@@ -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
}
}
+5 -1
View File
@@ -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
+3 -3
View File
@@ -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) | 对象、基本载荷、执行语义与生命周期检查 |
+4 -4
View File
@@ -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 -1
View File
@@ -1,6 +1,6 @@
# Core 公开行为检查
本目录通过 aster_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。
本目录通过 endor_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。
| 文件 | 覆盖 |
| --- | --- |
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,
};
+1 -1
View File
@@ -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 {
+3 -3
View File
@@ -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 -1
View File
@@ -1,4 +1,4 @@
# aster-server
# server
最小常驻 HTTP 宿主,提供数据库健康检查和只读 VM 引导信息。它通过 Arc 共享 Vm,没有语言执行接口或可变 VM 请求上下文。
+4 -4
View File
@@ -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 -1
View File
@@ -1,5 +1,5 @@
[package]
name = "aster-storage"
name = "storage"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
+1 -1
View File
@@ -1,4 +1,4 @@
# aster-storage
# storage
宿主元数据存储,依赖 SQLx/Tokio,不依赖 VM 内核。一个 Storage 选择 SQLite 或 PostgreSQL;明确配置 PostgreSQL 后失败不回退。
+1 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -1,4 +1,4 @@
use aster_storage::{Storage, StorageConfig};
use storage::{Storage, StorageConfig};
#[test]
fn configuration_defaults_precedence_and_errors() {
+1 -1
View File
@@ -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)。
| 组件 | 当前职责 | 全局契约 |
| --- | --- | --- |
+4 -4
View File
@@ -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
```
+5 -3
View File
@@ -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 |
+1 -1
View File
@@ -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
```
+5 -5
View File
@@ -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()))?;
+2 -2
View File
@@ -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
View File
@@ -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 临时选择端口后再启动宿主,存在小的端口竞争窗口,指定环境遇到冲突可重试。
+1 -1
View File
@@ -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
'
+2 -2
View File
@@ -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
View File
@@ -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.