diff --git a/.gitea/workflows/build-and-push.yaml b/.gitea/workflows/build-and-push.yaml index 7351697..c5ab766 100644 --- a/.gitea/workflows/build-and-push.yaml +++ b/.gitea/workflows/build-and-push.yaml @@ -23,6 +23,10 @@ jobs: run: | export TZ=Europe/Berlin + # FIX 1: Stellt sicher, dass die Datei mit einem Zeilenumbruch endet. + # Das verhindert, dass Bash die letzte Zeile beim Einlesen verschluckt. + sed -i -e '$a\' buildargs.env + set -a source <(grep -v '^#' buildargs.env | sed 's/\r$//') set +a @@ -34,11 +38,16 @@ jobs: echo "event_name=${{ gitea.event_name }}" >> $GITHUB_OUTPUT + # FIX 2: Kugelsicheres Auslesen des Tags direkt aus der Datei. + # Trimm-Befehle (tr) entfernen eventuelle unsichtbare Zeichen oder Anführungszeichen. + SAFE_BUILD_TAG=$(grep "^BUILD_TAG=" buildargs.env | cut -d'=' -f2 | tr -d '\r' | tr -d '"' | xargs) + if [[ "${{ gitea.ref }}" == refs/tags/* ]]; then CLEAN_TAG=${{ gitea.ref_name }} echo "docker_tag=${CLEAN_TAG#v}" >> $GITHUB_OUTPUT else - echo "docker_tag=${BUILD_TAG:-latest}" >> $GITHUB_OUTPUT + # Nutzt jetzt garantiert den direkt extrahierten Wert + echo "docker_tag=${SAFE_BUILD_TAG:-latest}" >> $GITHUB_OUTPUT fi OWNER=$(echo "${{ gitea.repository }}" | cut -d'/' -f1 | tr '[:upper:]' '[:lower:]') @@ -129,7 +138,6 @@ jobs: BASE_SHA=$(docker buildx imagetools inspect $BASE --format '{{json .Manifest.Digest}}' 2>/dev/null | tr -d '"' || echo "unknown") - # 1. Architektur-spezifische Builds pushen docker buildx build "${DOCKER_ARGS[@]}" -t "$IMAGE_GITEA:tmp-amd64" \ --pull --platform linux/amd64 -f Dockerfile \ --label "pi_farm.base_digest=$BASE_SHA" --label "pi_farm.args_hash=$ARGS_HASH" --push . @@ -138,8 +146,6 @@ jobs: --pull --platform linux/arm64 -f Dockerfile.aarch64 \ --label "pi_farm.base_digest=$BASE_SHA" --label "pi_farm.args_hash=$ARGS_HASH" --push . - # 2. Multi-Arch Manifest für Gitea erstellen - # Wir bauen ein Array für die Tags GITEA_MANIFEST_TAGS=("-t" "$IMAGE_GITEA:$TAG") if [[ "$BUILD_TAG_LATEST" == "y" ]]; then GITEA_MANIFEST_TAGS+=("-t" "$IMAGE_GITEA:latest") @@ -149,7 +155,6 @@ jobs: --annotation "index:pi_farm.base_digest=$BASE_SHA" --annotation "index:pi_farm.args_hash=$ARGS_HASH" \ "${GITEA_MANIFEST_TAGS[@]}" $IMAGE_GITEA:tmp-amd64 $IMAGE_GITEA:tmp-arm64 - # 3. Multi-Arch Manifest für Docker Hub (optional) if [[ "$PUSH" == *"dockerhub"* ]]; then DOCKERHUB_REPO="${{ secrets.DOCKERHUB_USERNAME }}/$REPO_PURE" DH_MANIFEST_TAGS=("-t" "$DOCKERHUB_REPO:$TAG") @@ -168,7 +173,6 @@ jobs: run: | set -x - # --- 1. VARIABLEN VORBEREITEN --- export TZ=Europe/Berlin CURRENT_TIME=$(date '+%d.%m.%Y %H:%M') BUILD_TAG="${{ steps.prep.outputs.docker_tag }}" @@ -190,11 +194,9 @@ jobs: EOF COMMIT_MSG=$(sed 's/\[skip ci\]//g' commit_msg.txt | xargs) - # --- 2. TEMPLATES LADEN --- wget -q https://git.pi-farm.de/pi-farm/templates/raw/branch/main/README.template -O README.template || echo "Warnung: README Template fehlt" wget -q https://git.pi-farm.de/pi-farm/templates/raw/branch/main/docker-compose.template -O docker-compose.template || echo "Warnung: Compose Template fehlt" - # --- 3. VERSION HISTORY --- NEW_ROW="| **$BUILD_TAG** | $CURRENT_TIME | $COMMIT_MSG ✅ |" if [ -f "VERSION.history" ]; then grep -v "| **$BUILD_TAG** |" VERSION.history > VERSION.history.tmp || true @@ -237,9 +239,6 @@ jobs: done <<< "$vol_vars" fi - # --- 5. DOCKER RUN BEFEHL (NEU: Als Datei schreiben) --- - # Wir schreiben direkt in eine Datei. Da gibt es keine Interpretationsfehler. - # Wichtig: " \\" am Ende der Zeilen explizit hinschreiben. { echo "docker run -d \\" echo " --name $REPO_PURE \\" @@ -261,24 +260,20 @@ jobs: fi done <<< "$all_params" fi - # Letzte Zeile OHNE Backslash echo " $FULL_URL:$BUILD_TAG" } > docker_run_block.txt - # --- 6. DOCKER HUB LINK --- DOCKERHUB_LINK_CONTENT="" if [[ "${{ steps.prep.outputs.push_targets }}" == *"dockerhub"* ]]; then DH_USER="${{ secrets.DOCKERHUB_USERNAME }}" DOCKERHUB_LINK_CONTENT="[![Docker Hub](https://img.shields.io/badge/docker-hub-blue?logo=docker&logoColor=white)](https://hub.docker.com/r/${DH_USER}/${REPO_PURE})" fi - # --- 7. TEMPLATE ENGINE (Optimiert für File-Injection) --- process_template() { local template=$1; local output=$2 [ ! -f "$template" ] && return cp "$template" "$output" - # Simple Ersetzungen sed -i "s|__REPO_NAME__|$REPO_PURE|g" "$output" sed -i "s|__FULL_URL__|$FULL_URL|g" "$output" sed -i "s|__BUILD_TAG__|$BUILD_TAG|g" "$output" @@ -286,28 +281,23 @@ jobs: sed -i "s|__ARM_STATUS__|$ARM_STATUS|g" "$output" sed -i "s|__CURRENT_DATE__|$CURRENT_TIME|g" "$output" - # Komplexe Blöcke: AWK für Strings, SED für Files awk -v r="$HISTORY_CONTENT" '{gsub(/__HISTORY_CONTENT__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" awk -v r="$DOCKERHUB_LINK_CONTENT" '{gsub(/__DOCKERHUB_LINK__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" - # NEU: Docker Run Block via File einfügen (sicherste Methode) if grep -q "__DOCKER_RUN__" "$output" && [ -f "docker_run_block.txt" ]; then sed -e '/__DOCKER_RUN__/{r docker_run_block.txt' -e 'd;}' "$output" > "$output.tmp" && mv "$output.tmp" "$output" fi - # Compose Block via File einfügen if grep -q "__COMPOSE_BLOCK__" "$output" && [ -f "docker-compose.yml" ]; then sed -e '/__COMPOSE_BLOCK__/{r docker-compose.yml' -e 'd;}' "$output" > "$output.tmp" && mv "$output.tmp" "$output" fi - # ENV/PORTS/VOL Blöcke if grep -q "__ENV_BLOCK__" "$output"; then awk -v r="$(echo -e "$ENV_BLOCK_CONTENT")" '{gsub(/__ENV_BLOCK__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" fi awk -v r="$(echo -e "$PORTS_BLOCK_CONTENT")" '{gsub(/__PORTS_BLOCK__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" awk -v r="$(echo -e "$VOL_BLOCK_CONTENT")" '{gsub(/__VOL_BLOCK__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" - # Description als letztes if grep -q "__DESCRIPTION__" "$output"; then awk -v r="$(echo -e "${DESCRIPTION:-Keine Beschreibung.}")" '{gsub(/__DESCRIPTION__/, r)}1' "$output" > "$output.tmp" && mv "$output.tmp" "$output" fi @@ -316,7 +306,6 @@ jobs: process_template "docker-compose.template" "docker-compose.yml" process_template "README.template" "README.md" - # --- 8. EXPORTS --- echo "FINAL_MSG=$COMMIT_MSG" >> $GITHUB_ENV echo "DESCRIPTION<> $GITHUB_ENV echo -e "$DESCRIPTION" >> $GITHUB_ENV @@ -377,23 +366,18 @@ jobs: git config --local user.email "action@pi-farm.de" git config --local user.name "Gitea Action" - # Sicherstellen, dass wir etwas zum Committen haben git add VERSION.history README.md docker-compose.yml - # Nur committen, wenn es Änderungen gibt git diff --quiet && git diff --staged --quiet || git commit -m "${{ env.FINAL_MSG }} [skip ci]" - # Das Tag exakt so setzen, wie es in prep definiert wurde (ohne extra 'v') TARGET_TAG="${{ steps.prep.outputs.docker_tag }}" git tag -f "$TARGET_TAG" if [[ "${{ gitea.ref }}" == refs/tags/* ]]; then echo "🏷️ Build aus Tag getriggert: $TARGET_TAG" - # Wir pushen das Tag (force), um die Doku-Updates einzuschließen git push -f origin "$TARGET_TAG" else echo "🌿 Build aus Branch/Schedule getriggert: ${{ gitea.ref_name }}" - # In den Branch pushen (HEAD:branch_name) und das Tag setzen git push origin HEAD:${{ gitea.ref_name }} git push -f origin "$TARGET_TAG" fi @@ -440,7 +424,7 @@ jobs: - name: Cleanup Docker Artifacts if: always() run: docker image prune -f - + - name: Workflow Summary if: always() run: |