name: test on: pull_request: branches: - main paths: - "bind/**" - "cmd/**" - "internal/**" - "pkg/**" - "ui/**" - ".github/workflows/test.yml" - "go.mod" - "go.sum" push: branches: - main paths: - "bind/**" - "cmd/**" - "internal/**" - "pkg/**" - "ui/**" - ".github/workflows/test.yml" - "go.mod" - "go.sum" workflow_dispatch: env: GO_VERSION: "1.25" FLUTTER_VERSION: "3.41.6" jobs: # lint: # name: Lint # runs-on: ubuntu-latest # steps: # - uses: actions/setup-go@v2 # with: # go-version: '^1.19' # - uses: actions/checkout@v2 # - name: Lint Go Code # run: | # export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 # go get -u golang.org/x/lint/golint # golint -set_exit_status ./... test: name: Test check runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install webview dependencies run: | sudo apt-get update -y sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev xvfb - name: Run Unit tests. run: | # Get packages for testing and coverage (including cmd/web for flags_test.go) PACKAGES=$(go list ./... | awk '!/\/bind\// && (!/\/cmd\// || /\/cmd\/web$/)') env CGO_ENABLED=1 xvfb-run -a go test -tags webview -v -coverpkg=$(echo "$PACKAGES" | paste -sd "," -) -covermode=count -coverprofile=coverage.txt $PACKAGES # Filter out main.go from coverage report to avoid lowering coverage percentage grep -v "main.go" coverage.txt > coverage_filtered.txt || true mv coverage_filtered.txt coverage.txt - uses: codecov/codecov-action@v4 with: files: ./coverage.txt token: ${{ secrets.CODECOV_UPLOAD_TOKEN }} test-webview-integration: name: Test webview integration (${{ matrix.name }}) strategy: fail-fast: false matrix: include: - name: Windows os: windows-latest - name: macOS os: macos-latest runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 if: runner.os == 'macOS' with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Test webview if: runner.os == 'Windows' run: go test -tags webview -v -timeout 300s ./internal/webview/goprovider/ env: CGO_ENABLED: 1 - name: Test webview if: runner.os == 'macOS' shell: bash run: | set -euo pipefail SOCKET_PATH="$HOME/Library/Application Support/com.gopeed.gopeed/gopeed_webview.sock" LOG_PATH="$RUNNER_TEMP/gopeed-webview-rpc.log" rm -f "$SOCKET_PATH" go build -tags nosqlite -ldflags="-w -s" -buildmode=c-shared -o ui/flutter/macos/Frameworks/libgopeed.dylib github.com/GopeedLab/gopeed/bind/desktop cd ui/flutter flutter pub get flutter run -d macos >"$LOG_PATH" 2>&1 & FLUTTER_PID=$! cd ../.. cleanup() { kill "$FLUTTER_PID" >/dev/null 2>&1 || true } trap cleanup EXIT if ! go test -tags webview -v -timeout 600s ./internal/webview/rpcprovider/ -args -webview-rpc-network unix -webview-rpc-address "$SOCKET_PATH"; then cat "$LOG_PATH" exit 1 fi build-desktop: strategy: matrix: include: - os: windows-2022 - os: windows-11-arm llvm_ver: "20251202" # Only ARM64 flutter_channel: "main" flutter_version: "7e1c8868" - os: macos-latest - os: ubuntu-22.04 - os: ubuntu-22.04-arm flutter_channel: "main" name: Build desktop check (${{ matrix.os }}) runs-on: ${{ matrix.os }} needs: [ test ] steps: - uses: actions/checkout@v3 - name: Enable long paths for flutter main branch checks run: | git config --global core.longpaths true - name: Install llvm-mingw-ucrt-aarch64 (ARM64 only) if: matrix.os == 'windows-11-arm' run: | $ver = "${{ matrix.llvm_ver }}" $url = "https://github.com/mstorsjo/llvm-mingw/releases/download/$ver/llvm-mingw-$ver-ucrt-aarch64.zip" $zip = "$env:RUNNER_TEMP\\llvm.zip" $extract = "$env:RUNNER_TEMP\\extract" $target = "C:\\clangarm64" curl -L $url -o $zip rm -r -fo $extract,$target -ea Ignore mkdir $extract | Out-Null tar -xf $zip -C $extract mv (Get-ChildItem $extract)[0].FullName $target $b = "$target\\bin" "CC=$b\\clang.exe" >> $env:GITHUB_ENV "CXX=$b\\clang++.exe" >> $env:GITHUB_ENV "CLANGARM64_BIN=$b" >> $env:GITHUB_ENV "CGO_ENABLED=1" >> $env:GITHUB_ENV "CLANGARM64_ROOT=$target" >> $env:GITHUB_ENV $b >> $env:GITHUB_PATH - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: channel: ${{ matrix.flutter_channel || 'stable' }} flutter-version: ${{ matrix.flutter_version || env.FLUTTER_VERSION }} - if: runner.os == 'Windows' run: | go build -tags nosqlite -ldflags="-w -s" -buildmode=c-shared -o ui/flutter/windows/libgopeed.dll github.com/GopeedLab/gopeed/bind/desktop cd ui/flutter flutter build windows - if: runner.os == 'macOS' run: | go build -tags nosqlite -ldflags="-w -s" -buildmode=c-shared -o ui/flutter/macos/Frameworks/libgopeed.dylib github.com/GopeedLab/gopeed/bind/desktop cd ui/flutter flutter build macos - if: runner.os == 'Linux' run: | sudo apt-get update -y sudo apt-get install -y ninja-build libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev libkeybinder-3.0-dev go build -tags nosqlite -ldflags="-w -s" -buildmode=c-shared -o ui/flutter/linux/bundle/lib/libgopeed.so github.com/GopeedLab/gopeed/bind/desktop cd ui/flutter flutter build linux build-mobile: name: Build mobile check runs-on: ${{ matrix.os }} strategy: matrix: os: [ macos-14, ubuntu-latest ] needs: [ test ] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - run: | go install golang.org/x/mobile/cmd/gomobile@latest go get golang.org/x/mobile/bind gomobile init - if: runner.os == 'macOS' run: | gomobile bind -tags nosqlite -ldflags="-w -s" -o ui/flutter/ios/Frameworks/Libgopeed.xcframework -target=ios github.com/GopeedLab/gopeed/bind/mobile cd ui/flutter flutter build ipa --no-codesign - if: runner.os == 'Linux' uses: actions/setup-java@v3 with: distribution: "zulu" java-version: "17" - if: runner.os == 'Linux' run: | gomobile bind -tags nosqlite -ldflags="-w -s -checklinkname=0" -o ui/flutter/android/app/libs/libgopeed.aar -target=android -androidapi 21 -javapkg=com.gopeed github.com/GopeedLab/gopeed/bind/mobile cd ui/flutter flutter build apk build-web: name: Build web check runs-on: ubuntu-latest needs: [ test ] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Build run: | cd ui/flutter flutter build web --no-web-resources-cdn dart ../../.github/workflows/scripts/flutter_local_font.dart cd ../../ rm -rf cmd/web/dist cp -r ui/flutter/build/web cmd/web/dist go build -tags nosqlite,web -ldflags="-s -w" github.com/GopeedLab/gopeed/cmd/web build-docker: name: Build docker check runs-on: ubuntu-latest needs: [ test ] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Build run: | cd ui/flutter flutter build web --no-web-resources-cdn cd ../../ rm -rf cmd/web/dist cp -r ui/flutter/build/web cmd/web/dist docker build -t gopeed .