diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c7a8288 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,112 @@ +name: Release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Version (e.g. 0.3.9, 不带 v 前缀)' + required: true + +permissions: + contents: write + +jobs: + build-macos: + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Resolve version + id: ver + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "version=${{ inputs.version }}" >> "$GITHUB_OUTPUT" + else + echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" + fi + + - name: Vet + run: make vet + + - name: Build .app + run: make app SEMVER=${{ steps.ver.outputs.version }} + + - name: Package .app as zip + run: | + VERSION="${{ steps.ver.outputs.version }}-$(git rev-parse --short HEAD)" + ditto -c -k --keepParentFolder LMVPN.app "LMVPN-${VERSION}-macos.zip" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: macos-build + path: LMVPN-*-macos.zip + + build-windows: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Install make and Inno Setup + shell: pwsh + run: choco install make innosetup -y --no-progress + + - name: Add MinGW to PATH + shell: bash + run: echo "C:/msys64/mingw64/bin" >> "$GITHUB_PATH" + + - name: Resolve version + id: ver + shell: bash + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "version=${{ inputs.version }}" >> "$GITHUB_OUTPUT" + else + echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" + fi + + - name: Vet + shell: bash + run: make vet + + - name: Build installer + shell: bash + run: make installer-windows SEMVER=${{ steps.ver.outputs.version }} MINGW_CC=gcc SHELL=bash + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: windows-build + path: build/LMVPN-Setup-*.exe + + release: + needs: [build-macos, build-windows] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + merge-multiple: true + + - name: Create release + uses: softprops/action-gh-release@v2 + with: + files: artifacts/* + generate_release_notes: true diff --git a/Makefile b/Makefile index b162788..6446f00 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,9 @@ APP_BUNDLE = $(APP_NAME).app GO = go CGO_ENABLED = 1 -SEMVER = 0.3.9 +WINDRES ?= x86_64-w64-mingw32-windres +MINGW_CC ?= x86_64-w64-mingw32-gcc +SEMVER ?= 0.3.9 GIT_HASH = $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) VERSION = $(SEMVER)-$(GIT_HASH) LDFLAGS = -s -w -X lmvpn/internal/version.Version=$(VERSION) @@ -88,16 +90,17 @@ clean: ## icon-windows: generate icon.ico and compile Windows resource (.syso) icon-windows: go run resources/genico/main.go - x86_64-w64-mingw32-windres -i resources/lmvpn.rc -O coff -o cmd/lmvpn/resource_windows_amd64.syso - x86_64-w64-mingw32-windres -i resources/lmvpn.rc -O coff -o cmd/lmvpnd/resource_windows_amd64.syso + $(WINDRES) -i resources/lmvpn.rc -O coff -o cmd/lmvpn/resource_windows_amd64.syso + $(WINDRES) -i resources/lmvpn.rc -O coff -o cmd/lmvpnd/resource_windows_amd64.syso @echo "Generated Windows icon resources" ## build-windows: cross-compile Windows x86_64 exes (requires mingw-w64) -build-windows: icon-windows +## The .syso icon resources are committed in cmd/*/; run `make icon-windows` to regenerate. +build-windows: mkdir -p $(BUILD_DIR) - CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc \ + CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=$(MINGW_CC) \ $(GO) build -ldflags "$(LDFLAGS) -H windowsgui" -o $(BUILD_DIR)/$(GUI_BIN).exe ./cmd/lmvpn - CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc \ + CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=$(MINGW_CC) \ $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(DAEMON_BIN).exe ./cmd/lmvpnd @echo "Built $(BUILD_DIR)/$(GUI_BIN).exe and $(BUILD_DIR)/$(DAEMON_BIN).exe"