Refactor project structure and update configurations #105
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: Build and Publish | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| tags: | |
| - 'v*' | |
| env: | |
| REGISTRY: ghcr.io | |
| jobs: | |
| # Bump patch version on every push to main/master (skipped on tag pushes and on the | |
| # bot's own follow-up commit). Uses GITHUB_TOKEN; the resulting commit/tag will not | |
| # retrigger this workflow, so build-app/build-addon must `needs:` this job to see | |
| # the new version in ha-addon/config.yaml + server/package.json. | |
| bump-version: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| if: >- | |
| github.event_name == 'push' && | |
| !startsWith(github.ref, 'refs/tags/') && | |
| !contains(github.event.head_commit.message, '[skip ci]') && | |
| !contains(github.event.head_commit.message, 'chore(release):') | |
| outputs: | |
| version: ${{ steps.bump.outputs.version }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Use Node 20 | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Bump patch version | |
| id: bump | |
| run: | | |
| node scripts/bump-version.mjs patch | |
| NEW_VERSION=$(node -e "console.log(require('./server/package.json').version)") | |
| echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT" | |
| - name: Commit and tag | |
| env: | |
| NEW_VERSION: ${{ steps.bump.outputs.version }} | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git add ha-addon/config.yaml server/package.json Dockerfile | |
| if git diff --cached --quiet; then | |
| echo "No version change to commit." | |
| exit 0 | |
| fi | |
| git commit -m "chore(release): ${NEW_VERSION} [skip ci]" | |
| git tag "v${NEW_VERSION}" | |
| git push | |
| git push --tags | |
| build-app: | |
| runs-on: ubuntu-latest | |
| needs: [bump-version] | |
| if: | | |
| always() && | |
| (needs.bump-version.result == 'success' || needs.bump-version.result == 'skipped') | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| # Pull the freshly-bumped commit (HEAD on the branch already moved by bump-version). | |
| with: | |
| ref: ${{ github.ref }} | |
| - name: Set Docker image name (lowercase for GHCR) | |
| run: echo "IMAGE_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV | |
| - name: Log in to the Container registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Extract metadata (tags, labels) for Docker | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-app | |
| tags: | | |
| type=ref,event=branch | |
| type=semver,pattern={{version}} | |
| type=semver,pattern={{major}}.{{minor}} | |
| - name: Build and push App image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./Dockerfile.app | |
| push: true | |
| platforms: linux/amd64,linux/arm64,linux/arm/v7 | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-args: | | |
| VITE_APP_BUILD_VERSION=${{ github.ref_name }}@${{ github.sha }} | |
| VITE_INSTALL_KIND=docker | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max | |
| build-addon: | |
| needs: [bump-version, build-app] | |
| if: | | |
| always() && | |
| needs.build-app.result == 'success' && | |
| (needs.bump-version.result == 'success' || needs.bump-version.result == 'skipped') | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| strategy: | |
| matrix: | |
| arch: [amd64, aarch64, armv7] | |
| include: | |
| - arch: amd64 | |
| platform: linux/amd64 | |
| - arch: aarch64 | |
| platform: linux/arm64 | |
| - arch: armv7 | |
| platform: linux/arm/v7 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.ref }} | |
| - name: Set Docker image name (lowercase for GHCR) | |
| run: echo "IMAGE_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV | |
| - name: Log in to the Container registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Extract metadata (tags, labels) | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-addon-${{ matrix.arch }} | |
| tags: | | |
| type=ref,event=branch | |
| type=semver,pattern={{version}} | |
| - name: Determine App Tag | |
| id: app_tag | |
| run: | | |
| if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then | |
| echo "tag=main" >> $GITHUB_OUTPUT | |
| else | |
| echo "tag=${{ github.ref_name }}" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Build and push Add-on image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| platforms: ${{ matrix.platform }} | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-args: | | |
| BUILD_FROM=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-app:${{ steps.app_tag.outputs.tag }} | |
| BUILD_VERSION=${{ github.ref_name }} | |
| VITE_APP_BUILD_VERSION=${{ github.ref_name }}@${{ github.sha }} | |
| VITE_INSTALL_KIND=docker | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max |