Initial release of CHORUS Development Images
Some checks failed
Build and Push Development Images / build-base (push) Has been cancelled
Build and Push Development Images / build-rust (push) Has been cancelled
Build and Push Development Images / build-go (push) Has been cancelled
Build and Push Development Images / build-python (push) Has been cancelled
Build and Push Development Images / build-node (push) Has been cancelled
Build and Push Development Images / build-java (push) Has been cancelled
Build and Push Development Images / build-cpp (push) Has been cancelled
Build and Push Development Images / test-images (base) (push) Has been cancelled
Build and Push Development Images / test-images (cpp-dev) (push) Has been cancelled
Build and Push Development Images / test-images (go-dev) (push) Has been cancelled
Build and Push Development Images / test-images (java-dev) (push) Has been cancelled
Build and Push Development Images / test-images (node-dev) (push) Has been cancelled
Build and Push Development Images / test-images (python-dev) (push) Has been cancelled
Build and Push Development Images / test-images (rust-dev) (push) Has been cancelled
Some checks failed
Build and Push Development Images / build-base (push) Has been cancelled
Build and Push Development Images / build-rust (push) Has been cancelled
Build and Push Development Images / build-go (push) Has been cancelled
Build and Push Development Images / build-python (push) Has been cancelled
Build and Push Development Images / build-node (push) Has been cancelled
Build and Push Development Images / build-java (push) Has been cancelled
Build and Push Development Images / build-cpp (push) Has been cancelled
Build and Push Development Images / test-images (base) (push) Has been cancelled
Build and Push Development Images / test-images (cpp-dev) (push) Has been cancelled
Build and Push Development Images / test-images (go-dev) (push) Has been cancelled
Build and Push Development Images / test-images (java-dev) (push) Has been cancelled
Build and Push Development Images / test-images (node-dev) (push) Has been cancelled
Build and Push Development Images / test-images (python-dev) (push) Has been cancelled
Build and Push Development Images / test-images (rust-dev) (push) Has been cancelled
This commit establishes the foundation for language-specific development
container images used by CHORUS autonomous agents.
Features:
- Multi-stage Dockerfile with 7 layered images
- Base Debian Bookworm image with common tools
- Language-specific images: Rust, Go, Python, Node.js, Java, C/C++
- Standardized /workspace/{input,data,output} structure
- Automated CI/CD pipeline for weekly security updates
- Comprehensive test suite for all images
- Full documentation (README, USAGE, MAINTENANCE)
Images available:
- chorus/base:1.0.0 (~200MB)
- chorus/rust-dev:1.0.0 (~1.2GB)
- chorus/go-dev:1.0.0 (~600MB)
- chorus/python-dev:1.0.0 (~800MB)
- chorus/node-dev:1.0.0 (~700MB)
- chorus/java-dev:1.0.0 (~1.5GB)
- chorus/cpp-dev:1.0.0 (~900MB)
🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
231
.gitea/workflows/build-and-push.yml
Normal file
231
.gitea/workflows/build-and-push.yml
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
name: Build and Push Development Images
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'images/**'
|
||||||
|
- 'VERSION'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
schedule:
|
||||||
|
# Weekly rebuild to get latest security updates (Mondays 2 AM UTC)
|
||||||
|
- cron: '0 2 * * 1'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force_rebuild:
|
||||||
|
description: 'Force rebuild all images'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: registry.home.deepblack.cloud
|
||||||
|
IMAGE_PREFIX: chorus
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-base:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.version.outputs.version }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Read version
|
||||||
|
id: version
|
||||||
|
run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push base image
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target base \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:${{ steps.version.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-rust:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push rust-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target rust-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-go:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push go-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target go-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-python:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push python-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target python-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-node:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push node-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target node-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-java:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push java-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target java-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
build-cpp:
|
||||||
|
needs: build-base
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Build and push cpp-dev
|
||||||
|
run: |
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--target cpp-dev \
|
||||||
|
--push \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:latest \
|
||||||
|
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:${{ needs.build-base.outputs.version }} \
|
||||||
|
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:buildcache \
|
||||||
|
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:buildcache,mode=max \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
|
||||||
|
test-images:
|
||||||
|
needs: [build-rust, build-go, build-python, build-node, build-java, build-cpp]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
image: [base, rust-dev, go-dev, python-dev, node-dev, java-dev, cpp-dev]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Login to Registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
|
- name: Test ${{ matrix.image }}
|
||||||
|
run: |
|
||||||
|
chmod +x tests/test-${{ matrix.image }}.sh
|
||||||
|
REGISTRY=${{ env.REGISTRY }}/chorus bash tests/test-${{ matrix.image }}.sh
|
||||||
191
Makefile
Normal file
191
Makefile
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# CHORUS Development Images Build System
|
||||||
|
# ========================================
|
||||||
|
|
||||||
|
.PHONY: help build-all build-base build-rust build-go build-python build-node build-java build-cpp \
|
||||||
|
test-all test-base test-rust test-go test-python test-node test-java test-cpp \
|
||||||
|
push-all clean version
|
||||||
|
|
||||||
|
REGISTRY ?= registry.home.deepblack.cloud
|
||||||
|
IMAGE_PREFIX := chorus
|
||||||
|
VERSION := $(shell cat VERSION)
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
BLUE := \033[0;34m
|
||||||
|
GREEN := \033[0;32m
|
||||||
|
YELLOW := \033[0;33m
|
||||||
|
NC := \033[0m # No Color
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "$(BLUE)CHORUS Development Images Build System$(NC)"
|
||||||
|
@echo ""
|
||||||
|
@echo "$(GREEN)Build Targets:$(NC)"
|
||||||
|
@echo " build-all Build all images (base + 6 language images)"
|
||||||
|
@echo " build-base Build base image only"
|
||||||
|
@echo " build-rust Build Rust development image"
|
||||||
|
@echo " build-go Build Go development image"
|
||||||
|
@echo " build-python Build Python development image"
|
||||||
|
@echo " build-node Build Node.js development image"
|
||||||
|
@echo " build-java Build Java development image"
|
||||||
|
@echo " build-cpp Build C/C++ development image"
|
||||||
|
@echo ""
|
||||||
|
@echo "$(GREEN)Test Targets:$(NC)"
|
||||||
|
@echo " test-all Test all images"
|
||||||
|
@echo " test-base Test base image"
|
||||||
|
@echo " test-rust Test Rust image"
|
||||||
|
@echo " test-go Test Go image"
|
||||||
|
@echo " test-python Test Python image"
|
||||||
|
@echo " test-node Test Node.js image"
|
||||||
|
@echo " test-java Test Java image"
|
||||||
|
@echo " test-cpp Test C/C++ image"
|
||||||
|
@echo ""
|
||||||
|
@echo "$(GREEN)Registry Targets:$(NC)"
|
||||||
|
@echo " push-all Push all images to registry"
|
||||||
|
@echo " clean Remove local images"
|
||||||
|
@echo ""
|
||||||
|
@echo "$(YELLOW)Configuration:$(NC)"
|
||||||
|
@echo " Registry: $(REGISTRY)"
|
||||||
|
@echo " Image prefix: $(IMAGE_PREFIX)"
|
||||||
|
@echo " Version: $(VERSION)"
|
||||||
|
|
||||||
|
build-all: build-base build-rust build-go build-python build-node build-java build-cpp
|
||||||
|
@echo "$(GREEN)✅ All images built successfully$(NC)"
|
||||||
|
|
||||||
|
build-base:
|
||||||
|
@echo "$(BLUE)Building base image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target base \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/base:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/base:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Base image built$(NC)"
|
||||||
|
|
||||||
|
build-rust: build-base
|
||||||
|
@echo "$(BLUE)Building Rust development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target rust-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Rust image built$(NC)"
|
||||||
|
|
||||||
|
build-go: build-base
|
||||||
|
@echo "$(BLUE)Building Go development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target go-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Go image built$(NC)"
|
||||||
|
|
||||||
|
build-python: build-base
|
||||||
|
@echo "$(BLUE)Building Python development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target python-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Python image built$(NC)"
|
||||||
|
|
||||||
|
build-node: build-base
|
||||||
|
@echo "$(BLUE)Building Node.js development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target node-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Node.js image built$(NC)"
|
||||||
|
|
||||||
|
build-java: build-base
|
||||||
|
@echo "$(BLUE)Building Java development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target java-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ Java image built$(NC)"
|
||||||
|
|
||||||
|
build-cpp: build-base
|
||||||
|
@echo "$(BLUE)Building C/C++ development image...$(NC)"
|
||||||
|
docker build \
|
||||||
|
--target cpp-dev \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:latest \
|
||||||
|
-t $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:$(VERSION) \
|
||||||
|
-f images/base/Dockerfile \
|
||||||
|
images/base
|
||||||
|
@echo "$(GREEN)✅ C/C++ image built$(NC)"
|
||||||
|
|
||||||
|
test-all: test-base test-rust test-go test-python test-node test-java test-cpp
|
||||||
|
@echo "$(GREEN)✅ All tests passed$(NC)"
|
||||||
|
|
||||||
|
test-base:
|
||||||
|
@chmod +x tests/test-base.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-base.sh
|
||||||
|
|
||||||
|
test-rust:
|
||||||
|
@chmod +x tests/test-rust-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-rust-dev.sh
|
||||||
|
|
||||||
|
test-go:
|
||||||
|
@chmod +x tests/test-go-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-go-dev.sh
|
||||||
|
|
||||||
|
test-python:
|
||||||
|
@chmod +x tests/test-python-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-python-dev.sh
|
||||||
|
|
||||||
|
test-node:
|
||||||
|
@chmod +x tests/test-node-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-node-dev.sh
|
||||||
|
|
||||||
|
test-java:
|
||||||
|
@chmod +x tests/test-java-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-java-dev.sh
|
||||||
|
|
||||||
|
test-cpp:
|
||||||
|
@chmod +x tests/test-cpp-dev.sh
|
||||||
|
@REGISTRY=$(REGISTRY)/$(IMAGE_PREFIX) bash tests/test-cpp-dev.sh
|
||||||
|
|
||||||
|
push-all: build-all test-all
|
||||||
|
@echo "$(BLUE)Pushing all images to registry...$(NC)"
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/base:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/base:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:$(VERSION)
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:latest
|
||||||
|
docker push $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:$(VERSION)
|
||||||
|
@echo "$(GREEN)✅ All images pushed to registry$(NC)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo "$(YELLOW)Removing local images...$(NC)"
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/base:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/base:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/rust-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/go-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/python-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/node-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/java-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:latest 2>/dev/null || true
|
||||||
|
-docker rmi $(REGISTRY)/$(IMAGE_PREFIX)/cpp-dev:$(VERSION) 2>/dev/null || true
|
||||||
|
@echo "$(GREEN)✅ Local images removed$(NC)"
|
||||||
|
|
||||||
|
version:
|
||||||
|
@echo "$(VERSION)"
|
||||||
207
README.md
Normal file
207
README.md
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# CHORUS Development Images
|
||||||
|
|
||||||
|
Official Docker images for CHORUS autonomous agent development environments.
|
||||||
|
|
||||||
|
[](https://gitea.chorus.services/tony/chorus-dev-images/actions)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
CHORUS Development Images provide standardized, pre-configured development environments for autonomous agents. Each image follows a consistent workspace structure and includes language-specific toolchains optimized for agent-driven software development.
|
||||||
|
|
||||||
|
## Available Images
|
||||||
|
|
||||||
|
| Image | Base | Approx Size | Key Tools |
|
||||||
|
|-------|------|-------------|-----------|
|
||||||
|
| `chorus/base` | Debian Bookworm | ~200MB | git, curl, build-essential, vim, jq |
|
||||||
|
| `chorus/rust-dev` | base | ~1.2GB | rustc 1.77+, cargo, clippy, rustfmt, ripgrep |
|
||||||
|
| `chorus/go-dev` | base | ~600MB | go1.22, gopls, delve, staticcheck, golangci-lint |
|
||||||
|
| `chorus/python-dev` | base | ~800MB | python3.11, uv, ruff, black, pytest, mypy |
|
||||||
|
| `chorus/node-dev` | base | ~700MB | node20, pnpm, yarn, typescript, eslint, prettier |
|
||||||
|
| `chorus/java-dev` | base | ~1.5GB | openjdk-17, maven, gradle |
|
||||||
|
| `chorus/cpp-dev` | base | ~900MB | gcc, g++, clang, cmake, ninja, gdb, valgrind |
|
||||||
|
|
||||||
|
**Total storage:** ~5GB for all images (with layer sharing)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### Pull an Image
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker pull registry.home.deepblack.cloud/chorus/rust-dev:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Interactive Shell
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Execute Specific Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/output:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workspace Structure
|
||||||
|
|
||||||
|
All images use a standardized three-directory workspace layout:
|
||||||
|
|
||||||
|
```
|
||||||
|
/workspace/
|
||||||
|
├── input/ - Task requirements, repository checkout (typically read-only)
|
||||||
|
├── data/ - Working directory for builds, compilation, temporary files
|
||||||
|
└── output/ - Deliverables, artifacts, reports, patches
|
||||||
|
```
|
||||||
|
|
||||||
|
**Environment Variables:**
|
||||||
|
- `WORKSPACE_ROOT=/workspace`
|
||||||
|
- `WORKSPACE_INPUT=/workspace/input`
|
||||||
|
- `WORKSPACE_DATA=/workspace/data` (default working directory)
|
||||||
|
- `WORKSPACE_OUTPUT=/workspace/output`
|
||||||
|
|
||||||
|
## Image Details
|
||||||
|
|
||||||
|
### Base Image (`chorus/base`)
|
||||||
|
|
||||||
|
Foundation for all language-specific images with:
|
||||||
|
- Debian Bookworm (stable)
|
||||||
|
- Essential development tools
|
||||||
|
- Git with LFS support
|
||||||
|
- Standardized workspace structure
|
||||||
|
- Non-root `chorus` user (UID 1000)
|
||||||
|
|
||||||
|
### Rust Development (`chorus/rust-dev`)
|
||||||
|
|
||||||
|
- **Toolchain:** Stable Rust with rustup
|
||||||
|
- **Components:** rustfmt, clippy, rust-analyzer
|
||||||
|
- **Tools:** cargo-edit, cargo-audit, cargo-watch, ripgrep, fd-find
|
||||||
|
- **Libraries:** libssl-dev, libpq-dev, libsqlite3-dev
|
||||||
|
|
||||||
|
### Go Development (`chorus/go-dev`)
|
||||||
|
|
||||||
|
- **Version:** Go 1.22.2
|
||||||
|
- **Tools:** gopls (LSP), delve (debugger), staticcheck, golangci-lint
|
||||||
|
- **Environment:** GOROOT, GOPATH pre-configured
|
||||||
|
|
||||||
|
### Python Development (`chorus/python-dev`)
|
||||||
|
|
||||||
|
- **Version:** Python 3.11
|
||||||
|
- **Package Managers:** uv, pip-tools
|
||||||
|
- **Linters:** ruff, black, pylint, mypy
|
||||||
|
- **Testing:** pytest, pytest-cov, pytest-asyncio
|
||||||
|
- **REPL:** ipython
|
||||||
|
|
||||||
|
### Node.js Development (`chorus/node-dev`)
|
||||||
|
|
||||||
|
- **Version:** Node 20 LTS
|
||||||
|
- **Package Managers:** npm, pnpm, yarn
|
||||||
|
- **TypeScript:** Full TypeScript support
|
||||||
|
- **Tools:** eslint, prettier, nodemon, pm2
|
||||||
|
|
||||||
|
### Java Development (`chorus/java-dev`)
|
||||||
|
|
||||||
|
- **JDK:** OpenJDK 17
|
||||||
|
- **Build Tools:** Maven, Gradle
|
||||||
|
- **Pre-configured:** Maven local repository
|
||||||
|
|
||||||
|
### C/C++ Development (`chorus/cpp-dev`)
|
||||||
|
|
||||||
|
- **Compilers:** gcc, g++, clang
|
||||||
|
- **Build Systems:** cmake, ninja, autotools
|
||||||
|
- **Libraries:** boost
|
||||||
|
- **Debug Tools:** gdb, valgrind
|
||||||
|
- **Documentation:** doxygen
|
||||||
|
|
||||||
|
## Building Locally
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Docker 20.10+
|
||||||
|
- GNU Make
|
||||||
|
|
||||||
|
### Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build all images
|
||||||
|
make build-all
|
||||||
|
|
||||||
|
# Build specific image
|
||||||
|
make build-rust
|
||||||
|
make build-go
|
||||||
|
make build-python
|
||||||
|
make build-node
|
||||||
|
make build-java
|
||||||
|
make build-cpp
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
make test-all
|
||||||
|
|
||||||
|
# Push to registry (after building and testing)
|
||||||
|
make push-all
|
||||||
|
|
||||||
|
# Clean local images
|
||||||
|
make clean
|
||||||
|
```
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
Images are tagged with:
|
||||||
|
- **`latest`** - Most recent stable build
|
||||||
|
- **`<version>`** - Semantic version (e.g., `1.0.0`)
|
||||||
|
|
||||||
|
### Version History
|
||||||
|
|
||||||
|
- **1.0.0** (2025-09-30) - Initial release
|
||||||
|
- Base Debian Bookworm image
|
||||||
|
- 6 language-specific development environments
|
||||||
|
- Standardized workspace structure
|
||||||
|
|
||||||
|
## Automated Builds
|
||||||
|
|
||||||
|
Images automatically rebuild:
|
||||||
|
- On changes to image source files (push to `main`)
|
||||||
|
- Weekly security update schedule (Mondays 2 AM UTC)
|
||||||
|
- Manual workflow dispatch
|
||||||
|
|
||||||
|
## Integration with CHORUS
|
||||||
|
|
||||||
|
The CHORUS execution engine automatically selects appropriate images based on task language:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Example: CHORUS engine auto-selects image
|
||||||
|
task := &TaskExecutionRequest{
|
||||||
|
Description: "Fix Rust compilation error",
|
||||||
|
}
|
||||||
|
// Engine detects "Rust" and uses chorus/rust-dev:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
### Adding a New Tool
|
||||||
|
|
||||||
|
1. Edit `images/base/Dockerfile`
|
||||||
|
2. Add tool installation to appropriate image stage
|
||||||
|
3. Update tests in `tests/test-<image>.sh`
|
||||||
|
4. Update this README
|
||||||
|
5. Submit pull request
|
||||||
|
|
||||||
|
### Reporting Issues
|
||||||
|
|
||||||
|
Please report issues at: https://gitea.chorus.services/tony/chorus-dev-images/issues
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2025 CHORUS Services. All rights reserved.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- **Source:** https://gitea.chorus.services/tony/chorus-dev-images
|
||||||
|
- **Registry:** registry.home.deepblack.cloud/chorus
|
||||||
|
- **Documentation:** [docs/](docs/)
|
||||||
|
- **Main Project:** https://gitea.chorus.services/tony/CHORUS
|
||||||
317
docs/MAINTENANCE.md
Normal file
317
docs/MAINTENANCE.md
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
# CHORUS Development Images - Maintenance Guide
|
||||||
|
|
||||||
|
## Version Management
|
||||||
|
|
||||||
|
### Semantic Versioning
|
||||||
|
|
||||||
|
We follow [Semantic Versioning 2.0.0](https://semver.org/):
|
||||||
|
|
||||||
|
- **MAJOR** (X.0.0): Breaking changes (base image OS upgrade, removed tools)
|
||||||
|
- **MINOR** (x.Y.0): New features (new tools added, new image variants)
|
||||||
|
- **PATCH** (x.y.Z): Bug fixes, security updates, tool version updates
|
||||||
|
|
||||||
|
### Updating Version
|
||||||
|
|
||||||
|
1. Edit the `VERSION` file:
|
||||||
|
```bash
|
||||||
|
echo "1.1.0" > VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Commit the change:
|
||||||
|
```bash
|
||||||
|
git add VERSION
|
||||||
|
git commit -m "Bump version to 1.1.0"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Automated build will create images tagged with new version
|
||||||
|
|
||||||
|
## Updating Base Image
|
||||||
|
|
||||||
|
### Debian Version Update
|
||||||
|
|
||||||
|
When a new Debian stable release is available:
|
||||||
|
|
||||||
|
1. Update `ARG DEBIAN_VERSION` in `images/base/Dockerfile`:
|
||||||
|
```dockerfile
|
||||||
|
ARG DEBIAN_VERSION=bookworm-20240615 # Update date suffix
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Test all images:
|
||||||
|
```bash
|
||||||
|
make build-all
|
||||||
|
make test-all
|
||||||
|
```
|
||||||
|
|
||||||
|
3. If tests pass, increment MAJOR version
|
||||||
|
|
||||||
|
## Updating Language Toolchains
|
||||||
|
|
||||||
|
### Go Version Update
|
||||||
|
|
||||||
|
1. Check latest Go version: https://go.dev/dl/
|
||||||
|
|
||||||
|
2. Update `ARG GO_VERSION` in Dockerfile:
|
||||||
|
```dockerfile
|
||||||
|
ARG GO_VERSION=1.23.0 # Update version
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Build and test:
|
||||||
|
```bash
|
||||||
|
make build-go
|
||||||
|
make test-go
|
||||||
|
```
|
||||||
|
|
||||||
|
### Node.js Version Update
|
||||||
|
|
||||||
|
1. Check LTS versions: https://nodejs.org/
|
||||||
|
|
||||||
|
2. Update `ARG NODE_VERSION` in Dockerfile:
|
||||||
|
```dockerfile
|
||||||
|
ARG NODE_VERSION=22 # Update to new LTS
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Build and test:
|
||||||
|
```bash
|
||||||
|
make build-node
|
||||||
|
make test-node
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rust Toolchain Update
|
||||||
|
|
||||||
|
Rust auto-updates to stable via rustup. To pin a specific version:
|
||||||
|
|
||||||
|
1. Modify Dockerfile rust-dev stage:
|
||||||
|
```dockerfile
|
||||||
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
|
||||||
|
--default-toolchain 1.78.0 \ # Pin version
|
||||||
|
--profile default \
|
||||||
|
--no-modify-path
|
||||||
|
```
|
||||||
|
|
||||||
|
### Python Version Update
|
||||||
|
|
||||||
|
1. Check available versions: `apt-cache search python3.`
|
||||||
|
|
||||||
|
2. Update Dockerfile:
|
||||||
|
```dockerfile
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
python3.12 \ # Update version
|
||||||
|
python3.12-dev \ # Update version
|
||||||
|
python3-pip \
|
||||||
|
python3-venv
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding New Tools
|
||||||
|
|
||||||
|
### Adding Tool to Existing Image
|
||||||
|
|
||||||
|
1. Edit `images/base/Dockerfile` in appropriate stage
|
||||||
|
2. Add installation command
|
||||||
|
3. Update README.md with new tool
|
||||||
|
4. Add test for new tool in `tests/test-<image>.sh`
|
||||||
|
5. Increment MINOR version
|
||||||
|
|
||||||
|
Example - Adding `tokei` to Rust image:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# In rust-dev stage
|
||||||
|
RUN cargo install \
|
||||||
|
cargo-edit \
|
||||||
|
cargo-audit \
|
||||||
|
tokei \ # New tool
|
||||||
|
&& rm -rf /home/chorus/.cargo/registry/cache
|
||||||
|
```
|
||||||
|
|
||||||
|
Add test:
|
||||||
|
```bash
|
||||||
|
# In tests/test-rust-dev.sh
|
||||||
|
docker run --rm "$IMAGE" which tokei > /dev/null || exit 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating New Language Image
|
||||||
|
|
||||||
|
1. Add new stage to `images/base/Dockerfile`:
|
||||||
|
```dockerfile
|
||||||
|
FROM base AS ruby-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
ruby-full \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
RUN gem install bundler
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Ruby Development Image"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Create test script `tests/test-ruby-dev.sh`
|
||||||
|
|
||||||
|
3. Add build target to `Makefile`
|
||||||
|
|
||||||
|
4. Add to CI workflow `.gitea/workflows/build-and-push.yml`
|
||||||
|
|
||||||
|
5. Update README.md with new image
|
||||||
|
|
||||||
|
## Security Updates
|
||||||
|
|
||||||
|
### Weekly Automated Rebuild
|
||||||
|
|
||||||
|
Images automatically rebuild weekly (Mondays 2 AM UTC) to pull latest security updates.
|
||||||
|
|
||||||
|
### Manual Security Update
|
||||||
|
|
||||||
|
For critical CVEs:
|
||||||
|
|
||||||
|
1. Trigger manual rebuild:
|
||||||
|
- Go to: https://gitea.chorus.services/tony/chorus-dev-images/actions
|
||||||
|
- Click "Build and Push Development Images"
|
||||||
|
- Click "Run workflow"
|
||||||
|
- Check "Force rebuild all images"
|
||||||
|
|
||||||
|
2. Monitor build progress
|
||||||
|
|
||||||
|
3. Increment PATCH version after successful build
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Local Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test all images
|
||||||
|
make test-all
|
||||||
|
|
||||||
|
# Test specific image
|
||||||
|
make test-rust
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding New Tests
|
||||||
|
|
||||||
|
Add assertions to appropriate test script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# tests/test-rust-dev.sh
|
||||||
|
echo " ✓ Checking new feature..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
# Test commands here
|
||||||
|
rustc --version | grep -q "1.77"
|
||||||
|
' || exit 1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Registry Management
|
||||||
|
|
||||||
|
### Cleaning Old Tags
|
||||||
|
|
||||||
|
Periodically remove old version tags to save space:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# List all tags for an image
|
||||||
|
curl -u username:password \
|
||||||
|
https://registry.home.deepblack.cloud/v2/chorus/rust-dev/tags/list
|
||||||
|
|
||||||
|
# Delete specific tag (requires registry API v2)
|
||||||
|
curl -X DELETE -u username:password \
|
||||||
|
https://registry.home.deepblack.cloud/v2/chorus/rust-dev/manifests/<digest>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Checking Image Sizes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Local sizes
|
||||||
|
docker images | grep chorus
|
||||||
|
|
||||||
|
# Registry sizes (requires access to registry)
|
||||||
|
docker manifest inspect registry.home.deepblack.cloud/chorus/rust-dev:latest | \
|
||||||
|
jq -r '.layers[].size' | awk '{s+=$1} END {print s/1024/1024 " MB"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Optimization
|
||||||
|
|
||||||
|
### Layer Caching
|
||||||
|
|
||||||
|
Ensure frequently changing operations are at the end:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# ✅ Good - static dependencies first
|
||||||
|
RUN apt-get update && apt-get install -y build-essential
|
||||||
|
RUN cargo install cargo-edit # Changes infrequently
|
||||||
|
|
||||||
|
# ❌ Bad - changing operation first
|
||||||
|
COPY requirements.txt /tmp/
|
||||||
|
RUN pip install -r /tmp/requirements.txt
|
||||||
|
RUN apt-get update # Should be before pip
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-Stage Build Size
|
||||||
|
|
||||||
|
Check base layer is shared:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.ID}}" | grep chorus
|
||||||
|
```
|
||||||
|
|
||||||
|
All images should share the same base layer ID.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Build Fails
|
||||||
|
|
||||||
|
1. Check Docker build logs
|
||||||
|
2. Verify external dependencies (Go downloads, npm registry)
|
||||||
|
3. Test locally: `make build-<image>`
|
||||||
|
4. Check network connectivity
|
||||||
|
|
||||||
|
### Test Fails
|
||||||
|
|
||||||
|
1. Run test manually: `bash tests/test-<image>.sh`
|
||||||
|
2. Check tool availability in container
|
||||||
|
3. Verify tool versions
|
||||||
|
4. Check for breaking changes in tool updates
|
||||||
|
|
||||||
|
### CI/CD Issues
|
||||||
|
|
||||||
|
1. Check Gitea Actions logs
|
||||||
|
2. Verify registry credentials (secrets)
|
||||||
|
3. Check Docker buildx support
|
||||||
|
4. Verify network access to registry
|
||||||
|
|
||||||
|
## Release Checklist
|
||||||
|
|
||||||
|
Before releasing new version:
|
||||||
|
|
||||||
|
- [ ] All tests pass locally (`make test-all`)
|
||||||
|
- [ ] README.md updated with new features/changes
|
||||||
|
- [ ] USAGE.md updated if usage patterns changed
|
||||||
|
- [ ] VERSION file updated
|
||||||
|
- [ ] Git tag created: `git tag v1.x.x && git push --tags`
|
||||||
|
- [ ] Registry contains new version tags
|
||||||
|
- [ ] CHANGELOG.md updated (if exists)
|
||||||
|
- [ ] CHORUS engine updated to use new images (if needed)
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
### Build Status
|
||||||
|
|
||||||
|
Check automated builds: https://gitea.chorus.services/tony/chorus-dev-images/actions
|
||||||
|
|
||||||
|
### Registry Health
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check registry is accessible
|
||||||
|
curl -u username:password \
|
||||||
|
https://registry.home.deepblack.cloud/v2/_catalog
|
||||||
|
|
||||||
|
# Check image is pullable
|
||||||
|
docker pull registry.home.deepblack.cloud/chorus/base:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage Metrics
|
||||||
|
|
||||||
|
Track which images are most pulled (requires registry logging):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check registry logs
|
||||||
|
docker service logs registry_registry | grep "GET /v2/chorus" | \
|
||||||
|
awk '{print $10}' | sort | uniq -c | sort -rn
|
||||||
|
```
|
||||||
297
docs/USAGE.md
Normal file
297
docs/USAGE.md
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
# CHORUS Development Images - Usage Guide
|
||||||
|
|
||||||
|
## Basic Usage Patterns
|
||||||
|
|
||||||
|
### Pattern 1: Interactive Development
|
||||||
|
|
||||||
|
Use when you need to explore a codebase or debug interactively:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start interactive shell in Rust environment
|
||||||
|
docker run -it --rm \
|
||||||
|
-v /path/to/repository:/workspace/input \
|
||||||
|
-v /path/to/output:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Inside the container:
|
||||||
|
```bash
|
||||||
|
cd /workspace/input
|
||||||
|
cargo build
|
||||||
|
cargo test
|
||||||
|
# Copy results to output
|
||||||
|
cp target/release/binary /workspace/output/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern 2: Single Command Execution
|
||||||
|
|
||||||
|
Use for automated agent tasks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build Rust project
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/output:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build --release && cp target/release/* /workspace/output/"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern 3: Multi-Step Workflow
|
||||||
|
|
||||||
|
Use for complex build pipelines:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/output:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/python-dev:latest \
|
||||||
|
bash -c "
|
||||||
|
cd /workspace/input
|
||||||
|
uv sync
|
||||||
|
uv run pytest
|
||||||
|
uv run ruff check
|
||||||
|
uv run mypy .
|
||||||
|
cp -r dist/* /workspace/output/
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Language-Specific Examples
|
||||||
|
|
||||||
|
### Rust
|
||||||
|
|
||||||
|
**Build and Test:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build && cargo test"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Format and Lint:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo fmt && cargo clippy -- -D warnings"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
**Build Binary:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/bin:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/go-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && go build -o /workspace/output/app"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Run Tests:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/go-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && go test ./..."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Python
|
||||||
|
|
||||||
|
**Install Dependencies and Test:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/python-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && uv sync && uv run pytest"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Lint and Type Check:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/python-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && ruff check . && mypy ."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Node.js
|
||||||
|
|
||||||
|
**Install and Build:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/dist:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/node-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && npm install && npm run build && cp -r dist/* /workspace/output/"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Run Tests:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/node-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && npm install && npm test"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Java
|
||||||
|
|
||||||
|
**Maven Build:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/target:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/java-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && mvn clean package && cp target/*.jar /workspace/output/"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Gradle Build:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/build:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/java-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && gradle build && cp build/libs/*.jar /workspace/output/"
|
||||||
|
```
|
||||||
|
|
||||||
|
### C/C++
|
||||||
|
|
||||||
|
**CMake Build:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v $(pwd)/build:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/cpp-dev:latest \
|
||||||
|
bash -c "
|
||||||
|
cd /workspace/data
|
||||||
|
cmake /workspace/input
|
||||||
|
make
|
||||||
|
cp bin/* /workspace/output/
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Preserving Build Cache
|
||||||
|
|
||||||
|
Mount a volume for package caches to speed up subsequent builds:
|
||||||
|
|
||||||
|
**Rust:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v cargo-cache:/home/chorus/.cargo/registry \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Python:**
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-v pip-cache:/home/chorus/.cache/pip \
|
||||||
|
registry.home.deepblack.cloud/chorus/python-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && pip install -r requirements.txt"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setting Environment Variables
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
-e DATABASE_URL=postgres://localhost/db \
|
||||||
|
-e API_KEY=secret \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo test"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Limits
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
--memory="2g" \
|
||||||
|
--cpus="2.0" \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build --release"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Network Access Control
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# No network access
|
||||||
|
docker run --rm --network=none \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build --offline"
|
||||||
|
|
||||||
|
# Custom network
|
||||||
|
docker run --rm --network=my-network \
|
||||||
|
-v $(pwd):/workspace/input:ro \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo test"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Permission Issues
|
||||||
|
|
||||||
|
If you encounter permission errors with output files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run with matching UID
|
||||||
|
docker run --rm \
|
||||||
|
--user $(id -u):$(id -g) \
|
||||||
|
-v $(pwd):/workspace/input \
|
||||||
|
-v $(pwd)/output:/workspace/output \
|
||||||
|
registry.home.deepblack.cloud/chorus/rust-dev:latest \
|
||||||
|
bash -c "cd /workspace/input && cargo build"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Image Not Found
|
||||||
|
|
||||||
|
Ensure you're logged into the registry:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker login registry.home.deepblack.cloud
|
||||||
|
```
|
||||||
|
|
||||||
|
### Out of Disk Space
|
||||||
|
|
||||||
|
Clean up old images and build cache:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker system prune -a
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Use Read-Only Input**: Mount source code as read-only (`:ro`) to prevent accidental modifications
|
||||||
|
2. **Separate Output**: Use dedicated output directory for build artifacts
|
||||||
|
3. **Cache Dependencies**: Mount package cache volumes for faster rebuilds
|
||||||
|
4. **Limit Resources**: Set memory and CPU limits for production use
|
||||||
|
5. **Version Pin**: Use specific version tags (e.g., `1.0.0`) in production, not `latest`
|
||||||
|
|
||||||
|
## Integration with CI/CD
|
||||||
|
|
||||||
|
### Example GitLab CI
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
test:
|
||||||
|
image: registry.home.deepblack.cloud/chorus/rust-dev:1.0.0
|
||||||
|
script:
|
||||||
|
- cargo test
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- target/release/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example GitHub Actions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: registry.home.deepblack.cloud/chorus/rust-dev:1.0.0
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: cargo test
|
||||||
|
```
|
||||||
306
images/base/Dockerfile
Normal file
306
images/base/Dockerfile
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
# =======================
|
||||||
|
# CHORUS Development Images
|
||||||
|
# =======================
|
||||||
|
# Multi-stage Dockerfile for language-specific development environments
|
||||||
|
# Maintained by CHORUS Services (https://chorus.services)
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Base Image
|
||||||
|
# =======================
|
||||||
|
ARG DEBIAN_VERSION=bookworm-20240408
|
||||||
|
FROM debian:${DEBIAN_VERSION} AS base
|
||||||
|
|
||||||
|
# Metadata
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Base Development Image"
|
||||||
|
LABEL org.opencontainers.image.description="Base image for CHORUS autonomous agent development environments"
|
||||||
|
LABEL org.opencontainers.image.vendor="CHORUS Services"
|
||||||
|
LABEL org.opencontainers.image.source="https://gitea.chorus.services/tony/chorus-dev-images"
|
||||||
|
LABEL org.opencontainers.image.documentation="https://gitea.chorus.services/tony/chorus-dev-images/src/branch/main/README.md"
|
||||||
|
|
||||||
|
# Environment configuration
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
|
LANG=C.UTF-8 \
|
||||||
|
LC_ALL=C.UTF-8 \
|
||||||
|
TZ=UTC \
|
||||||
|
WORKSPACE_ROOT=/workspace \
|
||||||
|
WORKSPACE_INPUT=/workspace/input \
|
||||||
|
WORKSPACE_DATA=/workspace/data \
|
||||||
|
WORKSPACE_OUTPUT=/workspace/output
|
||||||
|
|
||||||
|
# Install base system packages
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
# Core utilities
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
git \
|
||||||
|
vim \
|
||||||
|
nano \
|
||||||
|
less \
|
||||||
|
jq \
|
||||||
|
# Build essentials
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
# Network tools
|
||||||
|
netcat-traditional \
|
||||||
|
iputils-ping \
|
||||||
|
dnsutils \
|
||||||
|
# Process tools
|
||||||
|
procps \
|
||||||
|
htop \
|
||||||
|
# Compression
|
||||||
|
zip \
|
||||||
|
unzip \
|
||||||
|
tar \
|
||||||
|
gzip \
|
||||||
|
bzip2 \
|
||||||
|
xz-utils \
|
||||||
|
# SSL/TLS
|
||||||
|
openssl \
|
||||||
|
# Version control
|
||||||
|
git-lfs \
|
||||||
|
# Documentation
|
||||||
|
man-db \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Create standardized workspace structure
|
||||||
|
RUN mkdir -p \
|
||||||
|
${WORKSPACE_INPUT} \
|
||||||
|
${WORKSPACE_DATA} \
|
||||||
|
${WORKSPACE_OUTPUT} \
|
||||||
|
&& chmod -R 755 ${WORKSPACE_ROOT}
|
||||||
|
|
||||||
|
# Create non-root user for development
|
||||||
|
RUN useradd -m -s /bin/bash -u 1000 chorus && \
|
||||||
|
chown -R chorus:chorus ${WORKSPACE_ROOT}
|
||||||
|
|
||||||
|
# Add workspace helper scripts
|
||||||
|
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
|
||||||
|
RUN chmod +x /usr/local/bin/entrypoint.sh
|
||||||
|
|
||||||
|
WORKDIR ${WORKSPACE_DATA}
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
||||||
|
CMD ["/bin/bash"]
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Rust Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS rust-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install Rust-specific system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
# Rust compilation dependencies
|
||||||
|
libssl-dev \
|
||||||
|
libc6-dev \
|
||||||
|
# Database client libraries (common in Rust projects)
|
||||||
|
libpq-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
# Additional build tools
|
||||||
|
cmake \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
# Install Rust toolchain
|
||||||
|
ENV RUSTUP_HOME=/home/chorus/.rustup \
|
||||||
|
CARGO_HOME=/home/chorus/.cargo \
|
||||||
|
PATH=/home/chorus/.cargo/bin:$PATH
|
||||||
|
|
||||||
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
|
||||||
|
--default-toolchain stable \
|
||||||
|
--profile default \
|
||||||
|
--no-modify-path
|
||||||
|
|
||||||
|
# Install common Rust development tools
|
||||||
|
RUN cargo install \
|
||||||
|
cargo-edit \
|
||||||
|
cargo-audit \
|
||||||
|
cargo-watch \
|
||||||
|
cargo-expand \
|
||||||
|
cargo-outdated \
|
||||||
|
ripgrep \
|
||||||
|
fd-find \
|
||||||
|
bat \
|
||||||
|
&& rm -rf /home/chorus/.cargo/registry/cache
|
||||||
|
|
||||||
|
# Configure Rust toolchain
|
||||||
|
RUN rustup component add \
|
||||||
|
rustfmt \
|
||||||
|
clippy \
|
||||||
|
rust-analyzer
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Rust Development Image"
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Go Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS go-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
ARG GO_VERSION=1.22.2
|
||||||
|
|
||||||
|
# Install Go
|
||||||
|
RUN wget -O go.tar.gz "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" && \
|
||||||
|
tar -C /usr/local -xzf go.tar.gz && \
|
||||||
|
rm go.tar.gz
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
ENV GOROOT=/usr/local/go \
|
||||||
|
GOPATH=/home/chorus/go \
|
||||||
|
PATH=/usr/local/go/bin:/home/chorus/go/bin:$PATH
|
||||||
|
|
||||||
|
# Install common Go development tools
|
||||||
|
RUN go install golang.org/x/tools/gopls@latest && \
|
||||||
|
go install github.com/go-delve/delve/cmd/dlv@latest && \
|
||||||
|
go install honnef.co/go/tools/cmd/staticcheck@latest && \
|
||||||
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest && \
|
||||||
|
go clean -cache -modcache
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Go Development Image"
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Python Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS python-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install Python and development headers
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
python3.11 \
|
||||||
|
python3.11-dev \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
# Python build dependencies
|
||||||
|
libffi-dev \
|
||||||
|
libssl-dev \
|
||||||
|
# Data science dependencies
|
||||||
|
libxml2-dev \
|
||||||
|
libxslt1-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
# Install modern Python tooling
|
||||||
|
ENV PATH=/home/chorus/.local/bin:$PATH
|
||||||
|
|
||||||
|
RUN pip3 install --no-cache-dir --user \
|
||||||
|
# Package management
|
||||||
|
uv \
|
||||||
|
pip-tools \
|
||||||
|
# Code quality
|
||||||
|
ruff \
|
||||||
|
black \
|
||||||
|
mypy \
|
||||||
|
pylint \
|
||||||
|
# Testing
|
||||||
|
pytest \
|
||||||
|
pytest-cov \
|
||||||
|
pytest-asyncio \
|
||||||
|
# Development tools
|
||||||
|
ipython \
|
||||||
|
# Documentation
|
||||||
|
sphinx \
|
||||||
|
mkdocs
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Python Development Image"
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Node.js Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS node-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
ARG NODE_VERSION=20
|
||||||
|
|
||||||
|
# Install Node.js from NodeSource
|
||||||
|
RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - && \
|
||||||
|
apt-get install -y --no-install-recommends nodejs && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
# Install global development tools
|
||||||
|
RUN npm install -g \
|
||||||
|
pnpm \
|
||||||
|
yarn \
|
||||||
|
typescript \
|
||||||
|
ts-node \
|
||||||
|
eslint \
|
||||||
|
prettier \
|
||||||
|
nodemon \
|
||||||
|
pm2 \
|
||||||
|
&& npm cache clean --force
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Node.js Development Image"
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Java Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS java-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install OpenJDK, Maven, and Gradle
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
openjdk-17-jdk \
|
||||||
|
maven \
|
||||||
|
gradle \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 \
|
||||||
|
MAVEN_HOME=/usr/share/maven \
|
||||||
|
GRADLE_HOME=/usr/share/gradle \
|
||||||
|
PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
|
||||||
|
|
||||||
|
# Pre-create Maven local repository
|
||||||
|
RUN mkdir -p /home/chorus/.m2 && \
|
||||||
|
echo '<?xml version="1.0" encoding="UTF-8"?>\n\
|
||||||
|
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"\n\
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n\
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0\n\
|
||||||
|
http://maven.apache.org/xsd/settings-1.0.0.xsd">\n\
|
||||||
|
</settings>' > /home/chorus/.m2/settings.xml
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS Java Development Image"
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# C/C++ Development Image
|
||||||
|
# =======================
|
||||||
|
FROM base AS cpp-dev
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install C/C++ compilers and build systems
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
# Compilers
|
||||||
|
gcc \
|
||||||
|
g++ \
|
||||||
|
clang \
|
||||||
|
# Build systems
|
||||||
|
cmake \
|
||||||
|
ninja-build \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
libtool \
|
||||||
|
# Development libraries
|
||||||
|
libboost-all-dev \
|
||||||
|
# Debugging tools
|
||||||
|
gdb \
|
||||||
|
valgrind \
|
||||||
|
# Documentation
|
||||||
|
doxygen \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
USER chorus
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="CHORUS C/C++ Development Image"
|
||||||
27
images/base/entrypoint.sh
Normal file
27
images/base/entrypoint.sh
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# CHORUS Development Environment Entrypoint
|
||||||
|
# Provides standardized initialization for development containers
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Display workspace structure on first run
|
||||||
|
if [ ! -f "${WORKSPACE_DATA}/.chorus-initialized" ]; then
|
||||||
|
cat << "EOF"
|
||||||
|
╔════════════════════════════════════════════════════════════════╗
|
||||||
|
║ CHORUS Development Environment ║
|
||||||
|
╚════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
|
Workspace Structure:
|
||||||
|
📂 /workspace/
|
||||||
|
├── input/ - Task requirements, repository checkout
|
||||||
|
├── data/ - Working directory, build artifacts
|
||||||
|
└── output/ - Deliverables, patches, reports
|
||||||
|
|
||||||
|
Current Directory: /workspace/data
|
||||||
|
|
||||||
|
EOF
|
||||||
|
touch "${WORKSPACE_DATA}/.chorus-initialized"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute provided command or shell
|
||||||
|
exec "$@"
|
||||||
35
tests/test-base.sh
Normal file
35
tests/test-base.sh
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for base image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/base:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing base image: $IMAGE"
|
||||||
|
|
||||||
|
# Test workspace structure
|
||||||
|
echo " ✓ Checking workspace directories..."
|
||||||
|
docker run --rm "$IMAGE" test -d /workspace/input || exit 1
|
||||||
|
docker run --rm "$IMAGE" test -d /workspace/data || exit 1
|
||||||
|
docker run --rm "$IMAGE" test -d /workspace/output || exit 1
|
||||||
|
|
||||||
|
# Test core utilities
|
||||||
|
echo " ✓ Checking core utilities..."
|
||||||
|
docker run --rm "$IMAGE" git --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" curl --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which vim > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which jq > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test user permissions
|
||||||
|
echo " ✓ Checking user permissions..."
|
||||||
|
docker run --rm "$IMAGE" whoami | grep -q chorus || exit 1
|
||||||
|
docker run --rm "$IMAGE" sh -c 'echo "test" > /workspace/data/test.txt && rm /workspace/data/test.txt' || exit 1
|
||||||
|
|
||||||
|
# Test environment variables
|
||||||
|
echo " ✓ Checking environment variables..."
|
||||||
|
docker run --rm "$IMAGE" sh -c 'test -n "$WORKSPACE_ROOT"' || exit 1
|
||||||
|
docker run --rm "$IMAGE" sh -c 'test -n "$WORKSPACE_INPUT"' || exit 1
|
||||||
|
docker run --rm "$IMAGE" sh -c 'test -n "$WORKSPACE_DATA"' || exit 1
|
||||||
|
docker run --rm "$IMAGE" sh -c 'test -n "$WORKSPACE_OUTPUT"' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Base image tests passed"
|
||||||
30
tests/test-cpp-dev.sh
Normal file
30
tests/test-cpp-dev.sh
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for C/C++ development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/cpp-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing C/C++ image: $IMAGE"
|
||||||
|
|
||||||
|
# Test C/C++ toolchain
|
||||||
|
echo " ✓ Checking C/C++ toolchain..."
|
||||||
|
docker run --rm "$IMAGE" gcc --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" g++ --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" clang --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test build systems
|
||||||
|
echo " ✓ Checking build tools..."
|
||||||
|
docker run --rm "$IMAGE" cmake --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" ninja --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test compilation capability
|
||||||
|
echo " ✓ Testing C++ compilation..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
echo "#include <iostream>\nint main() { std::cout << \"hello\" << std::endl; return 0; }" > test.cpp && \
|
||||||
|
g++ -o test test.cpp && \
|
||||||
|
./test
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ C/C++ image tests passed"
|
||||||
31
tests/test-go-dev.sh
Normal file
31
tests/test-go-dev.sh
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for Go development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/go-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing Go image: $IMAGE"
|
||||||
|
|
||||||
|
# Test Go toolchain
|
||||||
|
echo " ✓ Checking Go toolchain..."
|
||||||
|
docker run --rm "$IMAGE" go version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test development tools
|
||||||
|
echo " ✓ Checking Go tools..."
|
||||||
|
docker run --rm "$IMAGE" which gopls > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which dlv > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which staticcheck > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test build capability
|
||||||
|
echo " ✓ Testing Go build..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
mkdir test-project && cd test-project && \
|
||||||
|
echo "package main\nimport \"fmt\"\nfunc main() { fmt.Println(\"hello\") }" > main.go && \
|
||||||
|
go mod init test && \
|
||||||
|
go build && \
|
||||||
|
./test
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Go image tests passed"
|
||||||
26
tests/test-java-dev.sh
Normal file
26
tests/test-java-dev.sh
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for Java development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/java-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing Java image: $IMAGE"
|
||||||
|
|
||||||
|
# Test Java toolchain
|
||||||
|
echo " ✓ Checking Java toolchain..."
|
||||||
|
docker run --rm "$IMAGE" java -version 2>&1 | grep -q "openjdk" || exit 1
|
||||||
|
docker run --rm "$IMAGE" javac -version > /dev/null 2>&1 || exit 1
|
||||||
|
docker run --rm "$IMAGE" mvn --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" gradle --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test build capability
|
||||||
|
echo " ✓ Testing Java compilation..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
echo "public class HelloWorld { public static void main(String[] args) { System.out.println(\"hello\"); }}" > HelloWorld.java && \
|
||||||
|
javac HelloWorld.java && \
|
||||||
|
java HelloWorld
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Java image tests passed"
|
||||||
36
tests/test-node-dev.sh
Normal file
36
tests/test-node-dev.sh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for Node.js development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/node-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing Node.js image: $IMAGE"
|
||||||
|
|
||||||
|
# Test Node.js toolchain
|
||||||
|
echo " ✓ Checking Node.js toolchain..."
|
||||||
|
docker run --rm "$IMAGE" node --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" npm --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test development tools
|
||||||
|
echo " ✓ Checking Node.js tools..."
|
||||||
|
docker run --rm "$IMAGE" which pnpm > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which yarn > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which tsc > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which eslint > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which prettier > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test execution capability
|
||||||
|
echo " ✓ Testing Node.js execution..."
|
||||||
|
docker run --rm "$IMAGE" node -e "console.log('hello')" || exit 1
|
||||||
|
|
||||||
|
# Test package installation
|
||||||
|
echo " ✓ Testing npm install..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
npm init -y --quiet && \
|
||||||
|
npm install lodash --silent && \
|
||||||
|
node -e "const _ = require(\"lodash\"); console.log(_.VERSION)"
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Node.js image tests passed"
|
||||||
36
tests/test-python-dev.sh
Normal file
36
tests/test-python-dev.sh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for Python development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/python-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing Python image: $IMAGE"
|
||||||
|
|
||||||
|
# Test Python toolchain
|
||||||
|
echo " ✓ Checking Python toolchain..."
|
||||||
|
docker run --rm "$IMAGE" python3 --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" pip3 --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test development tools
|
||||||
|
echo " ✓ Checking Python tools..."
|
||||||
|
docker run --rm "$IMAGE" which uv > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which ruff > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which black > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which pytest > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which mypy > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test execution capability
|
||||||
|
echo " ✓ Testing Python execution..."
|
||||||
|
docker run --rm "$IMAGE" python3 -c "print('hello')" || exit 1
|
||||||
|
|
||||||
|
# Test package installation
|
||||||
|
echo " ✓ Testing pip install..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
echo "requests" > requirements.txt && \
|
||||||
|
pip3 install --user -r requirements.txt --quiet && \
|
||||||
|
python3 -c "import requests; print(requests.__version__)"
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Python image tests passed"
|
||||||
32
tests/test-rust-dev.sh
Normal file
32
tests/test-rust-dev.sh
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test script for Rust development image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE="${REGISTRY:-registry.home.deepblack.cloud/chorus}/rust-dev:latest"
|
||||||
|
|
||||||
|
echo "🧪 Testing Rust image: $IMAGE"
|
||||||
|
|
||||||
|
# Test Rust toolchain
|
||||||
|
echo " ✓ Checking Rust toolchain..."
|
||||||
|
docker run --rm "$IMAGE" rustc --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" cargo --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" rustfmt --version > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" cargo clippy --version > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test development tools
|
||||||
|
echo " ✓ Checking Rust tools..."
|
||||||
|
docker run --rm "$IMAGE" which ripgrep > /dev/null || exit 1
|
||||||
|
docker run --rm "$IMAGE" which fd > /dev/null || exit 1
|
||||||
|
|
||||||
|
# Test build capability
|
||||||
|
echo " ✓ Testing Rust build..."
|
||||||
|
docker run --rm "$IMAGE" bash -c '
|
||||||
|
cd /tmp && \
|
||||||
|
cargo init --name test-project --quiet && \
|
||||||
|
cd test-project && \
|
||||||
|
cargo build --release --quiet && \
|
||||||
|
./target/release/test-project
|
||||||
|
' || exit 1
|
||||||
|
|
||||||
|
echo "✅ Rust image tests passed"
|
||||||
Reference in New Issue
Block a user