name: Release permissions: contents: write on: workflow_dispatch: push: tags: ["v*"] jobs: prepare: runs-on: ubuntu-latest outputs: should_run: ${{ steps.version.outputs.should_run }} version: ${{ steps.version.outputs.version }} is_prerelease: ${{ steps.version.outputs.is_prerelease }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Resolve version metadata id: version run: | SHOULD_RUN=true POINTED_TAG="$(git tag --points-at HEAD --list 'v*' | sort -V | tail -n1)" if [[ "${GITHUB_REF}" == refs/heads/main ]] && [[ -n "$POINTED_TAG" ]]; then SHOULD_RUN=true VERSION="$POINTED_TAG" elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then VERSION="${GITHUB_REF_NAME}" else VERSION="$(git describe --tags)" fi echo "should_run=$SHOULD_RUN" >> "$GITHUB_OUTPUT" echo "version=$VERSION" >> "$GITHUB_OUTPUT" if [[ "$VERSION" =~ ^v[0-9]+(\.[0-9]+)*$ ]]; then echo "is_prerelease=false" >> "$GITHUB_OUTPUT" else echo "is_prerelease=true" >> "$GITHUB_OUTPUT" fi build-frontend: needs: prepare if: needs.prepare.outputs.should_run == 'true' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Build Frontend env: CI: "" VERSION: ${{ needs.prepare.outputs.version }} run: | cd atsf_server/web corepack enable pnpm install --frozen-lockfile NEXT_PUBLIC_APP_VERSION="$VERSION" pnpm build - name: Upload Frontend Artifact uses: actions/upload-artifact@v4 with: name: frontend-build path: atsf_server/web/build retention-days: 1 build-binaries: needs: - prepare - build-frontend if: needs.prepare.outputs.should_run == 'true' runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - goos: linux goarch: amd64 asset_name: atsflare-server-linux-amd64 - goos: linux goarch: arm64 asset_name: atsflare-server-linux-arm64 - goos: darwin goarch: amd64 asset_name: atsflare-server-darwin-amd64 - goos: darwin goarch: arm64 asset_name: atsflare-server-darwin-arm64 - goos: windows goarch: amd64 asset_name: atsflare-server-windows-amd64.exe steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download Frontend Artifact uses: actions/download-artifact@v4 with: name: frontend-build path: atsf_server/web/build - name: Set up Go uses: actions/setup-go@v5 with: go-version-file: atsf_server/go.mod - name: Build Server working-directory: atsf_server env: CGO_ENABLED: 0 GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} ASSET_NAME: ${{ matrix.asset_name }} VERSION: ${{ needs.prepare.outputs.version }} run: | go mod download mkdir -p ../dist go build -trimpath -ldflags "-s -w -X 'atsflare/common.Version=$VERSION'" -o "../dist/$ASSET_NAME" . - name: Upload Binary Artifact uses: actions/upload-artifact@v4 with: name: server-${{ matrix.goos }}-${{ matrix.goarch }} path: dist/${{ matrix.asset_name }} retention-days: 1 build-agent-binaries: needs: prepare if: needs.prepare.outputs.should_run == 'true' runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - goos: linux goarch: amd64 asset_name: atsflare-agent-linux-amd64 - goos: linux goarch: arm64 asset_name: atsflare-agent-linux-arm64 - goos: darwin goarch: amd64 asset_name: atsflare-agent-darwin-amd64 - goos: darwin goarch: arm64 asset_name: atsflare-agent-darwin-arm64 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version-file: atsf_agent/go.mod - name: Build Agent working-directory: atsf_agent env: CGO_ENABLED: 0 GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} ASSET_NAME: ${{ matrix.asset_name }} VERSION: ${{ needs.prepare.outputs.version }} run: | go mod download mkdir -p ../dist go build -trimpath -ldflags "-s -w -X 'atsflare-agent/internal/config.AgentVersion=$VERSION'" -o "../dist/$ASSET_NAME" ./cmd/agent - name: Upload Agent Artifact uses: actions/upload-artifact@v4 with: name: agent-${{ matrix.goos }}-${{ matrix.goarch }} path: dist/${{ matrix.asset_name }} retention-days: 1 release: needs: - prepare - build-binaries - build-agent-binaries if: needs.prepare.outputs.should_run == 'true' runs-on: ubuntu-latest steps: - name: Download Server Artifacts uses: actions/download-artifact@v4 with: pattern: "server-*" path: dist merge-multiple: true - name: Download Agent Artifacts uses: actions/download-artifact@v4 with: pattern: "agent-*" path: dist merge-multiple: true - name: Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ needs.prepare.outputs.version }} name: ${{ needs.prepare.outputs.version }} target_commitish: ${{ github.sha }} files: dist/* draft: false prerelease: ${{ needs.prepare.outputs.is_prerelease == 'true' }} generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}