feat(cloudron): update CloudronStack configuration and assets
- Add new PROMPT file in collab directory for AI collaboration guidance - Add STATUS.md file in collab directory to track current status - Create output directory for project artifacts - Remove redundant commit-template.txt that is now centralized at top level - Update collab directory structure and content for better organization These changes improve the CloudronStack component's structure and documentation for better collaboration.
This commit is contained in:
367
CloudronStack/output/package-functions.sh
Normal file
367
CloudronStack/output/package-functions.sh
Normal file
@@ -0,0 +1,367 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Function library for Cloudron packaging
|
||||
# Contains specific packaging functions for different application types
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Function to package generic Node.js application
|
||||
package_nodejs_app() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Create Cloudron manifest
|
||||
cat > app.manifest << EOF
|
||||
{
|
||||
"id": "com.$(echo "$app_name" | sed 's/[^a-zA-Z0-9]/./g').cloudron",
|
||||
"title": "$app_name",
|
||||
"version": "1.0.0",
|
||||
"build": "1",
|
||||
"description": "Cloudron package for $app_name",
|
||||
"author": "Auto-generated",
|
||||
"website": "https://github.com/$app_name",
|
||||
"admin": false,
|
||||
"tags": ["nodejs", "auto-generated"],
|
||||
"logo": "https://github.com/fluidicon.png",
|
||||
"documentation": "https://github.com/$app_name",
|
||||
"changelog": "Initial packaging"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create Dockerfile for Node.js
|
||||
cat > Dockerfile << EOF
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm install --only=production
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["npm", "start"]
|
||||
EOF
|
||||
|
||||
# Build Docker image
|
||||
local docker_image="tsysdevstack-cloudron-buildtest-${app_name//[^a-zA-Z0-9]/-}:latest"
|
||||
if ! docker build -t "$docker_image" .; then
|
||||
echo "Failed to build Docker image for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Perform smoke test on the Docker image
|
||||
if ! smoke_test_docker_image "$docker_image" "$app_name"; then
|
||||
echo "Smoke test failed for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Save the Docker image as an artifact
|
||||
docker save "$docker_image" | gzip > "$artifact_dir/${app_name//[^a-zA-Z0-9]/-}.tar.gz"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to package generic Python application
|
||||
package_python_app() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Create Cloudron manifest
|
||||
cat > app.manifest << EOF
|
||||
{
|
||||
"id": "com.$(echo "$app_name" | sed 's/[^a-zA-Z0-9]/./g').cloudron",
|
||||
"title": "$app_name",
|
||||
"version": "1.0.0",
|
||||
"build": "1",
|
||||
"description": "Cloudron package for $app_name",
|
||||
"author": "Auto-generated",
|
||||
"website": "https://github.com/$app_name",
|
||||
"admin": false,
|
||||
"tags": ["python", "auto-generated"],
|
||||
"logo": "https://github.com/fluidicon.png",
|
||||
"documentation": "https://github.com/$app_name",
|
||||
"changelog": "Initial packaging"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create Dockerfile for Python
|
||||
cat > Dockerfile << EOF
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
EOF
|
||||
|
||||
# Build Docker image
|
||||
local docker_image="tsysdevstack-cloudron-buildtest-${app_name//[^a-zA-Z0-9]/-}:latest"
|
||||
if ! docker build -t "$docker_image" .; then
|
||||
echo "Failed to build Docker image for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Perform smoke test on the Docker image
|
||||
if ! smoke_test_docker_image "$docker_image" "$app_name"; then
|
||||
echo "Smoke test failed for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Save the Docker image as an artifact
|
||||
docker save "$docker_image" | gzip > "$artifact_dir/${app_name//[^a-zA-Z0-9]/-}.tar.gz"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to package generic PHP application
|
||||
package_php_app() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Create Cloudron manifest
|
||||
cat > app.manifest << EOF
|
||||
{
|
||||
"id": "com.$(echo "$app_name" | sed 's/[^a-zA-Z0-9]/./g').cloudron",
|
||||
"title": "$app_name",
|
||||
"version": "1.0.0",
|
||||
"build": "1",
|
||||
"description": "Cloudron package for $app_name",
|
||||
"author": "Auto-generated",
|
||||
"website": "https://github.com/$app_name",
|
||||
"admin": false,
|
||||
"tags": ["php", "auto-generated"],
|
||||
"logo": "https://github.com/fluidicon.png",
|
||||
"documentation": "https://github.com/$app_name",
|
||||
"changelog": "Initial packaging"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create Dockerfile for PHP
|
||||
cat > Dockerfile << EOF
|
||||
FROM php:8.1-apache
|
||||
|
||||
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
|
||||
|
||||
COPY . /var/www/html/
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["apache2-foreground"]
|
||||
EOF
|
||||
|
||||
# Build Docker image
|
||||
local docker_image="tsysdevstack-cloudron-buildtest-${app_name//[^a-zA-Z0-9]/-}:latest"
|
||||
if ! docker build -t "$docker_image" .; then
|
||||
echo "Failed to build Docker image for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Perform smoke test on the Docker image
|
||||
if ! smoke_test_docker_image "$docker_image" "$app_name"; then
|
||||
echo "Smoke test failed for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Save the Docker image as an artifact
|
||||
docker save "$docker_image" | gzip > "$artifact_dir/${app_name//[^a-zA-Z0-9]/-}.tar.gz"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to package generic Go application
|
||||
package_go_app() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Create Cloudron manifest
|
||||
cat > app.manifest << EOF
|
||||
{
|
||||
"id": "com.$(echo "$app_name" | sed 's/[^a-zA-Z0-9]/./g').cloudron",
|
||||
"title": "$app_name",
|
||||
"version": "1.0.0",
|
||||
"build": "1",
|
||||
"description": "Cloudron package for $app_name",
|
||||
"author": "Auto-generated",
|
||||
"website": "https://github.com/$app_name",
|
||||
"admin": false,
|
||||
"tags": ["go", "auto-generated"],
|
||||
"logo": "https://github.com/fluidicon.png",
|
||||
"documentation": "https://github.com/$app_name",
|
||||
"changelog": "Initial packaging"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create Dockerfile for Go
|
||||
cat > Dockerfile << EOF
|
||||
FROM golang:1.21-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
|
||||
|
||||
FROM alpine:latest
|
||||
RUN apk --no-cache add ca-certificates
|
||||
WORKDIR /root/
|
||||
COPY --from=builder /app/myapp .
|
||||
EXPOSE 8080
|
||||
CMD ["./myapp"]
|
||||
EOF
|
||||
|
||||
# Build Docker image
|
||||
local docker_image="tsysdevstack-cloudron-buildtest-${app_name//[^a-zA-Z0-9]/-}:latest"
|
||||
if ! docker build -t "$docker_image" .; then
|
||||
echo "Failed to build Docker image for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Perform smoke test on the Docker image
|
||||
if ! smoke_test_docker_image "$docker_image" "$app_name"; then
|
||||
echo "Smoke test failed for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Save the Docker image as an artifact
|
||||
docker save "$docker_image" | gzip > "$artifact_dir/${app_name//[^a-zA-Z0-9]/-}.tar.gz"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to perform smoke test on Docker images
|
||||
smoke_test_docker_image() {
|
||||
local docker_image=$1
|
||||
local app_name=$2
|
||||
|
||||
echo "Performing smoke test on $docker_image for $app_name"
|
||||
|
||||
# Run the container briefly to test if it starts correctly
|
||||
local container_name="smoke-test-${app_name//[^a-zA-Z0-9]/-}-$(date +%s)"
|
||||
|
||||
# Try to run the container and check if it starts without immediate failure
|
||||
if docker run -d --name "$container_name" --health-cmd="curl -f http://localhost/ || exit 1" --health-interval=5s --health-timeout=3s --health-retries=3 "$docker_image"; then
|
||||
# Wait a few seconds to see if the container stays running
|
||||
sleep 10
|
||||
|
||||
# Check if the container is still running and healthy
|
||||
if [ "$(docker inspect -f '{{.State.Status}}' "$container_name" 2>/dev/null)" = "running" ]; then
|
||||
echo "Smoke test passed for $app_name"
|
||||
# Stop and remove the test container
|
||||
docker stop "$container_name" > /dev/null 2>&1
|
||||
docker rm "$container_name" > /dev/null 2>&1
|
||||
return 0
|
||||
else
|
||||
echo "Container for $app_name did not stay running during smoke test"
|
||||
# Get logs for debugging
|
||||
docker logs "$container_name" 2>&1 | head -20
|
||||
docker stop "$container_name" > /dev/null 2>&1
|
||||
docker rm "$container_name" > /dev/null 2>&1
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo "Failed to start container for $app_name during smoke test"
|
||||
docker rm "$container_name" > /dev/null 2>&1
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Generic function that detects application type and calls appropriate function
|
||||
detect_and_package() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Detect application type based on files
|
||||
if [ -f "package.json" ]; then
|
||||
echo "Detected Node.js application"
|
||||
package_nodejs_app "$app_name" "$app_dir" "$artifact_dir"
|
||||
elif [ -f "requirements.txt" ] || [ -f "setup.py" ]; then
|
||||
echo "Detected Python application"
|
||||
package_python_app "$app_name" "$app_dir" "$artifact_dir"
|
||||
elif [ -f "composer.json" ]; then
|
||||
echo "Detected PHP application"
|
||||
package_php_app "$app_name" "$app_dir" "$artifact_dir"
|
||||
elif [ -f "go.mod" ] || [ -f "*.go" ]; then
|
||||
echo "Detected Go application"
|
||||
package_go_app "$app_name" "$app_dir" "$artifact_dir"
|
||||
else
|
||||
# Default generic approach
|
||||
echo "Application type not detected, using generic approach"
|
||||
package_generic_app "$app_name" "$app_dir" "$artifact_dir"
|
||||
fi
|
||||
}
|
||||
|
||||
# Generic packaging function for unknown application types
|
||||
package_generic_app() {
|
||||
local app_name=$1
|
||||
local app_dir=$2
|
||||
local artifact_dir=$3
|
||||
|
||||
cd "$app_dir"
|
||||
|
||||
# Create Cloudron manifest
|
||||
cat > app.manifest << EOF
|
||||
{
|
||||
"id": "com.$(echo "$app_name" | sed 's/[^a-zA-Z0-9]/./g').cloudron",
|
||||
"title": "$app_name",
|
||||
"version": "1.0.0",
|
||||
"build": "1",
|
||||
"description": "Cloudron package for $app_name",
|
||||
"author": "Auto-generated",
|
||||
"website": "https://github.com/$app_name",
|
||||
"admin": false,
|
||||
"tags": ["generic", "auto-generated"],
|
||||
"logo": "https://github.com/fluidicon.png",
|
||||
"documentation": "https://github.com/$app_name",
|
||||
"changelog": "Initial packaging"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create a basic Dockerfile
|
||||
cat > Dockerfile << EOF
|
||||
FROM alpine:latest
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN apk add --no-cache bash curl tar
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
CMD ["sh", "-c", "while true; do sleep 30; done"]
|
||||
EOF
|
||||
|
||||
# Build Docker image
|
||||
local docker_image="tsysdevstack-cloudron-buildtest-${app_name//[^a-zA-Z0-9]/-}:latest"
|
||||
if ! docker build -t "$docker_image" .; then
|
||||
echo "Failed to build Docker image for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Perform smoke test on the Docker image
|
||||
if ! smoke_test_docker_image "$docker_image" "$app_name"; then
|
||||
echo "Smoke test failed for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Save the Docker image as an artifact
|
||||
docker save "$docker_image" | gzip > "$artifact_dir/${app_name//[^a-zA-Z0-9]/-}.tar.gz"
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user