name: full compatibility check on: [push] permissions: issues: write pull-requests: write jobs: lib_mingw: strategy: fail-fast: false matrix: coin: [monero, wownero] target: [x86_64-w64-mingw32, i686-w64-mingw32] runs-on: ubuntu-latest container: image: ubuntu:24.04 steps: - name: Install dependencies run: | apt update apt install -y pigz build-essential pkg-config autoconf libtool ccache make cmake gcc g++ git curl lbzip2 gperf gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 gcc-mingw-w64-i686 g++-mingw-w64-i686 - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Patch sources run: | git config --global --add safe.directory '*' git config --global user.email "ci@mrcyjanek.net" git config --global user.name "CI mrcyjanek.net" ./apply_patches.sh monero ./apply_patches.sh wownero ./apply_patches.sh zano - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | mkdir -p release/gh/ for i in release/${{ matrix.coin }}/* do cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload lib uses: actions/upload-artifact@v4 with: name: mingw-${{ matrix.coin }}-${{ matrix.target }} path: release/${{ matrix.coin }} lib_android: strategy: fail-fast: false matrix: coin: [monero, wownero, zano] target: [x86_64-linux-android, armv7a-linux-androideabi, aarch64-linux-android] runs-on: ubuntu-22.04 steps: - name: Free Disk Space if: ${{ !startsWith(github.ref, 'refs/tags/v') }} uses: jlumbroso/free-disk-space@main with: tool-cache: false android: true dotnet: true haskell: true large-packages: true docker-images: true swap-storage: true - name: Install dependencies run: | sudo apt update sudo apt install -y llvm pigz build-essential pkg-config autoconf libtool ccache make cmake gcc g++ git curl lbzip2 libtinfo6 gperf unzip python-is-python3 - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Patch sources run: | git config --global --add safe.directory '*' git config --global user.email "ci@mrcyjanek.net" git config --global user.name "CI mrcyjanek.net" ./apply_patches.sh monero ./apply_patches.sh wownero ./apply_patches.sh zano - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | mkdir -p release/gh/ for i in release/${{ matrix.coin }}/* do cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload lib uses: actions/upload-artifact@v4 with: name: android-${{ matrix.coin }}-${{ matrix.target }} path: release/${{ matrix.coin }} - name: remove android_ndk run: | rm -rf contrib/depends/built/*/android_ndk rm -rf contrib/depends/sources/android-ndk-r26d-linux.zip lib_linux: strategy: fail-fast: false matrix: coin: [monero, wownero, zano] target: [x86_64-linux-gnu, aarch64-linux-gnu, i686-linux-gnu] runs-on: ubuntu-latest container: image: debian:bullseye steps: - name: Install dependencies run: | apt update apt install -y pigz build-essential pkg-config autoconf libtool ccache make cmake gcc g++ git curl lbzip2 libtinfo5 gperf gcc-aarch64-linux-gnu g++-aarch64-linux-gnu gcc-i686-linux-gnu g++-i686-linux-gnu - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Patch sources run: | git config --global --add safe.directory '*' git config --global user.email "ci@mrcyjanek.net" git config --global user.name "CI mrcyjanek.net" ./apply_patches.sh monero ./apply_patches.sh wownero ./apply_patches.sh zano - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | mkdir -p release/gh/ for i in release/${{ matrix.coin }}/* do cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload lib uses: actions/upload-artifact@v4 with: name: linux-${{ matrix.coin }}-${{ matrix.target }} path: release/${{ matrix.coin }} lib_macos: strategy: fail-fast: false matrix: coin: [monero, wownero, zano] target: [aarch64-apple-darwin, x86_64-apple-darwin] name: macos build runs-on: macos-15 steps: - name: Checkout monero_c repo uses: actions/checkout@v4 with: repository: MrCyjaneK/monero_c fetch-depth: 0 submodules: recursive - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '16.4' - name: install dependencies run: | brew uninstall cmake brew install cmake ccache binutils pigz autoconf automake libtool pkg-config - name: Patch sources run: | git config --global --add safe.directory '*' git config --global user.email "ci@mrcyjanek.net" git config --global user.name "CI mrcyjanek.net" ./apply_patches.sh monero ./apply_patches.sh wownero ./apply_patches.sh zano - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(sysctl -n hw.logicalcpu) - name: rename artifacts run: | mkdir -p release/gh/ for i in release/${{ matrix.coin }}/* do cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload lib uses: actions/upload-artifact@v4 with: name: macos-${{ matrix.coin }}-${{ matrix.target }} path: release/${{ matrix.coin }} lib_ios: strategy: fail-fast: false matrix: coin: [monero, wownero, zano] target: [aarch64-apple-ios, aarch64-apple-iossimulator] name: ios build runs-on: macos-15 steps: - name: Checkout monero_c repo uses: actions/checkout@v4 with: repository: MrCyjaneK/monero_c fetch-depth: 0 submodules: recursive - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '16.4' - name: install dependencies run: | brew uninstall cmake brew install cmake ccache autoconf automake libtool - name: Patch sources run: | git config --global --add safe.directory '*' git config --global user.email "ci@mrcyjanek.net" git config --global user.name "CI mrcyjanek.net" ./apply_patches.sh monero ./apply_patches.sh wownero ./apply_patches.sh zano - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(sysctl -n hw.logicalcpu) - name: rename artifacts run: | mkdir -p release/gh/ for i in release/${{ matrix.coin }}/* do cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload lib uses: actions/upload-artifact@v4 with: name: ios-${{ matrix.coin }}-${{ matrix.target }} path: release/${{ matrix.coin }} bulk_lib_release: name: create single release file runs-on: ubuntu-latest needs: [lib_mingw, lib_android, lib_linux, lib_macos, lib_ios] strategy: matrix: coin: [monero, wownero, zano] platform: [android, ios, linux, macos] include: - coin: monero platform: mingw - coin: wownero platform: mingw steps: - name: Create release directory run: mkdir -p release/${{ matrix.coin }} - name: Download Android artifacts if: matrix.platform == 'android' uses: actions/download-artifact@v4 with: pattern: android-${{ matrix.coin }}-* path: temp-android merge-multiple: true - name: Download iOS artifacts if: matrix.platform == 'ios' uses: actions/download-artifact@v4 with: pattern: ios-${{ matrix.coin }}-* path: temp-ios merge-multiple: true - name: Download Linux artifacts if: matrix.platform == 'linux' uses: actions/download-artifact@v4 with: pattern: linux-${{ matrix.coin }}-* path: temp-linux merge-multiple: true - name: Download macOS artifacts if: matrix.platform == 'macos' uses: actions/download-artifact@v4 with: pattern: macos-${{ matrix.coin }}-* path: temp-macos merge-multiple: true - name: Download MinGW artifacts if: matrix.platform == 'mingw' && (matrix.coin == 'monero' || matrix.coin == 'wownero') uses: actions/download-artifact@v4 with: pattern: mingw-${{ matrix.coin }}-* path: temp-mingw merge-multiple: true - name: Copy artifacts to release directory run: | if [ -d "temp-${{ matrix.platform }}" ]; then cp -r temp-${{ matrix.platform }}/* release/${{ matrix.coin }}/ fi - name: Upload consolidated artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }}-${{ matrix.coin }}-all path: release/${{ matrix.coin }} final_bulk_release: name: create final release bundle runs-on: ubuntu-latest needs: [bulk_lib_release] steps: - name: Create release directory run: mkdir -p release/{monero,wownero,zano} - name: Download all consolidated artifacts uses: actions/download-artifact@v4 with: pattern: "*-all" path: temp-all - name: Reorganize artifacts run: | # Move all artifacts to their respective coin directories for coin in monero wownero zano; do find temp-all -name "*-${coin}-all" -type d | while read dir; do if [ -d "$dir" ]; then cp -r "$dir"/* "release/${coin}/" 2>/dev/null || true fi done done - name: zip release dir run: zip -r release-bundle.zip release - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release-bundle.zip token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - name: Upload final bundle uses: actions/upload-artifact@v4 with: name: release-bulk path: release deno_monerots_test_linux: name: test ts library runs-on: ubuntu-24.04 needs: [lib_linux] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - uses: actions/download-artifact@v4 with: pattern: linux-monero-x86_64-linux-gnu path: temp-linux-monero merge-multiple: true - name: unpack and move monero_c run: | mkdir -p release/monero cp -r temp-linux-monero/* release/monero/ unxz -f -k release/*/*.xz - uses: denoland/setup-deno@v1 with: deno-version: vx.x.x - name: Create symlink run: | cd impls/monero.ts mkdir lib cd lib ln -s ../../../release/monero/x86_64-linux-gnu_libwallet2_api_c.so mv x86_64-linux-gnu_libwallet2_api_c.so monero_libwallet2_api_c.so cd .. - name: Run tests run: | cd impls/monero.ts deno run --unstable-ffi --allow-ffi checksum.ts regression_tests_linux: name: linux regression tests strategy: fail-fast: false matrix: coin: [monero, wownero] needs: [lib_linux] runs-on: ubuntu-24.04 steps: - uses: denoland/setup-deno@v2 with: deno-version: v2.x - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - uses: actions/download-artifact@v4 with: pattern: linux-${{ matrix.coin }}-* path: temp-linux-${{ matrix.coin }} merge-multiple: true - name: Setup release directory run: | mkdir -p release/${{ matrix.coin }} cp -r temp-linux-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run regression tests run: COIN="${{ matrix.coin }}" deno test -A tests/regression.test.ts regression_tests_macos: name: macos regression tests strategy: matrix: coin: [monero, wownero] needs: [lib_macos] runs-on: macos-15 steps: - uses: denoland/setup-deno@v2 with: deno-version: canary - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - uses: actions/download-artifact@v4 with: pattern: macos-${{ matrix.coin }}-* path: temp-macos-${{ matrix.coin }} merge-multiple: true - name: Setup release directory run: | mkdir -p release/${{ matrix.coin }} cp -r temp-macos-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run regression tests run: COIN="${{ matrix.coin }}" deno test -A tests/regression.test.ts integration_tests_linux: name: linux integration tests strategy: matrix: coin: [monero, wownero] needs: [lib_linux] runs-on: ubuntu-24.04 steps: - uses: denoland/setup-deno@v2 with: deno-version: v2.x - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - uses: actions/download-artifact@v4 with: pattern: linux-${{ matrix.coin }}-* path: temp-linux-${{ matrix.coin }} merge-multiple: true - name: Setup release directory run: | mkdir -p release/${{ matrix.coin }} cp -r temp-linux-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run integration tests run: COIN="${{ matrix.coin }}" deno test -A tests/integration.test.ts env: SECRET_WALLET_PASSWORD: ${{ secrets.SECRET_WALLET_PASSWORD }} SECRET_WALLET_MNEMONIC: ${{ secrets.SECRET_WALLET_MNEMONIC }} SECRET_WALLET_RESTORE_HEIGHT: ${{ secrets.SECRET_WALLET_RESTORE_HEIGHT }} integration_tests_macos: name: macos integration tests strategy: matrix: coin: [monero, wownero] needs: [lib_macos] runs-on: macos-15 steps: - uses: denoland/setup-deno@v2 with: deno-version: v2.x - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - uses: actions/download-artifact@v4 with: pattern: macos-${{ matrix.coin }}-* path: temp-macos-${{ matrix.coin }} merge-multiple: true - name: Setup release directory run: | mkdir -p release/${{ matrix.coin }} cp -r temp-macos-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run integration tests run: COIN="${{ matrix.coin }}" deno test -A tests/integration.test.ts env: SECRET_WALLET_PASSWORD: ${{ secrets.SECRET_WALLET_PASSWORD }} SECRET_WALLET_MNEMONIC: ${{ secrets.SECRET_WALLET_MNEMONIC }} SECRET_WALLET_RESTORE_HEIGHT: ${{ secrets.SECRET_WALLET_RESTORE_HEIGHT }} comment_pr: name: comment on pr runs-on: ubuntu-latest needs: [lib_mingw, lib_android, lib_linux, lib_macos, lib_ios] steps: - uses: actions/github-script@v7 continue-on-error: true id: get_issue_number with: script: | if (context.issue.number) { // Return issue number if present return context.issue.number; } else { // Otherwise return issue number from commit return ( await github.rest.repos.listPullRequestsAssociatedWithCommit({ commit_sha: context.sha, owner: context.repo.owner, repo: context.repo.repo, }) ).data[0].number; } result-encoding: string - name: Find Comment continue-on-error: true uses: peter-evans/find-comment@v3 id: fc with: issue-number: ${{steps.get_issue_number.outputs.result}} comment-author: 'github-actions[bot]' body-includes: download artifacts - name: Update comment continue-on-error: true if: steps.fc.outcome == 'success' uses: peter-evans/create-or-update-comment@v4 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{steps.get_issue_number.outputs.result}} body: | [download artifacts #${{github.run_id}}](https://nightly.link/MrCyjaneK/monero_c/actions/runs/${{github.run_id}}) edit-mode: replace - name: Create comment continue-on-error: true if: steps.fc.outcome == 'failure' uses: peter-evans/create-or-update-comment@v4 with: issue-number: ${{steps.get_issue_number.outputs.result}} body: | [download artifacts #${{github.run_id}}](https://nightly.link/MrCyjaneK/monero_c/actions/runs/${{github.run_id}}) (this comment will update whenever you push)