Create Release #14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Create Release | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version_type: | |
| description: 'Type of version increment' | |
| required: true | |
| default: 'patch' | |
| type: choice | |
| options: | |
| - major | |
| - minor | |
| - patch | |
| # Add explicit permissions for the workflow | |
| permissions: | |
| contents: write # For managing releases and pushing tags | |
| packages: write # For publishing to GitHub Container Registry | |
| jobs: | |
| prepare: | |
| runs-on: ubuntu-24.04 | |
| outputs: | |
| new_version: ${{ steps.update_version.outputs.new_version }} | |
| repo_owner: ${{ steps.meta.outputs.repo_owner }} | |
| repo_name: ${{ steps.meta.outputs.repo_name }} | |
| timestamp: ${{ steps.timestamp.outputs.timestamp }} | |
| steps: | |
| - uses: actions/checkout@v3 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Configure Git | |
| run: | | |
| git config user.name "GitHub Actions" | |
| git config user.email "actions@github.com" | |
| - name: Update Version | |
| id: update_version | |
| run: | | |
| python scripts/bump_version.py ${{ github.event.inputs.version_type }} | |
| NEW_VERSION=$(python -c "import version; print(f'{version.__version__}')") | |
| echo "new_version=${NEW_VERSION}" >> $GITHUB_OUTPUT | |
| - name: Update Changelog | |
| run: | | |
| python scripts/update_changelog.py ${{ steps.update_version.outputs.new_version }} | |
| - name: Set repository metadata | |
| id: meta | |
| run: | | |
| REPO_OWNER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]') | |
| echo "repo_owner=${REPO_OWNER}" >> $GITHUB_OUTPUT | |
| REPO_NAME=$(echo "${{ github.repository }}" | cut -d '/' -f 2 | tr '[:upper:]' '[:lower:]') | |
| echo "repo_name=${REPO_NAME}" >> $GITHUB_OUTPUT | |
| - name: Generate timestamp for build | |
| id: timestamp | |
| run: | | |
| TIMESTAMP=$(date -u +'%Y%m%d%H%M%S') | |
| echo "timestamp=${TIMESTAMP}" >> $GITHUB_OUTPUT | |
| - name: Commit and Tag | |
| run: | | |
| git add version.py CHANGELOG.md | |
| git commit -m "Release v${{ steps.update_version.outputs.new_version }}" | |
| git tag -a "v${{ steps.update_version.outputs.new_version }}" -m "Release v${{ steps.update_version.outputs.new_version }}" | |
| git push origin main --tags | |
| docker: | |
| needs: [prepare] | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: [amd64, arm64] | |
| include: | |
| - platform: amd64 | |
| runner: ubuntu-24.04 | |
| - platform: arm64 | |
| runner: ubuntu-24.04-arm | |
| runs-on: ${{ matrix.runner }} | |
| steps: | |
| - uses: actions/checkout@v3 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| ref: main | |
| - name: Configure Git | |
| run: | | |
| git config user.name "GitHub Actions" | |
| git config user.email "actions@github.com" | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Extract metadata for Docker | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: | | |
| ghcr.io/${{ needs.prepare.outputs.repo_owner }}/${{ needs.prepare.outputs.repo_name }} | |
| docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${{ needs.prepare.outputs.repo_name }} | |
| labels: | | |
| org.opencontainers.image.title=${{ needs.prepare.outputs.repo_name }} | |
| org.opencontainers.image.description=Your ultimate IPTV & stream Management companion. | |
| org.opencontainers.image.url=https://github.com/${{ github.repository }} | |
| org.opencontainers.image.source=https://github.com/${{ github.repository }} | |
| org.opencontainers.image.version=${{ needs.prepare.outputs.new_version }} | |
| org.opencontainers.image.created=${{ needs.prepare.outputs.timestamp }} | |
| org.opencontainers.image.revision=${{ github.sha }} | |
| org.opencontainers.image.licenses=See repository | |
| org.opencontainers.image.documentation=https://dispatcharr.github.io/Dispatcharr-Docs/ | |
| org.opencontainers.image.vendor=${{ needs.prepare.outputs.repo_owner }} | |
| org.opencontainers.image.authors=${{ github.actor }} | |
| maintainer=${{ github.actor }} | |
| build_version=Dispatcharr version: ${{ needs.prepare.outputs.new_version }} Build date: ${{ needs.prepare.outputs.timestamp }} | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: . | |
| push: true | |
| platforms: linux/${{ matrix.platform }} | |
| tags: | | |
| ghcr.io/${{ needs.prepare.outputs.repo_owner }}/${{ needs.prepare.outputs.repo_name }}:latest-${{ matrix.platform }} | |
| ghcr.io/${{ needs.prepare.outputs.repo_owner }}/${{ needs.prepare.outputs.repo_name }}:${{ needs.prepare.outputs.new_version }}-${{ matrix.platform }} | |
| docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${{ needs.prepare.outputs.repo_name }}:latest-${{ matrix.platform }} | |
| docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${{ needs.prepare.outputs.repo_name }}:${{ needs.prepare.outputs.new_version }}-${{ matrix.platform }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-args: | | |
| REPO_OWNER=${{ needs.prepare.outputs.repo_owner }} | |
| REPO_NAME=${{ needs.prepare.outputs.repo_name }} | |
| BRANCH=${{ github.ref_name }} | |
| REPO_URL=https://github.com/${{ github.repository }} | |
| file: ./docker/Dockerfile | |
| create-manifest: | |
| needs: [prepare, docker] | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Create multi-arch manifest tags | |
| run: | | |
| set -euo pipefail | |
| OWNER=${{ needs.prepare.outputs.repo_owner }} | |
| REPO=${{ needs.prepare.outputs.repo_name }} | |
| VERSION=${{ needs.prepare.outputs.new_version }} | |
| TIMESTAMP=${{ needs.prepare.outputs.timestamp }} | |
| echo "Creating multi-arch manifest for ${OWNER}/${REPO}" | |
| # GitHub Container Registry manifests | |
| # Create one manifest with both latest and version tags | |
| docker buildx imagetools create \ | |
| --annotation "index:org.opencontainers.image.title=${{ needs.prepare.outputs.repo_name }}" \ | |
| --annotation "index:org.opencontainers.image.description=Your ultimate IPTV & stream Management companion." \ | |
| --annotation "index:org.opencontainers.image.url=https://github.com/${{ github.repository }}" \ | |
| --annotation "index:org.opencontainers.image.source=https://github.com/${{ github.repository }}" \ | |
| --annotation "index:org.opencontainers.image.version=${VERSION}" \ | |
| --annotation "index:org.opencontainers.image.created=${TIMESTAMP}" \ | |
| --annotation "index:org.opencontainers.image.revision=${{ github.sha }}" \ | |
| --annotation "index:org.opencontainers.image.licenses=See repository" \ | |
| --annotation "index:org.opencontainers.image.documentation=https://dispatcharr.github.io/Dispatcharr-Docs/" \ | |
| --annotation "index:org.opencontainers.image.vendor=${OWNER}" \ | |
| --annotation "index:org.opencontainers.image.authors=${{ github.actor }}" \ | |
| --annotation "index:maintainer=${{ github.actor }}" \ | |
| --annotation "index:build_version=Dispatcharr version: ${VERSION} Build date: ${TIMESTAMP}" \ | |
| --tag ghcr.io/${OWNER}/${REPO}:latest \ | |
| --tag ghcr.io/${OWNER}/${REPO}:${VERSION} \ | |
| ghcr.io/${OWNER}/${REPO}:${VERSION}-amd64 ghcr.io/${OWNER}/${REPO}:${VERSION}-arm64 | |
| # Docker Hub manifests | |
| # Create one manifest with both latest and version tags | |
| docker buildx imagetools create \ | |
| --annotation "index:org.opencontainers.image.title=${{ needs.prepare.outputs.repo_name }}" \ | |
| --annotation "index:org.opencontainers.image.description=Your ultimate IPTV & stream Management companion." \ | |
| --annotation "index:org.opencontainers.image.url=https://github.com/${{ github.repository }}" \ | |
| --annotation "index:org.opencontainers.image.source=https://github.com/${{ github.repository }}" \ | |
| --annotation "index:org.opencontainers.image.version=${VERSION}" \ | |
| --annotation "index:org.opencontainers.image.created=${TIMESTAMP}" \ | |
| --annotation "index:org.opencontainers.image.revision=${{ github.sha }}" \ | |
| --annotation "index:org.opencontainers.image.licenses=See repository" \ | |
| --annotation "index:org.opencontainers.image.documentation=https://dispatcharr.github.io/Dispatcharr-Docs/" \ | |
| --annotation "index:org.opencontainers.image.vendor=${OWNER}" \ | |
| --annotation "index:org.opencontainers.image.authors=${{ github.actor }}" \ | |
| --annotation "index:maintainer=${{ github.actor }}" \ | |
| --annotation "index:build_version=Dispatcharr version: ${VERSION} Build date: ${TIMESTAMP}" \ | |
| --tag docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${REPO}:latest \ | |
| --tag docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${REPO}:${VERSION} \ | |
| docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${REPO}:${VERSION}-amd64 docker.io/${{ secrets.DOCKERHUB_ORGANIZATION }}/${REPO}:${VERSION}-arm64 | |
| create-release: | |
| needs: [prepare, create-manifest] | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: v${{ needs.prepare.outputs.new_version }} | |
| name: Release v${{ needs.prepare.outputs.new_version }} | |
| draft: false | |
| prerelease: false | |
| token: ${{ secrets.GITHUB_TOKEN }} |