added FE release workflow
This commit is contained in:
@@ -0,0 +1,218 @@
|
|||||||
|
name: Frontend Release (reusable)
|
||||||
|
|
||||||
|
# Pipeline di release per frontend Angular containerizzati con nginx.
|
||||||
|
# Speculare a maven-release.yml ma per il mondo FE:
|
||||||
|
# - versionamento su package.json (source of truth), flusso -SNAPSHOT come maven
|
||||||
|
# - UNA sola immagine env-agnostic (i puntamenti per-ambiente vivono nelle
|
||||||
|
# env var del docker-compose, applicate a runtime da nginx via envsubst)
|
||||||
|
# - push su registry artifacts.biters.it:8443/biters/<name>:<versione>
|
||||||
|
# - tag + release Gitea, bump SNAPSHOT, rebase develop, update compose repos
|
||||||
|
#
|
||||||
|
# Requisiti runner: deve avere Docker (buildx) disponibile + jq/curl/git.
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
compose-repos:
|
||||||
|
description: "Repo docker-compose da aggiornare, separati da virgola (es. Biters/bitwork). Vuoto = skip."
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
docker-registry:
|
||||||
|
description: "Registry Docker."
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: "artifacts.biters.it:8443"
|
||||||
|
build-config:
|
||||||
|
description: "Configurazione Angular da buildare (deve essere env-agnostic)."
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: "prod"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
|
||||||
|
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
|
||||||
|
GITEA_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
|
||||||
|
REGISTRY: ${{ inputs.docker-registry }}
|
||||||
|
BUILD_CONFIG: ${{ inputs.build-config }}
|
||||||
|
steps:
|
||||||
|
# ── Bootstrap ──────────────────────────────────────────────
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Verifica tooling e configurazione
|
||||||
|
run: |
|
||||||
|
missing=0
|
||||||
|
for v in MAVEN_USERNAME MAVEN_PASSWORD GITEA_TOKEN; do
|
||||||
|
eval "val=\${$v}"
|
||||||
|
if [ -z "$val" ]; then echo "MANCANTE: $v"; missing=1; else echo "OK: $v"; fi
|
||||||
|
done
|
||||||
|
[ "$missing" -eq 0 ] || { echo "Imposta le Secrets mancanti a livello org."; exit 1; }
|
||||||
|
|
||||||
|
# Tool richiesti sul runner
|
||||||
|
command -v docker >/dev/null 2>&1 || { echo "ERRORE: docker non disponibile sul runner."; exit 1; }
|
||||||
|
command -v jq >/dev/null 2>&1 || { echo "ERRORE: jq non disponibile sul runner."; exit 1; }
|
||||||
|
docker buildx version >/dev/null 2>&1 || { echo "ERRORE: docker buildx non disponibile."; exit 1; }
|
||||||
|
|
||||||
|
- name: Configura git
|
||||||
|
run: |
|
||||||
|
git config user.name "CI Release Bot"
|
||||||
|
git config user.email "ci@biters.it"
|
||||||
|
git remote set-url origin "https://biters.gitea:${GITEA_TOKEN}@git.biters.it/${{ github.repository }}.git"
|
||||||
|
|
||||||
|
# ── Versione ───────────────────────────────────────────────
|
||||||
|
- name: Promuovi a release (rimuovi -SNAPSHOT)
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
CURRENT=$(jq -r '.version' package.json)
|
||||||
|
RELEASE_VERSION="${CURRENT%-SNAPSHOT}"
|
||||||
|
PROJECT_NAME=$(jq -r '.name' package.json)
|
||||||
|
|
||||||
|
# Scrive la versione di release nel package.json
|
||||||
|
jq --arg v "$RELEASE_VERSION" '.version=$v' package.json > package.json.tmp
|
||||||
|
mv package.json.tmp package.json
|
||||||
|
|
||||||
|
MAJOR=$(echo "$RELEASE_VERSION" | cut -d. -f1)
|
||||||
|
MINOR=$(echo "$RELEASE_VERSION" | cut -d. -f2)
|
||||||
|
PATCH=$(echo "$RELEASE_VERSION" | cut -d. -f3)
|
||||||
|
NEXT_VERSION="$MAJOR.$MINOR.$((PATCH + 1))-SNAPSHOT"
|
||||||
|
|
||||||
|
echo "RELEASE_VERSION=$RELEASE_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "NEXT_VERSION=$NEXT_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
echo "── Riepilogo ──"
|
||||||
|
echo " project : $PROJECT_NAME"
|
||||||
|
echo " release : $RELEASE_VERSION"
|
||||||
|
echo " next : $NEXT_VERSION"
|
||||||
|
|
||||||
|
# ── Check registry ─────────────────────────────────────────
|
||||||
|
- name: Verifica che il tag immagine non esista già
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
||||||
|
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||||
|
-u "$MAVEN_USERNAME:$MAVEN_PASSWORD" \
|
||||||
|
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
|
||||||
|
"https://${REGISTRY}/v2/biters/${NAME}/manifests/${VERSION}")
|
||||||
|
|
||||||
|
if [ "$HTTP_CODE" = "200" ]; then
|
||||||
|
echo "ERRORE: l'immagine biters/${NAME}:${VERSION} esiste già sul registry!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "OK: tag ${VERSION} non presente (HTTP $HTTP_CODE)"
|
||||||
|
|
||||||
|
# ── Build & Push ───────────────────────────────────────────
|
||||||
|
- name: Docker login
|
||||||
|
run: echo "$MAVEN_PASSWORD" | docker login "$REGISTRY" -u "$MAVEN_USERNAME" --password-stdin
|
||||||
|
|
||||||
|
- name: Build + Push immagine
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
||||||
|
IMAGE="${REGISTRY}/biters/${NAME}:${VERSION}"
|
||||||
|
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg VERSION="${VERSION}" \
|
||||||
|
--build-arg BUILD_CONFIG="${BUILD_CONFIG}" \
|
||||||
|
-t "${IMAGE}" \
|
||||||
|
--push \
|
||||||
|
.
|
||||||
|
echo "Immagine pubblicata: ${IMAGE}"
|
||||||
|
|
||||||
|
# ── Tag & Bump ─────────────────────────────────────────────
|
||||||
|
- name: Commit release e tag
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
git add package.json
|
||||||
|
git commit -m "release: ${VERSION} [skip ci]"
|
||||||
|
git tag -a "${VERSION}" -m "Release ${VERSION}"
|
||||||
|
|
||||||
|
- name: Avanza a prossima versione SNAPSHOT
|
||||||
|
run: |
|
||||||
|
NEXT="${{ steps.version.outputs.NEXT_VERSION }}"
|
||||||
|
jq --arg v "$NEXT" '.version=$v' package.json > package.json.tmp
|
||||||
|
mv package.json.tmp package.json
|
||||||
|
git add package.json
|
||||||
|
git commit -m "chore: avanza versione a ${NEXT} [skip ci]"
|
||||||
|
|
||||||
|
- name: Push release + tag + versione successiva
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
git push origin HEAD "${VERSION}"
|
||||||
|
|
||||||
|
# ── Gitea Release ──────────────────────────────────────────
|
||||||
|
- name: Crea release su Gitea
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
||||||
|
DOCKER_IMAGE="${REGISTRY}/biters/${NAME}:${VERSION}"
|
||||||
|
|
||||||
|
BODY="## Artifacts
|
||||||
|
|
||||||
|
- **Docker**: \`${DOCKER_IMAGE}\`"
|
||||||
|
|
||||||
|
curl -s -X POST \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"https://git.biters.it/api/v1/repos/${{ github.repository }}/releases" \
|
||||||
|
-d "$(jq -n \
|
||||||
|
--arg tag "$VERSION" \
|
||||||
|
--arg name "v${VERSION}" \
|
||||||
|
--arg body "$BODY" \
|
||||||
|
'{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}')"
|
||||||
|
|
||||||
|
# ── Rebase develop ─────────────────────────────────────────
|
||||||
|
- name: Rebase develop su ${{ github.ref_name }}
|
||||||
|
run: |
|
||||||
|
if git ls-remote --exit-code --heads origin develop >/dev/null 2>&1; then
|
||||||
|
git fetch origin develop
|
||||||
|
git checkout develop
|
||||||
|
git rebase origin/${{ github.ref_name }}
|
||||||
|
git push origin develop --force-with-lease
|
||||||
|
else
|
||||||
|
echo "Branch develop assente: skip rebase."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Aggiorna docker-compose (opzionale, multi-repo) ────────
|
||||||
|
- name: Aggiorna docker-compose nei repo compose
|
||||||
|
if: ${{ inputs.compose-repos != '' }}
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
|
PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
||||||
|
ESCAPED_REGISTRY=$(echo "$REGISTRY" | sed 's/\./\\./g')
|
||||||
|
|
||||||
|
echo "${{ inputs.compose-repos }}" | tr ',' '\n' | while IFS= read -r COMPOSE_REPO; do
|
||||||
|
COMPOSE_REPO=$(echo "$COMPOSE_REPO" | xargs)
|
||||||
|
[ -z "$COMPOSE_REPO" ] && continue
|
||||||
|
REPO_DIR="/tmp/compose-$(echo "$COMPOSE_REPO" | tr '/' '-')"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "════════════════════════════════════════"
|
||||||
|
echo " Repo: ${COMPOSE_REPO}"
|
||||||
|
echo "════════════════════════════════════════"
|
||||||
|
|
||||||
|
git clone "https://biters.gitea:${GITEA_TOKEN}@git.biters.it/${COMPOSE_REPO}.git" "$REPO_DIR"
|
||||||
|
cd "$REPO_DIR"
|
||||||
|
git config user.name "CI Release Bot"
|
||||||
|
git config user.email "ci@biters.it"
|
||||||
|
|
||||||
|
find . -name 'docker-compose*.yml' -exec \
|
||||||
|
sed -i "s|\(${ESCAPED_REGISTRY}/biters/${PROJECT_NAME}:\)[^ \"']*|\1${VERSION}|g" {} +
|
||||||
|
|
||||||
|
if git diff --quiet; then
|
||||||
|
echo " Nessuna modifica necessaria"
|
||||||
|
else
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore(${PROJECT_NAME}): aggiorna immagine a ${VERSION}"
|
||||||
|
git push origin HEAD
|
||||||
|
echo " Docker-compose aggiornati a ${VERSION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user