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.21" FLUTTER_VERSION: "3.16.8" 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=$VERSION" -buildmode=c-shared -o ui/flutter/windows/libgopeed.dll github.com/GopeedLab/gopeed/bind/desktop 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 Compression=lzma SolidCompression=yes WizardStyle=modern LanguageDetectionMethod=uilanguage ShowLanguageDialog=yes [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: ubuntu-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 install src.techknowlogick.com/xgo@latest xgo -go go-$GO_VERSION.x --targets=darwin/arm64 -tags="nosqlite" -ldflags="-w -s -X github.com/GopeedLab/gopeed/pkg/base.Version=$VERSION" -buildmode=c-shared -pkg=bind/desktop -out=libgopeed . mv libgopeed-*.dylib libgopeed.dylib - uses: actions/upload-artifact@v3 with: name: macos-arm64-lib path: libgopeed.dylib build-macos: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'macos' }} runs-on: macos-latest 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 npm install -g appdmg - uses: actions/download-artifact@v3 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 # 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 cd ui/flutter/macos/Frameworks lipo -create -output libgopeed.dylib amd64-lib arm64-lib 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,netgo -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' }} 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: | cd ui/flutter flutter build web --web-renderer html 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 - 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-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: 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 and push uses: docker/build-push-action@v2 env: VERSION: ${{ needs.get-release.outputs.version }} with: 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 linux/arm64/v8 tags: | liwei2633/gopeed:latest liwei2633/gopeed:v${{ env.VERSION }}