resume/build-test-deploy.sh

95 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
set -e
IMAGE_NAME="resume:latest"
CONTAINER_NAME="resume_test_container"
DOCKER_DIR="docker"
RESUME_DIR="$DOCKER_DIR/resume"
# Recalculate SHA256 hash for styles.css and update integrity in index.html
STYLES_HASH=$(shasum -a 256 $RESUME_DIR/styles.css | awk '{print $1}' | xxd -r -p | base64)
sed -i -E "s|href=\"styles.css\" integrity=\"sha256-[^\"]*\"|href=\"styles.css\" integrity=\"sha256-$STYLES_HASH\"|" $RESUME_DIR/index.html
# Verify the hash update
if ! grep -q "integrity=\"sha256-$STYLES_HASH\"" $RESUME_DIR/index.html; then
echo "Error: Integrity hash update failed."
exit 1
fi
# Test the CSS loading
if ! curl -s http://localhost:8080/styles.css > /dev/null; then
echo "Error: CSS file not accessible."
exit 1
fi
# Verify the hash in the container
CONTAINER_HASH=$(docker exec $CONTAINER_NAME cat /srv/styles.css | shasum -a 256 | awk '{print $1}' | xxd -r -p | base64)
if [ "$CONTAINER_HASH" != "$STYLES_HASH" ]; then
echo "Error: Integrity hash mismatch in container."
exit 1
fi
# Build Docker image
cd "$DOCKER_DIR"
echo "Building Docker image..."
docker build -t $IMAGE_NAME ./resume/
# Stop and remove any previous container
if [ $(docker ps -aq -f name=$CONTAINER_NAME) ]; then
echo "Removing previous test container..."
docker rm -f $CONTAINER_NAME || true
fi
# Ensure port 8080 is free
echo "Ensuring port 8080 is free..."
lsof -i :8080 | grep LISTEN | awk '{print $2}' | xargs kill -9 || true
# Run Docker container in the background
echo "Starting Docker container..."
docker run -d --name $CONTAINER_NAME -p 8080:8080 $IMAGE_NAME
# Wait for the server to be ready
MAX_TRIES=20
TRIES=0
until curl -s http://localhost:8080/ > /dev/null; do
TRIES=$((TRIES+1))
if [ $TRIES -ge $MAX_TRIES ]; then
echo "Server did not start in time."
docker rm -f $CONTAINER_NAME
exit 1
fi
echo "Waiting for server... ($TRIES/$MAX_TRIES)"
sleep 2
done
echo "Server is up. Running tests..."
cd ..
npm install
npm run setup
# Run tests and save output for AI parsing
if npm test > test_output.log 2>&1; then
echo "Tests passed. Committing and pushing changes."
git add .
git commit -m "Automated build, test, and deploy"
git push
else
echo "Tests failed. Not deploying."
cat test_output.log
docker rm -f $CONTAINER_NAME
exit 1
fi
# Optionally open report in browser if available, but don't require interaction
echo "Test output saved to test_output.log for AI parsing."
if command -v open >/dev/null 2>&1; then
echo "Opening HTML report in browser (if available)..."
open http://localhost:9323 || echo "Could not open browser automatically. Please visit http://localhost:9323 to view the report."
else
echo "Browser opening not supported. Report available at http://localhost:9323 if a server is running."
fi
echo "Cleaning up Docker container..."
docker rm -f $CONTAINER_NAME
echo "Done."