diff --git a/.github/workflows/build-bindings-ios.yml b/.github/workflows/build-bindings-ios.yml index b408e62f5..3524bf990 100644 --- a/.github/workflows/build-bindings-ios.yml +++ b/.github/workflows/build-bindings-ios.yml @@ -72,6 +72,48 @@ jobs: name: sdk-bindings-${{ matrix.target }} path: libs/target/${{ matrix.target }}/release/libbreez_sdk_bindings.a + merge: + runs-on: macOS-latest + needs: build + name: build ios-universal + steps: + - uses: actions/download-artifact@v3 + with: + name: sdk-bindings-aarch64-apple-ios + path: aarch64-apple-ios + + - uses: actions/download-artifact@v3 + with: + name: sdk-bindings-x86_64-apple-ios + path: x86_64-apple-ios + + - uses: actions/download-artifact@v3 + with: + name: sdk-bindings-aarch64-apple-ios-sim + path: aarch64-apple-ios-sim + + - name: Build ios-universal + run: | + mkdir -p ios-universal + lipo -create -output ios-universal/libbreez_sdk_bindings.a aarch64-apple-ios/libbreez_sdk_bindings.a x86_64-apple-ios/libbreez_sdk_bindings.a + + - name: Build ios-universal-sim + run: | + mkdir -p ios-universal-sim + lipo -create -output ios-universal-sim/libbreez_sdk_bindings.a aarch64-apple-ios-sim/libbreez_sdk_bindings.a x86_64-apple-ios/libbreez_sdk_bindings.a + + - name: Archive ios-universal + uses: actions/upload-artifact@v3 + with: + name: sdk-bindings-ios-universal + path: ios-universal/libbreez_sdk_bindings.a + + - name: Archive ios-universal-sim + uses: actions/upload-artifact@v3 + with: + name: sdk-bindings-ios-universal-sim + path: ios-universal-sim/libbreez_sdk_bindings.a + build-dummies: if: ${{ inputs.use-dummy-binaries }} runs-on: ubuntu-latest @@ -82,6 +124,8 @@ jobs: aarch64-apple-ios, x86_64-apple-ios, aarch64-apple-ios-sim, + ios-universal, + ios-universal-sim, ] steps: - name: Build dummy ios ${{ matrix.target }} diff --git a/.github/workflows/publish-all-platforms.yml b/.github/workflows/publish-all-platforms.yml index dcacaed27..0bba1f51d 100644 --- a/.github/workflows/publish-all-platforms.yml +++ b/.github/workflows/publish-all-platforms.yml @@ -14,7 +14,7 @@ on: description: 'array of packages to publish (remove what you do not want)' required: true type: string - default: '["csharp", "golang", "maven", "kotlin-mpp", "flutter", "react-native", "python"]' + default: '["csharp", "golang", "maven", "kotlin-mpp", "flutter", "react-native", "python", "swift"]' csharp-ref: description: 'optional commit/tag/branch reference for the C# project. Defaults to ref.' required: false @@ -47,7 +47,7 @@ on: description: 'array of packages to publish (remove what you do not want)' required: true type: string - default: '["csharp", "golang", "maven", "kotlin-mpp", "flutter", "react-native", "python"]' + default: '["csharp", "golang", "maven", "kotlin-mpp", "flutter", "react-native", "python", "swift"]' csharp-ref: description: 'optional commit/tag/branch reference for the C# project. Defaults to ref.' required: false @@ -78,6 +78,7 @@ jobs: flutter-package-version: ${{ (contains(fromJSON(inputs.packages-to-publish), 'flutter') && inputs.package-version) || '' }} react-native-package-version: ${{ (contains(fromJSON(inputs.packages-to-publish), 'react-native') && inputs.package-version) || '' }} python-package-version: ${{ (contains(fromJSON(inputs.packages-to-publish), 'python') && inputs.package-version) || '' }} + swift-package-version: ${{ (contains(fromJSON(inputs.packages-to-publish), 'swift') && inputs.package-version) || '' }} use-dummy-binaries: ${{ inputs.use-dummy-binaries }} publish: ${{ inputs.publish }} steps: @@ -95,12 +96,12 @@ jobs: # (e.g. bindings-windows: true) if you want to test something. repository: ${{ needs.pre-setup.outputs.repository }} bindings-windows: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version }} - bindings-darwin: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version }} + bindings-darwin: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version || !!needs.pre-setup.outputs.swift-package-version }} bindings-linux: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version }} bindings-android: ${{ !!needs.pre-setup.outputs.kotlin-mpp-package-version || !!needs.pre-setup.outputs.maven-package-version || !!needs.pre-setup.outputs.golang-package-version }} - bindings-ios: ${{ !!needs.pre-setup.outputs.kotlin-mpp-package-version || !!needs.pre-setup.outputs.maven-package-version }} + bindings-ios: ${{ !!needs.pre-setup.outputs.kotlin-mpp-package-version || !!needs.pre-setup.outputs.maven-package-version || !!needs.pre-setup.outputs.swift-package-version}} kotlin: ${{ !!needs.pre-setup.outputs.kotlin-mpp-package-version || !!needs.pre-setup.outputs.maven-package-version || !!needs.pre-setup.outputs.flutter-package-version }} - swift: ${{ !!needs.pre-setup.outputs.flutter-package-version }} + swift: ${{ !!needs.pre-setup.outputs.flutter-package-version || !!needs.pre-setup.outputs.swift-package-version }} python: ${{ !!needs.pre-setup.outputs.python-package-version }} csharp: ${{ !!needs.pre-setup.outputs.csharp-package-version }} golang: ${{ !!needs.pre-setup.outputs.golang-package-version }} @@ -132,7 +133,7 @@ jobs: use-dummy-binaries: ${{ needs.setup.outputs.use-dummy-binaries == 'true' }} build-bindings-darwin: needs: setup - if: ${{ needs.setup.outputs.bindings-darwin == 'true' }} + if: always() && !failure() && !cancelled() && ${{ needs.setup.outputs.bindings-darwin == 'true' }} uses: ./.github/workflows/build-bindings-darwin.yml with: repository: ${{ needs.setup.outputs.repository }} @@ -156,7 +157,7 @@ jobs: use-dummy-binaries: ${{ needs.setup.outputs.use-dummy-binaries == 'true' }} build-bindings-ios: needs: setup - if: ${{ needs.setup.outputs.bindings-ios == 'true' }} + if: always() && !failure() && !cancelled() && ${{ needs.setup.outputs.bindings-ios == 'true' }} uses: ./.github/workflows/build-bindings-ios.yml with: repository: ${{ needs.setup.outputs.repository }} @@ -247,7 +248,8 @@ jobs: needs: - setup - build-language-bindings - if: ${{ needs.setup.outputs.flutter == 'true' }} + - publish-swift + if: always() && !failure() && !cancelled() && ${{ needs.setup.outputs.flutter == 'true' }} uses: ./.github/workflows/publish-flutter.yml with: repository: ${{ needs.setup.outputs.repository }} @@ -262,7 +264,8 @@ jobs: publish-react-native: needs: - setup - if: ${{ needs.setup.outputs.react-native == 'true' }} + - publish-swift + if: always() && !failure() && !cancelled() && ${{ needs.setup.outputs.react-native == 'true' }} uses: ./.github/workflows/publish-react-native.yml with: repository: ${{ needs.setup.outputs.repository }} @@ -288,3 +291,20 @@ jobs: publish: ${{ needs.setup.outputs.publish == 'true' }} secrets: PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + + publish-swift: + needs: + - setup + - build-bindings-darwin + - build-bindings-ios + - build-language-bindings + if: always() && !failure() && !cancelled() && ${{ needs.setup.outputs.swift == 'true' }} + uses: ./.github/workflows/publish-swift.yml + with: + repository: ${{ needs.setup.outputs.repository }} + ref: ${{ needs.setup.outputs.ref }} + package-version: ${{ needs.setup.outputs.python-package-version }} + publish: ${{ needs.setup.outputs.publish == 'true' }} + secrets: + COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} + REPO_SSH_KEY: ${{ secrets.REPO_SSH_KEY }} diff --git a/.github/workflows/publish-swift.yml b/.github/workflows/publish-swift.yml new file mode 100644 index 000000000..6946c8c45 --- /dev/null +++ b/.github/workflows/publish-swift.yml @@ -0,0 +1,135 @@ +name: Publish Swift Bindings +on: + workflow_call: + inputs: + repository: + description: 'sdk repository, defaults to current repository' + required: false + type: string + ref: + description: 'commit/tag/branch reference' + required: true + type: string + package-version: + description: 'version for the swift package (MAJOR.MINOR.BUILD)' + required: true + type: string + publish: + description: 'value indicating whether to commit/tag a release.' + required: true + type: boolean + default: false + secrets: + REPO_SSH_KEY: + description: 'ssh key to commit to the breez-sdk-swift repository' + required: true + COCOAPODS_TRUNK_TOKEN: + description: 'cocoapods trunk token' + required: true + +jobs: + build-swift-release: + runs-on: macOS-13 + steps: + - name: Checkout breez-sdk repo + uses: actions/checkout@v3 + with: + repository: ${{ inputs.repository || github.repository }} + path: breez-sdk + + - name: Checkout breez-sdk-swift repo + uses: actions/checkout@v3 + with: + repository: breez/breez-sdk-swift + ssh-key: ${{ secrets.REPO_SSH_KEY }} + fetch-depth: 0 + path: dist + + - name: Download swift bindings + uses: actions/download-artifact@v3 + with: + name: bindings-swift + path: bindings-swift + + - name: Download aarch64-apple-ios + uses: actions/download-artifact@v3 + with: + name: sdk-bindings-aarch64-apple-ios + path: aarch64-apple-ios + + - name: Download ios-universal-sim + uses: actions/download-artifact@v3 + with: + name: sdk-bindings-ios-universal-sim + path: ios-universal-sim + + - name: Download darwin-universal + uses: actions/download-artifact@v3 + with: + name: sdk-bindings-darwin-universal + path: darwin-universal + + - name: Copy swift bindings + run: | + mkdir -p breez-sdk/libs/sdk-bindings/bindings-swift/Sources/BreezSDK + cp bindings-swift/BreezSDK.swift breez-sdk/libs/sdk-bindings/bindings-swift/Sources/BreezSDK/BreezSDK.swift + cp bindings-swift/breez_sdkFFI.h breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64/breez_sdkFFI.framework/Headers + cp bindings-swift/breez_sdkFFI.h breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64_x86_64-simulator/breez_sdkFFI.framework/Headers + cp bindings-swift/breez_sdkFFI.h breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/macos-arm64_x86_64/breez_sdkFFI.framework/Headers + mkdir -p breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64/breez_sdkFFI.framework/breez_sdkFFI + cp aarch64-apple-ios/libbreez_sdk_bindings.a breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64/breez_sdkFFI.framework/breez_sdkFFI + mkdir -p breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64_x86_64-simulator/breez_sdkFFI.framework/breez_sdkFFI + cp ios-universal-sim/libbreez_sdk_bindings.a breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/ios-arm64_x86_64-simulator/breez_sdkFFI.framework/breez_sdkFFI + cp darwin-universal/libbreez_sdk_bindings.a breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework/macos-arm64_x86_64/breez_sdkFFI.framework/breez_sdkFFI + + - name: Compress XCFramework + working-directory: breez-sdk/libs/sdk-bindings/bindings-swift + run: | + zip -9 -r breez_sdkFFI.xcframework.zip breez_sdkFFI.xcframework + echo "XCF_CHECKSUM=`swift package compute-checksum breez_sdkFFI.xcframework.zip`" >> $GITHUB_ENV + + - name: Update Swift Package definition + working-directory: breez-sdk/libs/sdk-bindings/bindings-swift + run: | + sed 's#.binaryTarget(name: "breez_sdkFFI", path: "./breez_sdkFFI.xcframework"),#.binaryTarget(name: "breez_sdkFFI", url: "https://github.com/breez/breez-sdk-swift/releases/download/${{ inputs.package-version || '0.0.1' }}/breez_sdkFFI.xcframework.zip", checksum: "${{ env.XCF_CHECKSUM }}"),#;/.testTarget(name: "BreezSDKTests", dependencies: \["BreezSDK"\]),/d' Package.swift > ../../../../dist/Package.swift + cp -r Sources ../../../../dist + + - name: Update Cocoapods definitions + working-directory: dist + run: | + sed -i '' 's#^.\{2\}spec.version.*$# spec.version = "${{ inputs.package-version || '0.0.1' }}"#' breez_sdkFFI.podspec + sed -i '' 's#^.\{2\}spec.version.*$# spec.version = "${{ inputs.package-version || '0.0.1' }}"#' BreezSDK.podspec + + - name: Tag the Swift bindings + if: ${{ inputs.publish }} + working-directory: dist + run: | + git config --global user.name "SDK release tagger" + git config --global user.email "no-reply@breez.technology" + git add Package.swift + git add Sources + git add breez_sdkFFI.podspec + git add BreezSDK.podspec + git commit -m "Update Breez SDK Swift bindings to version ${{ inputs.package-version || '0.0.1' }}" + git push + git tag ${{ inputs.package-version || '0.0.1' }} -m "${{ inputs.package-version || '0.0.1' }}" + git push --tags + + - name: Release and attach XCFramework binary artifact + if: ${{ inputs.publish }} + uses: ncipollo/release-action@v1 + with: + artifacts: "breez-sdk/libs/sdk-bindings/bindings-swift/breez_sdkFFI.xcframework.zip" + tag: ${{ inputs.package-version || '0.0.1' }} + token: ${{ secrets.GITHUB_TOKEN }} + name: ${{ inputs.package-version || '0.0.1' }} + prerelease: true + + - name: Push update to Cocoapods trunk + if: ${{ inputs.publish }} + working-directory: dist + env: + COCOAPODS_TRUNK_TOKEN: ${{secrets.COCOAPODS_TRUNK_TOKEN}} + run: | + pod trunk push breez_sdkFFI.podspec --allow-warnings + pod trunk push BreezSDK.podspec --allow-warnings --synchronous