fix: Dockerfile uses rust:1-bookworm, build mem-cli binary #26

Open
rock wants to merge 1 commits from fix/dockerfile into main
13 changed files with 555 additions and 33 deletions
+7 -12
View File
@@ -32,12 +32,17 @@ jobs:
run: cargo check -p mem-ingest 2>&1 | tail -20 || true run: cargo check -p mem-ingest 2>&1 | tail -20 || true
- name: Get short SHA - name: Get short SHA
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
id: sha id: sha
run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Build Docker image
run: |
docker build --no-cache --progress=plain \
-t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:latest" \
-f Dockerfile .
- name: Registry login - name: Registry login
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: | run: |
echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \ echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \
--username "${REGISTRY_USER}" --password-stdin --username "${REGISTRY_USER}" --password-stdin
@@ -45,21 +50,11 @@ jobs:
REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }} REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }}
- name: Build Docker image
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: |
docker build --no-cache \
-t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:latest" \
-f Dockerfile .
- name: Push Docker image - name: Push Docker image
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: | run: |
docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}" docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}"
docker push "${IMAGE}:latest" docker push "${IMAGE}:latest"
echo "✓ Pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}" echo "✓ Pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}"
- name: Prune unused images - name: Prune unused images
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: docker image prune -a --force 2>&1 | tail -3 || true run: docker image prune -a --force 2>&1 | tail -3 || true
@@ -0,0 +1,52 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1\n ORDER BY version_num DESC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "1e81bb729531ca33e4cef21623bcfe4fafb0c1bd435353b205f582bfda8873bc"
}
@@ -0,0 +1,52 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_edge_version\n WHERE edge_id = $1\n ORDER BY version_num DESC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Uuid"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "62d65d4afc4d292b37de8e5cb59fbd51c602bdc1b437988f54e6c7fe268b9816"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1 AND changed_at <= $2\n ORDER BY version_num DESC\n LIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text",
"Timestamptz"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "aee5900f5e3d7cbba23729bbf2dd033dcc4cb41f6c851bf447a9238810684d18"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1 AND version_num = $2\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text",
"Int4"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "c045466e1fe037dbdafea1008f262f4e48f104ea77732aa1d32ecb797f70e71d"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_edge_version\n WHERE edge_id = $1 AND version_num = $2\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Uuid",
"Int4"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "ca6872495bc04c6a65531279af8c758637c902dda2cc10366662988c6973ca48"
}
+4 -3
View File
@@ -1,15 +1,16 @@
# Multi-stage build for Poimen Memory Service (Rust) # Multi-stage build for Poimen Memory Service (Rust)
# Stage 1: Builder # Stage 1: Builder
FROM rust:1.81-bookworm as builder FROM rust:1-bookworm as builder
WORKDIR /build WORKDIR /build
# Copy source # Copy source
COPY . . COPY . .
# Build in release mode # Build the mem binary (offline sqlx - uses .sqlx/ cache)
RUN cargo build --release ENV SQLX_OFFLINE=true
RUN cargo build --release -p mem-cli
# Stage 2: Runtime # Stage 2: Runtime
FROM debian:bookworm-slim FROM debian:bookworm-slim
@@ -0,0 +1,52 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1\n ORDER BY version_num DESC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "1e81bb729531ca33e4cef21623bcfe4fafb0c1bd435353b205f582bfda8873bc"
}
@@ -0,0 +1,52 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_edge_version\n WHERE edge_id = $1\n ORDER BY version_num DESC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Uuid"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "62d65d4afc4d292b37de8e5cb59fbd51c602bdc1b437988f54e6c7fe268b9816"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1 AND changed_at <= $2\n ORDER BY version_num DESC\n LIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text",
"Timestamptz"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "aee5900f5e3d7cbba23729bbf2dd033dcc4cb41f6c851bf447a9238810684d18"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_entity_version\n WHERE entity_id = $1 AND version_num = $2\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Text",
"Int4"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "c045466e1fe037dbdafea1008f262f4e48f104ea77732aa1d32ecb797f70e71d"
}
@@ -0,0 +1,53 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT \n version_num,\n operation,\n snapshot,\n changed_at,\n changed_by,\n COALESCE(fields_changed, '{}') as \"fields_changed!\"\n FROM memory_edge_version\n WHERE edge_id = $1 AND version_num = $2\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version_num",
"type_info": "Int4"
},
{
"ordinal": 1,
"name": "operation",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "snapshot",
"type_info": "Jsonb"
},
{
"ordinal": 3,
"name": "changed_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "changed_by",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "fields_changed!",
"type_info": "TextArray"
}
],
"parameters": {
"Left": [
"Uuid",
"Int4"
]
},
"nullable": [
false,
false,
false,
false,
false,
null
]
},
"hash": "ca6872495bc04c6a65531279af8c758637c902dda2cc10366662988c6973ca48"
}
+18 -18
View File
@@ -111,28 +111,28 @@ impl EntityVersioningService {
let mut modified = Vec::new(); let mut modified = Vec::new();
// Check removed and modified // Check removed and modified
if let Some(from) = from_obj { if let Some(ref from) = from_obj {
for (key, from_val) in from { for (key, from_val) in from {
if let Some(to) = &to_obj { if let Some(to) = &to_obj {
if let Some(to_val) = to.get(&key) { if let Some(to_val) = to.get(key) {
if from_val != *to_val { if from_val != to_val {
modified.push(DiffField { modified.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: Some(to_val.clone()), to_value: Some(to_val.clone()),
}); });
} }
} else { } else {
removed.push(DiffField { removed.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: None, to_value: None,
}); });
} }
} else { } else {
removed.push(DiffField { removed.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: None, to_value: None,
}); });
} }
@@ -301,28 +301,28 @@ fn compute_diff(
let mut removed = Vec::new(); let mut removed = Vec::new();
let mut modified = Vec::new(); let mut modified = Vec::new();
if let Some(from) = from_obj { if let Some(ref from) = from_obj {
for (key, from_val) in from { for (key, from_val) in from {
if let Some(to) = &to_obj { if let Some(to) = &to_obj {
if let Some(to_val) = to.get(&key) { if let Some(to_val) = to.get(key) {
if from_val != *to_val { if from_val != to_val {
modified.push(DiffField { modified.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: Some(to_val.clone()), to_value: Some(to_val.clone()),
}); });
} }
} else { } else {
removed.push(DiffField { removed.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: None, to_value: None,
}); });
} }
} else { } else {
removed.push(DiffField { removed.push(DiffField {
name: key, name: key.clone(),
from_value: Some(from_val), from_value: Some(from_val.clone()),
to_value: None, to_value: None,
}); });
} }