name: build on: workflow_dispatch: inputs: platform: description: "Build platform" required: true default: "all" test: description: "Test mode" required: true default: "false" env: GO_VERSION: "1.23" FLUTTER_VERSION: "3.24.5" permissions: contents: write jobs: get-release: runs-on: ubuntu-latest outputs: version: ${{ steps.get-release.outputs.version }} upload_url: ${{ steps.get-release.outputs.upload_url }} steps: - uses: monkeyWie/get-latest-release@v2.1 id: get-release with: myToken: ${{ github.token }} build-windows: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'windows' }} runs-on: windows-latest needs: [get-release] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | Invoke-WebRequest -Uri "https://github.com/jrsoftware/issrc/raw/main/Files/Languages/Unofficial/ChineseSimplified.isl" -OutFile "ChineseSimplified.isl" mv ChineseSimplified.isl "C:\Program Files (x86)\Inno Setup 6\Languages\" go build -tags nosqlite -ldflags="-w -s -X github.com/GopeedLab/gopeed/pkg/base.Version=$env:VERSION" -buildmode=c-shared -o ui/flutter/windows/libgopeed.dll github.com/GopeedLab/gopeed/bind/desktop go build -ldflags="-w -s" -o ui/flutter/assets/host/host.exe github.com/GopeedLab/gopeed/cmd/host cd ui/flutter $TAG = "v$env:VERSION" flutter build windows $mingw = "C:\Program Files\Git\mingw64\bin" $system = "C:\Windows\System32" $release = "build\windows\x64\runner\Release\" cp $mingw\libstdc++-6.dll $release cp $mingw\libgcc_s_seh-1.dll $release cp $mingw\libwinpthread-1.dll $release cp $system\msvcp140.dll $release cp $system\vcruntime140.dll $release cp $system\vcruntime140_1.dll $release New-Item -Path build\windows\Output -ItemType Directory Compress-Archive -Path "$release*" -DestinationPath "build\windows\Output\Gopeed-$TAG-windows-amd64-portable.zip" cd build/windows echo @" ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Gopeed" #define MyAppVersion "$env:VERSION" #define MyAppPublisher "monkeyWie" #define MyAppURL "https://gopeed.com" #define MyAppExeName "gopeed.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{5960F34D-1E42-402C-8C85-DE2FF24CBAE4} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={autopf}\gopeed DisableProgramGroupPage=yes LicenseFile=..\..\..\..\LICENSE ; Remove the following line to run in administrative install mode (install for all users.) PrivilegesRequired=lowest OutputBaseFilename=gopeed SetupIconFile=..\..\assets\icon\icon.ico UninstallDisplayIcon={app}\{#MyAppExeName} Compression=lzma SolidCompression=yes WizardStyle=modern LanguageDetectionMethod=uilanguage ShowLanguageDialog=yes CloseApplications=force [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: ".\x64\runner\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs; ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [UninstallDelete] Type: filesandordirs; Name: "{app}" [Icons] Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent "@ > setup.iss iscc.exe setup.iss mv "Output\gopeed.exe" "Output\Gopeed-$TAG-windows-amd64.exe" Compress-Archive -Path "Output\Gopeed-$TAG-windows-amd64.exe" -DestinationPath "Output\Gopeed-$TAG-windows-amd64.zip" Remove-Item -Path "Output\Gopeed-$TAG-windows-amd64.exe" - name: Upload uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ needs.get-release.outputs.upload_url }} asset_path: ui/flutter/build/windows/Output/* overwrite: true build-macos-arm64-lib: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'macos' }} runs-on: macos-latest needs: [get-release] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | go build -tags nosqlite -ldflags="-w -s -X github.com/GopeedLab/gopeed/pkg/base.Version=$VERSION" -buildmode=c-shared -o libgopeed.dylib github.com/GopeedLab/gopeed/bind/desktop go build -ldflags="-w -s" github.com/GopeedLab/gopeed/cmd/host - uses: actions/upload-artifact@v4 with: name: macos-arm64-lib path: | libgopeed.dylib host build-macos: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'macos' }} runs-on: macos-13 needs: [get-release, build-macos-arm64-lib] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - uses: actions/setup-node@v3 with: node-version: 16 - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Install appdmg run: | python3 -m pip install setuptools --break-system-packages npm install -g appdmg - uses: actions/download-artifact@v4 with: name: macos-arm64-lib path: ui/flutter/lib-arm64 - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | PROJECT_DIR=$(pwd) # amd64 lib go build -tags nosqlite -ldflags="-w -s -X github.com/GopeedLab/gopeed/pkg/base.Version=$VERSION" -buildmode=c-shared -o ui/flutter/lib-amd64/libgopeed.dylib github.com/GopeedLab/gopeed/bind/desktop go build -ldflags="-w -s" -o ui/flutter/lib-amd64/host github.com/GopeedLab/gopeed/cmd/host # universal binary mkdir -p ui/flutter/macos/Frameworks cp ui/flutter/lib-amd64/libgopeed.dylib ui/flutter/macos/Frameworks/amd64-lib cp ui/flutter/lib-arm64/libgopeed.dylib ui/flutter/macos/Frameworks/arm64-lib cp ui/flutter/lib-amd64/host ui/flutter/macos/Frameworks/amd64-host cp ui/flutter/lib-arm64/host ui/flutter/macos/Frameworks/arm64-host cd ui/flutter/macos/Frameworks lipo -create -output libgopeed.dylib amd64-lib arm64-lib lipo -create -output host amd64-host arm64-host rm -rf amd64-lib arm64-lib amd64-host arm64-host mv host ../../assets/host/host cd $PROJECT_DIR/ui/flutter flutter build macos cd build/macos/Build/Products/Release cat>appdmg.json<snap/snapcraft.yaml< android/app/upload-keystore.jks flutter build apk mkdir dist cp build/app/outputs/flutter-apk/app-release.apk dist/Gopeed-v$VERSION-android.apk - name: Upload uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ needs.get-release.outputs.upload_url }} asset_path: ui/flutter/dist/* overwrite: true build-ios: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'ios' }} runs-on: macos-latest needs: [get-release] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | go install golang.org/x/mobile/cmd/gomobile@latest go get golang.org/x/mobile/bind gomobile init gomobile bind -tags nosqlite -ldflags="-w -s -X github.com/GopeedLab/gopeed/pkg/base.Version=$VERSION" -o ui/flutter/ios/Frameworks/Libgopeed.xcframework -target=ios github.com/GopeedLab/gopeed/bind/mobile cd ui/flutter flutter build ios --no-codesign mkdir Payload cp -r build/ios/iphoneos/Runner.app Payload zip -r -y Payload.zip Payload/Runner.app mkdir dist mv Payload.zip dist/Gopeed-v$VERSION-ios.ipa - name: Upload uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ needs.get-release.outputs.upload_url }} asset_path: ui/flutter/dist/* overwrite: true build-web: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'web' || github.event.inputs.platform == 'qnap' }} runs-on: ubuntu-latest needs: [get-release] steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | VERSION=${VERSION:-$(date +%y%m%d%H%M)} # Use current time as version if not specified cd ui/flutter flutter build web --no-web-resources-cdn cd ../../ cp -r ui/flutter/build/web cmd/web/dist mkdir -p dist/zip goos_arr=(windows darwin linux) goarch_arr=(386 amd64 arm64) export CGO_ENABLED=0 for goos in "${goos_arr[@]}"; do for goarch in "${goarch_arr[@]}"; do goos_name=$goos if [ $goos = "darwin" ]; then goos_name="macos" fi name=gopeed-web-v$VERSION-$goos_name-$goarch dir="dist/$name/" (GOOS=$goos GOARCH=$goarch go build -tags nosqlite,web -ldflags="-s -w -X github.com/GopeedLab/gopeed/pkg/base.Version=$VERSION" -o $dir github.com/GopeedLab/gopeed/cmd/web \ && cd $dir \ && file=$(ls -AU | head -1) \ && mkdir $name \ && mv $file $name/$(echo $file | sed -e "s/web/gopeed/g") \ && zip -r ../zip/$name.zip * \ && cd ../..) \ || true done done - uses: actions/upload-artifact@v4 with: name: web-dist path: dist/zip/ - name: Upload uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ needs.get-release.outputs.upload_url }} asset_path: dist/zip/* overwrite: true build-qnap: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'qnap' }} runs-on: ubuntu-latest needs: [get-release, build-web] steps: - uses: actions/setup-python@v5 with: python-version: "3.8.18" - uses: actions/download-artifact@v4 with: name: web-dist path: dist/zip/ - name: Build env: VERSION: ${{ needs.get-release.outputs.version }} run: | sudo apt update -y sudo apt install -y pv bsdmainutils wget -O qdk2_0.32.bionic_amd64.deb "https://github.com/qnap-dev/qdk2/releases/download/v0.32/qdk2_0.32.bionic_amd64.deb" dpkg -X qdk2_0.32.bionic_amd64.deb qdk2 # Direct installs will fail due to missing dependencies! [[ -d qdk2 ]] || exit 1 export PATH=$(pwd)/qdk2/usr/bin:$(pwd)/qdk2/usr/share/qdk2/QDK/bin:${PATH} wget -O Gopeed.template.tar.gz "https://github.com/GopeedLab/QpkgBuild/raw/refs/heads/master/template/Gopeed.template.tar.gz" tar -zxf Gopeed.template.tar.gz [[ -d Gopeed ]] || exit 1 goos=linux goarch_arr=(amd64 arm64) for goarch in "${goarch_arr[@]}"; do qarch=x86_64 [[ "${goarch}" == "arm64" ]] && qarch=arm_64 name=gopeed-web-v${VERSION}-${goos}-${goarch} unzip dist/zip/${name}.zip -d dist/${name} cp dist/${name}/${name}/* Gopeed/${qarch}/ done cd Gopeed sed -i -e 's/__QPKG_VER__/${VERSION}/g' qpkg.cfg qbuild || exit 1 mkdir -p ../dist/qnap goos=qnap for goarch in "${goarch_arr[@]}"; do qarch=x86_64 [[ "${goarch}" == "arm64" ]] && qarch=arm_64 sname=Gopeed_${VERSION}_${qarch}.qpkg dname=gopeed-v${VERSION}-${goos}-${goarch}.qpkg [[ -f build/${sname} ]] && cp -ra build/${sname} ../dist/qnap/${dname} done - name: Upload uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ needs.get-release.outputs.upload_url }} asset_path: dist/qnap/* overwrite: true build-docker: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'docker' }} runs-on: ubuntu-latest needs: [get-release] steps: - name: Remove unnecessary files run: | sudo rm -rf /usr/share/dotnet sudo rm -rf "$AGENT_TOOLSDIRECTORY" - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} - uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub uses: docker/login-action@v1 with: username: liwei2633 password: ${{ secrets.DOCKER_PASSWORD }} - name: Build flutter web 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 - name: Build and push uses: docker/build-push-action@v2 env: VERSION: ${{ needs.get-release.outputs.version }} with: context: . push: ${{ github.event.inputs.test == 'true' && 'false' || 'true' }} build-args: | VERSION=${{ env.VERSION }} IN_DOCKER=true platforms: | linux/386 linux/amd64 linux/arm64 linux/arm/v7 tags: | liwei2633/gopeed:latest liwei2633/gopeed:v${{ env.VERSION }}