name: Build Release on: push: tags: - "v*.*.*" jobs: build-linux-docker: runs-on: ubuntu-latest outputs: image-tag: ${{ steps.meta.outputs.version }} steps: - name: Checkout uses: actions/checkout@v4 - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: | ${{ secrets.DOCKER_USERNAME }}/ezbookkeeping tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=raw,value=latest - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: image: tonistiigi/binfmt:qemu-v8.1.5 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-action@v6 with: file: Dockerfile context: . platforms: | linux/amd64 linux/arm64/v8 linux/arm/v7 linux/arm/v6 push: true build-args: | RELEASE_BUILD=1 BUILD_PIPELINE=1 CHECK_3RD_API=${{ vars.CHECK_3RD_API }} SKIP_TESTS=${{ vars.SKIP_TESTS }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} upload-linux-artifact: needs: build-linux-docker runs-on: ubuntu-latest strategy: matrix: include: - arch: linux/amd64 arch_alias: linux-amd64 - arch: linux/arm64/v8 arch_alias: linux-arm64 - arch: linux/arm/v7 arch_alias: linux-armv7 - arch: linux/arm/v6 arch_alias: linux-armv6 steps: - name: Checkout uses: actions/checkout@v4 - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Pull and save packaged files for ${{ matrix.arch }} run: | VERSION=${{ needs.build-linux-docker.outputs.image-tag }} IMAGE=${{ secrets.DOCKER_USERNAME }}/ezbookkeeping:${VERSION} docker pull --platform ${{ matrix.arch }} ${IMAGE} cid=$(docker create "${IMAGE}") docker cp ${cid}:/ezbookkeeping ./ezbookkeeping docker rm ${cid} cd ezbookkeeping tar -czf ../ezbookkeeping-v${VERSION}-${{ matrix.arch_alias }}.tar.gz * cd .. rm -rf ezbookkeeping - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-${{ matrix.arch_alias }} path: ezbookkeeping-${{ github.ref_name }}-${{ matrix.arch_alias }}.tar.gz if-no-files-found: error build-and-upload-windows-package: needs: upload-linux-artifact runs-on: windows-latest env: GO_VERSION: "1.25.1" MINGW_VERSION: "14.2.0" MINGW_REVISION: "v12-rev2" steps: - name: Checkout uses: actions/checkout@v4 - name: Download linux-amd64 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-linux-amd64 path: artifacts - name: Extract frontend files from linux-amd64 package run: | New-Item -ItemType Directory -Path package tar -xzf (Get-ChildItem artifacts\ezbookkeeping-${{ github.ref_name }}-linux-amd64.tar.gz) -C package - name: Set up Go uses: actions/setup-go@v6 with: go-version: ${{ env.GO_VERSION }} - name: Install MinGW run: | $mingwVersion = "${{ env.MINGW_VERSION }}" $mingwRevision = "${{ env.MINGW_REVISION }}" $url = "https://github.com/niXman/mingw-builds-binaries/releases/download/${mingwVersion}-rt_${mingwRevision}/x86_64-${mingwVersion}-release-posix-seh-ucrt-rt_${mingwRevision}.7z" $archive = "C:\mingw.7z" $mingwDir = "C:\mingw64" Write-Host "Downloading MinGW from ${url}" Invoke-WebRequest -Uri ${url} -OutFile ${archive} Remove-Item -Recurse -Force ${mingwDir} New-Item -ItemType Directory -Path ${mingwDir} Write-Host "Extracting MinGW to ${mingwDir}" 7z x ${archive} -oC:\ "${mingwDir}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Build backend for windows-x64 env: RELEASE_BUILD: "1" BUILD_PIPELINE: "1" CHECK_3RD_API: ${{ vars.CHECK_3RD_API }} SKIP_TESTS: ${{ vars.SKIP_TESTS }} run: | .\build.ps1 backend - name: Package Windows build run: | New-Item -ItemType Directory -Path "ezbookkeeping" New-Item -ItemType Directory -Path "ezbookkeeping\data" New-Item -ItemType Directory -Path "ezbookkeeping\storage" New-Item -ItemType Directory -Path "ezbookkeeping\log" Copy-Item ezbookkeeping.exe -Destination ezbookkeeping\ Copy-Item -Recurse -Force package\public -Destination ezbookkeeping\public Copy-Item -Recurse -Force conf -Destination ezbookkeeping\conf Copy-Item -Recurse -Force templates -Destination ezbookkeeping\templates Copy-Item .\LICENSE -Destination ezbookkeeping\ Push-Location ezbookkeeping 7z a -r -tzip -mx9 ..\ezbookkeeping-${{ github.ref_name }}-windows-x64.zip * Pop-Location Remove-Item -Recurse -Force ezbookkeeping - name: Upload Windows artifact uses: actions/upload-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-windows-x64 path: ezbookkeeping-${{ github.ref_name }}-windows-x64.zip if-no-files-found: error publish-release: runs-on: ubuntu-latest needs: - upload-linux-artifact - build-and-upload-windows-package steps: - name: Download linux-amd64 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-linux-amd64 path: ./release-files - name: Download linux-arm64 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-linux-arm64 path: ./release-files - name: Download linux-armv6 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-linux-armv6 path: ./release-files - name: Download linux-armv7 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-linux-armv7 path: ./release-files - name: Download windows-x64 packaged files uses: actions/download-artifact@v4 with: name: ezbookkeeping-${{ github.ref_name }}-windows-x64 path: ./release-files - name: Publish Release ${{ github.ref_name }} uses: softprops/action-gh-release@v2 with: name: ${{ github.ref_name }} tag_name: ${{ github.ref_name }} files: ./release-files/* draft: true