Détecte les fichiers changés depuis le dernier tag v* : - apps/api/ ou crates/ changés → rebuild api - apps/indexer/ ou crates/ changés → rebuild indexer - apps/backoffice/ changé → rebuild backoffice - Cargo.toml/Cargo.lock changés → rebuild tout Affiche les services à build/skip, demande confirmation. Option de forcer le build de tout si rien n'a changé. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
153 lines
5.0 KiB
Bash
Executable File
153 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Docker Hub
|
|
REGISTRY="docker.io"
|
|
OWNER="julienfroidefond32"
|
|
|
|
SERVICES=("api" "indexer" "backoffice")
|
|
|
|
# ─── Version bump ───────────────────────────────────────────────────────────
|
|
CURRENT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
|
|
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
|
|
|
|
echo "=== Stripstream Librarian Docker Push ==="
|
|
echo "Current version: $CURRENT_VERSION"
|
|
echo ""
|
|
echo "Bump version?"
|
|
echo " 1) patch → $MAJOR.$MINOR.$((PATCH + 1))"
|
|
echo " 2) minor → $MAJOR.$((MINOR + 1)).0"
|
|
echo " 3) major → $((MAJOR + 1)).0.0"
|
|
echo " 4) skip → keep $CURRENT_VERSION"
|
|
echo ""
|
|
read -rp "Choice [1-4]: " BUMP_CHOICE
|
|
|
|
case "$BUMP_CHOICE" in
|
|
1) NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))" ;;
|
|
2) NEW_VERSION="$MAJOR.$((MINOR + 1)).0" ;;
|
|
3) NEW_VERSION="$((MAJOR + 1)).0.0" ;;
|
|
4) NEW_VERSION="$CURRENT_VERSION" ;;
|
|
*) echo "Invalid choice"; exit 1 ;;
|
|
esac
|
|
|
|
if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then
|
|
echo "Bumping version: $CURRENT_VERSION → $NEW_VERSION"
|
|
|
|
# Update Cargo.toml (workspace version)
|
|
sed -i.bak "s/^version = \"$CURRENT_VERSION\"/version = \"$NEW_VERSION\"/" Cargo.toml
|
|
rm -f Cargo.toml.bak
|
|
|
|
# Update backoffice package.json
|
|
sed -i.bak "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" apps/backoffice/package.json
|
|
rm -f apps/backoffice/package.json.bak
|
|
|
|
# Update Cargo.lock
|
|
cargo update --workspace 2>/dev/null || true
|
|
|
|
# Commit version bump
|
|
git add Cargo.toml Cargo.lock apps/backoffice/package.json
|
|
git commit -m "chore: bump version to $NEW_VERSION"
|
|
echo "✓ Version bumped and committed"
|
|
else
|
|
echo "Keeping version $CURRENT_VERSION"
|
|
fi
|
|
|
|
VERSION="$NEW_VERSION"
|
|
|
|
# ─── Detect changed services ─────────────────────────────────────────────────
|
|
LAST_TAG=$(git tag -l "v*" --sort=-v:refname | head -1)
|
|
CHANGED_SERVICES=()
|
|
|
|
if [ -n "$LAST_TAG" ]; then
|
|
CHANGED_FILES=$(git diff --name-only "$LAST_TAG"..HEAD 2>/dev/null || echo "")
|
|
CRATES_CHANGED=false
|
|
|
|
if echo "$CHANGED_FILES" | grep -q "^crates/"; then
|
|
CRATES_CHANGED=true
|
|
fi
|
|
|
|
for service in "${SERVICES[@]}"; do
|
|
if echo "$CHANGED_FILES" | grep -q "^apps/$service/"; then
|
|
CHANGED_SERVICES+=("$service")
|
|
elif [ "$CRATES_CHANGED" = true ] && [ "$service" != "backoffice" ]; then
|
|
# Shared crates affect api and indexer, not backoffice
|
|
CHANGED_SERVICES+=("$service")
|
|
fi
|
|
done
|
|
|
|
# Also rebuild if root Cargo.toml/Cargo.lock/Dockerfile changed
|
|
if echo "$CHANGED_FILES" | grep -qE "^(Cargo\.(toml|lock)|docker-compose)"; then
|
|
for service in "${SERVICES[@]}"; do
|
|
if [[ ! " ${CHANGED_SERVICES[*]} " =~ " $service " ]]; then
|
|
CHANGED_SERVICES+=("$service")
|
|
fi
|
|
done
|
|
fi
|
|
else
|
|
# No previous tag → build everything
|
|
CHANGED_SERVICES=("${SERVICES[@]}")
|
|
fi
|
|
|
|
# If nothing changed, still allow force-building all
|
|
if [ ${#CHANGED_SERVICES[@]} -eq 0 ]; then
|
|
echo "No services changed since $LAST_TAG."
|
|
read -rp "Build all anyway? [y/N]: " FORCE_ALL
|
|
if [[ "$FORCE_ALL" =~ ^[Yy]$ ]]; then
|
|
CHANGED_SERVICES=("${SERVICES[@]}")
|
|
else
|
|
echo "Nothing to push."
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "Registry: $REGISTRY"
|
|
echo "Version: $VERSION"
|
|
echo "Last tag: ${LAST_TAG:-none}"
|
|
echo "Services to build: ${CHANGED_SERVICES[*]}"
|
|
echo "Skipped: $(for s in "${SERVICES[@]}"; do [[ ! " ${CHANGED_SERVICES[*]} " =~ " $s " ]] && echo -n "$s "; done)"
|
|
echo ""
|
|
read -rp "Continue? [Y/n]: " CONFIRM
|
|
if [[ "$CONFIRM" =~ ^[Nn]$ ]]; then
|
|
echo "Aborted."
|
|
exit 0
|
|
fi
|
|
|
|
for service in "${CHANGED_SERVICES[@]}"; do
|
|
echo "Building $service..."
|
|
docker build -f "apps/$service/Dockerfile" -t "$service:latest" .
|
|
|
|
echo "Tagging $service..."
|
|
docker tag "$service:latest" "$REGISTRY/$OWNER/stripstream-$service:$VERSION"
|
|
docker tag "$service:latest" "$REGISTRY/$OWNER/stripstream-$service:latest"
|
|
|
|
echo "Pushing stripstream-$service:$VERSION..."
|
|
docker push "$REGISTRY/$OWNER/stripstream-$service:$VERSION"
|
|
|
|
echo "Pushing stripstream-$service:latest..."
|
|
docker push "$REGISTRY/$OWNER/stripstream-$service:latest"
|
|
|
|
echo "✓ $service pushed successfully"
|
|
echo ""
|
|
done
|
|
|
|
echo "=== Push complete ==="
|
|
echo "Built & pushed:"
|
|
for service in "${CHANGED_SERVICES[@]}"; do
|
|
echo " ✓ $REGISTRY/$OWNER/stripstream-$service:$VERSION"
|
|
done
|
|
SKIPPED=""
|
|
for s in "${SERVICES[@]}"; do
|
|
[[ ! " ${CHANGED_SERVICES[*]} " =~ " $s " ]] && SKIPPED="$SKIPPED $s"
|
|
done
|
|
if [ -n "$SKIPPED" ]; then
|
|
echo "Skipped (unchanged):$SKIPPED"
|
|
fi
|
|
|
|
# Tag git with version
|
|
if ! git tag -l "v$VERSION" | grep -q "v$VERSION"; then
|
|
git tag "v$VERSION"
|
|
echo ""
|
|
echo "Git tag v$VERSION created. Push with: git push origin v$VERSION"
|
|
fi
|