name: Docker Build & Push on: workflow_dispatch: push: branches-ignore: ["dependabot/**"] tags: ["v*"] paths: - "MesoAibe.Core/**" - "MesoAibe.Ingest/**" - "MesoAibe.Service/**" - "Dockerfile" - "nuget.config.template" pull_request: branches: [main] paths: - "MesoAibe.Core/**" - "MesoAibe.Ingest/**" - "MesoAibe.Service/**" - "Dockerfile" - "nuget.config.template" # Pushende Laeufe (main/Tags/Feature-Branches) serialisieren sich pro Ref, damit kein # spaeter fertig werdender aelterer Lauf ein neueres Image ueberschreibt. PR-Validierungen # pushen nichts und duerfen sich gegenseitig abbrechen. concurrency: group: docker-${{ github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} permissions: contents: read packages: write env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_CLI_TELEMETRY_OPTOUT: true REGISTRY: ghcr.io IMAGE_NAME: mesoaibe jobs: docker: # Dependabot-Laeufe haben nur einen lesenden GITHUB_TOKEN und sehen die Actions-Secrets # (GITHUBUSERNAME/-PASSWORD, DEVEXPRESS_LICENSE, AZCR_*) nicht - der Build wuerde ohnehin # am NuGet-Restore scheitern (branches-ignore filtert das bereits fuer push, hier zusaetzlich # fuer den Fall eines Dependabot-PRs). if: github.actor != 'dependabot[bot]' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v7 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Log in to GHCR if: github.event_name != 'pull_request' uses: docker/login-action@v4.6.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Nur der stabile Kanal (main-Branch, v*-Tag) landet zusaetzlich in der ACR - Beta-Images # aus Feature-Branches bleiben auf GHCR. - name: Log in to Azure Container Registry if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) uses: docker/login-action@v4.6.0 with: registry: csscontainers.azurecr.io username: ${{ secrets.AZCR_USERNAME }} password: ${{ secrets.AZCR_PASSWORD }} - name: Kanal & Version ermitteln id: determine run: | if [[ "${{ github.ref }}" == refs/tags/v* ]]; then echo "channel=stable" >> "$GITHUB_OUTPUT" echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT" elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then echo "channel=stable" >> "$GITHUB_OUTPUT" echo "version=$(date +%Y.%m.%d).${{ github.run_number }}" >> "$GITHUB_OUTPUT" else SLUG=$(echo "${{ github.ref_name }}" | tr '/' '-' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g') echo "channel=beta" >> "$GITHUB_OUTPUT" echo "version=beta-$SLUG-$(date +%Y%m%d).${{ github.run_number }}" >> "$GITHUB_OUTPUT" fi - name: Image-Liste ermitteln id: images run: | { echo "list<> "$GITHUB_OUTPUT" - name: Docker meta (stable) if: steps.determine.outputs.channel == 'stable' id: meta-stable uses: docker/metadata-action@v6 with: images: ${{ steps.images.outputs.list }} tags: | type=raw,value=${{ steps.determine.outputs.version }} type=raw,value=latest type=sha,prefix=sha-,format=short labels: | org.opencontainers.image.title=MesoAibe.Service org.opencontainers.image.version=${{ steps.determine.outputs.version }} org.opencontainers.image.source=${{ github.repositoryUrl }} - name: Docker meta (beta) if: steps.determine.outputs.channel == 'beta' id: meta-beta uses: docker/metadata-action@v6 with: images: ${{ steps.images.outputs.list }} tags: | type=raw,value=beta type=raw,value=${{ steps.determine.outputs.version }} type=sha,prefix=beta-sha-,format=short labels: | org.opencontainers.image.title=MesoAibe.Service org.opencontainers.image.version=${{ steps.determine.outputs.version }} org.opencontainers.image.source=${{ github.repositoryUrl }} io.css.channel=beta - name: Build (& Push) uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.determine.outputs.channel == 'stable' && steps.meta-stable.outputs.tags || steps.meta-beta.outputs.tags }} labels: ${{ steps.determine.outputs.channel == 'stable' && steps.meta-stable.outputs.labels || steps.meta-beta.outputs.labels }} secrets: | GITHUBUSERNAME=${{ secrets.GITHUBUSERNAME }} GITHUBPASSWORD=${{ secrets.GITHUBPASSWORD }} DevExpress_License=${{ secrets.DEVEXPRESS_LICENSE }} build-args: | DOTNET_VERSION=10.0 cache-from: type=gha cache-to: type=gha,mode=max provenance: false sbom: false