--- name: Deploy # yamllint disable-line rule:truthy on: release: types: - published workflow_run: workflows: ["CI"] branches: [main] types: - completed jobs: information: if: | github.event_name == 'release' || ( github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' ) name: โ„น๏ธ Gather add-on information runs-on: ubuntu-latest outputs: architectures: ${{ steps.information.outputs.architectures }} build: ${{ steps.information.outputs.build }} description: ${{ steps.information.output.description }} environment: ${{ steps.release.outputs.environment }} name: ${{ steps.information.outputs.name }} slug: ${{ steps.information.outputs.slug }} target: ${{ steps.information.outputs.target }} version: ${{ steps.release.outputs.version }} steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v2.3.4 - name: ๐Ÿš€ Run add-on information action id: information uses: frenck/action-addon-information@v1.0.0 - name: โ„น๏ธ Gather version and environment id: release run: | sha="${{ github.sha }}" environment="edge" version="${sha:0:7}" if [[ "${{ github.event_name }}" = "release" ]]; then version="${{ github.event.release.tag_name }}" version="${version,,}" version="${version#v}" environment="stable" if [[ "${{ github.event.release.prerelease }}" = "true" ]]; then environment="beta" fi fi echo "::set-output name=environment::${environment}" echo "::set-output name=version::${version}" deploy: name: ๐Ÿ‘ท Build & Deploy ${{ matrix.architecture }} needs: information runs-on: ubuntu-latest strategy: matrix: architecture: ${{ fromJson(needs.information.outputs.architectures) }} steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v2.3.4 - name: ๐Ÿ— Set up build cache id: cache uses: actions/cache@v2.1.3 with: path: /tmp/.docker-cache key: docker-${{ github.ref }}-${{ matrix.architecture }}-${{ github.sha }} restore-keys: | docker-${{ github.ref }}-${{ matrix.architecture }} - name: ๐Ÿ— Set up QEMU uses: docker/setup-qemu-action@v1.0.1 - name: ๐Ÿ— Set up Docker Buildx uses: docker/setup-buildx-action@v1.1.1 - name: โ„น๏ธ Compose build flags id: flags run: | echo "::set-output name=date::$(date +"%Y-%m-%dT%H:%M:%SZ")" from=$(jq --raw-output ".build_from.${{ matrix.architecture }}" "${{ needs.information.outputs.build }}") echo "::set-output name=from::${from}" if [[ "${{ matrix.architecture}}" = "amd64" ]]; then echo "::set-output name=platform::linux/amd64" elif [[ "${{ matrix.architecture }}" = "i386" ]]; then echo "::set-output name=platform::linux/386" elif [[ "${{ matrix.architecture }}" = "armhf" ]]; then echo "::set-output name=platform::linux/arm/v6" elif [[ "${{ matrix.architecture }}" = "armv7" ]]; then echo "::set-output name=platform::linux/arm/v7" elif [[ "${{ matrix.architecture }}" = "aarch64" ]]; then echo "::set-output name=platform::linux/arm64/v8" else echo "::error ::Could not determine platform for architecture ${{ matrix.architecture }}" exit 1 fi - name: ๐Ÿ— Login to GitHub Container Registry uses: docker/login-action@v1.8.0 with: registry: ghcr.io username: ${{ secrets.GHCR_USERNAME }} password: ${{ secrets.GHCR_PASSWORD }} - name: ๐Ÿš€ Build and push uses: docker/build-push-action@v2.2.2 with: push: true # yamllint disable rule:line-length tags: | ghcr.io/hassio-addons/${{ needs.information.outputs.slug }}/${{ matrix.architecture }}:${{ needs.information.outputs.environment }} ghcr.io/hassio-addons/${{ needs.information.outputs.slug }}/${{ matrix.architecture }}:${{ needs.information.outputs.version }} # yamllint enable rule:line-length context: ${{ needs.information.outputs.target }} file: ${{ needs.information.outputs.target }}/Dockerfile cache-from: | type=local,src=/tmp/.docker-cache ghcr.io/hassio-addons/${{ needs.information.outputs.slug }}/${{ matrix.architecture }}:edge cache-to: type=local,mode=max,dest=/tmp/.docker-cache platforms: ${{ steps.flags.outputs.platform }} build-args: | BUILD_ARCH=${{ matrix.architecture }} BUILD_DATE=${{ steps.flags.outputs.date }} BUILD_DESCRIPTION=${{ needs.information.outputs.description }} BUILD_FROM=${{ steps.flags.outputs.from }} BUILD_NAME=${{ needs.information.outputs.name }} BUILD_REF=${{ github.sha }} BUILD_REPOSITORY=${{ github.repository }} BUILD_VERSION=${{ needs.information.outputs.version }} publish-edge: name: ๐Ÿ“ข Publish to edge repository if: needs.information.outputs.environment == 'edge' needs: - information - deploy environment: name: ${{ needs.information.outputs.environment }} runs-on: ubuntu-latest steps: - name: ๐Ÿš€ Dispatch repository updater update signal uses: peter-evans/repository-dispatch@v1.1.3 with: token: ${{ secrets.DISPATCH_TOKEN }} repository: hassio-addons/repository-edge event-type: update client-payload: > { "addon": "${{ needs.information.outputs.slug }}", "name": "${{ needs.information.outputs.name }}", "repository": "${{ github.repository }}", "version": "${{ needs.information.outputs.version }}" } publish-beta: name: ๐Ÿ“ข Publish to beta repository if: | needs.information.outputs.environment == 'beta' || needs.information.outputs.environment == 'stable' needs: - information - deploy environment: name: ${{ needs.information.outputs.environment }} runs-on: ubuntu-latest steps: - name: ๐Ÿš€ Dispatch repository updater update signal uses: peter-evans/repository-dispatch@v1.1.3 with: token: ${{ secrets.DISPATCH_TOKEN }} repository: hassio-addons/repository-beta event-type: update client-payload: > { "addon": "${{ needs.information.outputs.slug }}", "name": "${{ needs.information.outputs.name }}", "repository": "${{ github.repository }}", "version": "${{ github.event.release.tag_name }}" } publish-stable: name: ๐Ÿ“ข Publish to stable repository if: needs.information.outputs.environment == 'stable' needs: - information - deploy environment: name: ${{ needs.information.outputs.environment }} runs-on: ubuntu-latest steps: - name: ๐Ÿš€ Dispatch repository updater update signal uses: peter-evans/repository-dispatch@v1.1.3 with: token: ${{ secrets.DISPATCH_TOKEN }} repository: hassio-addons/repository event-type: update client-payload: > { "addon": "${{ needs.information.outputs.slug }}", "name": "${{ needs.information.outputs.name }}", "repository": "${{ github.repository }}", "version": "${{ github.event.release.tag_name }}" }