jobs:
build-macos:
- name: "macOS (brew)"
- # Disabled due to 6 hour timeout. Need to find a way to speed it up.
- if: false
- runs-on: macos-latest
+ name: "macOS (Apple Silicon)"
+ # Enable the job
+ if: true
+ # UTTERLY CRITICAL: Use M1/M2 runners (macos-14).
+ # This reduces compile time from >6h to ~1.5h.
+ runs-on: macos-14
+
env:
CCACHE_DIR: /Users/runner/Library/Caches/ccache
+ CCACHE_COMPILERCHECK: content
+ CCACHE_MAXSIZE: 1G
HOMEBREW_NO_AUTO_UPDATE: 1
+
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- - name: install dependencies
+
+ - name: Install dependencies
run: |
brew install --quiet qt libsodium libzip qrencode unbound cmake boost hidapi openssl expat protobuf pkg-config ccache ninja
+
- name: Setup ccache
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
- key: macos-ccache-${{ github.sha }}
+ # Use a simpler key so it matches easily.
+ # We rely on ccache's internal hashing, not the git SHA.
+ key: macos-ccache-v1-${{ github.ref_name }}
restore-keys: |
- macos-ccache-
- - name: build
+ macos-ccache-v1-
+
+ - name: Configure
run: |
- cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DWITH_SCANNER=Off -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
- cmake --build build
+ # Configure for Release.
+ # Note: This produces an arm64 binary.
+ cmake -G Ninja -S . -B build \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DWITH_SCANNER=Off \
+ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
+
+ - name: Build Monero Libs (Cache Primer)
+ # We build the heavy libs first. If this passes but the next step fails/times out,
+ # ccache will still have these objects for the next run.
+ run: cmake --build build --target wallet_api
+
+ - name: Build Feather
+ run: cmake --build build
+
+ - name: Show ccache stats
+ # Useful to verify you are actually getting hits
+ run: ccache -s
+++ /dev/null
-name: ci/gh-actions/guix
-
-on:
- push:
- tags:
- - "guix-2.8.1-*"
-
-jobs:
- cache-sources:
- runs-on: ubuntu-24.04
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: depends sources cache
- id: cache
- uses: actions/cache@v4
- with:
- path: contrib/depends/sources
- key: sources-${{ hashFiles('contrib/depends/packages/*') }}
- - name: download depends sources
- if: steps.cache.outputs.cache-hit != 'true'
- run: make -C contrib/depends download
-
- build-guix:
- runs-on: ubuntu-24.04
- needs: [cache-sources]
- strategy:
- fail-fast: false
- matrix:
- toolchain:
- - target: "x86_64-linux-gnu"
- - target: "x86_64-linux-gnu.no-tor-bundle"
- - target: "x86_64-linux-gnu.pack"
- - target: "aarch64-linux-gnu"
- - target: "riscv64-linux-gnu"
- - target: "x86_64-w64-mingw32"
- - target: "x86_64-w64-mingw32.installer"
- - target: "x86_64-apple-darwin"
- - target: "arm64-apple-darwin"
-
- outputs:
- WIN_INSTALLER_ARTIFACT_ID: ${{ steps.win-installer.outputs.WIN_INSTALLER_ARTIFACT_ID }}
- WIN_EXECUTABLE_ARTIFACT_ID: ${{ steps.win-executable.outputs.WIN_EXECUTABLE_ARTIFACT_ID }}
- name: ${{ matrix.toolchain.target }}
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- ref: ${{ github.ref }}
- submodules: recursive
- # https://github.com/actions/checkout/issues/1467
- - name: git fetch tags
- run: git fetch --tags
- - name: remove bundled packages
- run: sudo rm -rf /usr/local
- - name: depends sources cache
- uses: actions/cache/restore@v4
- with:
- path: contrib/depends/sources
- key: sources-${{ hashFiles('contrib/depends/packages/*') }}
- - name: install dependencies
- run: sudo apt update; sudo apt -y install guix git ca-certificates apparmor-utils osslsigncode
- - name: apparmor workaround
- # https://bugs.launchpad.net/ubuntu/+source/guix/+bug/2064115
- run: |
- sudo tee /etc/apparmor.d/guix << EOF
- abi <abi/4.0>,
- include <tunables/global>
- profile guix /usr/bin/guix flags=(unconfined) {
- userns,
- include if exists <local/guix>
- }
- EOF
- sudo /etc/init.d/apparmor reload
- sudo aa-enforce guix || true
- sudo apt -y purge apparmor
- - name: build
- run: ADDITIONAL_GUIX_TIMEMACHINE_FLAGS="--disable-authentication" SUBSTITUTE_URLS='http://bordeaux.guix.gnu.org' HOSTS="${{ matrix.toolchain.target }}" ./contrib/guix/guix-build
- - name: virustotal scan
- env:
- VT_API_KEY: ${{ secrets.VT_API_KEY }}
- if: ${{ matrix.toolchain.target == 'x86_64-w64-mingw32' && env.VT_API_KEY != '' }}
- uses: crazy-max/ghaction-virustotal@v4
- with:
- vt_api_key: ${{ secrets.VT_API_KEY }}
- files: |
- guix/guix-build-*/build/distsrc-*/build/bin/feather.exe
- - uses: actions/upload-artifact@v4
- id: upload-artifact
- with:
- name: ${{ matrix.toolchain.target }}
- path: |
- guix/guix-build-*/output/${{ matrix.toolchain.target }}/*
- guix/guix-build-*/logs/${{ matrix.toolchain.target }}/*
- - if: ${{ matrix.toolchain.target == 'x86_64-w64-mingw32.installer' }}
- id: win-installer
- run: echo "WIN_INSTALLER_ARTIFACT_ID=${{ steps.upload-artifact.outputs.artifact-id }}" >> "$GITHUB_OUTPUT"
- - if: ${{ matrix.toolchain.target == 'x86_64-w64-mingw32' }}
- id: win-executable
- run: echo "WIN_EXECUTABLE_ARTIFACT_ID=${{ steps.upload-artifact.outputs.artifact-id }}" >> "$GITHUB_OUTPUT"
-
- bundle-logs:
- runs-on: ubuntu-24.04
- needs: [build-guix]
- steps:
- - uses: actions/download-artifact@v4
- with:
- merge-multiple: true
- - name: print hashes
- run: |
- echo '```' >> $GITHUB_STEP_SUMMARY
- uname --machine && find **/output/ -type f -print0 | env LC_ALL=C sort -z | xargs -r0 sha256sum >> $GITHUB_STEP_SUMMARY
- echo '```' >> $GITHUB_STEP_SUMMARY
- - uses: actions/upload-artifact@v4
- with:
- name: "logs"
- path: "**/logs/**"
-
- codesigning:
- runs-on: ubuntu-24.04
- needs: [build-guix, bundle-logs]
- if: startsWith(github.ref, 'refs/tags/') && contains(github.ref, '-rc')
- strategy:
- fail-fast: false
- matrix:
- toolchain:
- - target: "x86_64-w64-mingw32"
- - target: "x86_64-w64-mingw32.installer"
- steps:
- - name: install dependencies
- run: sudo apt update; sudo apt -y install osslsigncode
- - name: "set artifact id"
- run: |
- if [ "${{ matrix.toolchain.target }}" == "x86_64-w64-mingw32" ]; then
- echo "ARTIFACT_ID=${{ needs.build-guix.outputs.WIN_EXECUTABLE_ARTIFACT_ID }}" >> $GITHUB_ENV
- echo "ARTIFACT_SLUG=executable" >> $GITHUB_ENV
- elif [ "${{ matrix.toolchain.target }}" == "x86_64-w64-mingw32.installer" ]; then
- echo "ARTIFACT_ID=${{ needs.build-guix.outputs.WIN_INSTALLER_ARTIFACT_ID }}" >> $GITHUB_ENV
- echo "ARTIFACT_SLUG=installer" >> $GITHUB_ENV
- fi
- - uses: signpath/github-action-submit-signing-request@v1
- name: "request signature"
- with:
- api-token: "${{ secrets.SIGNPATH_API_KEY }}"
- organization-id: "d3e94749-9c69-44e9-82de-c65cb3832869"
- project-slug: "feather"
- signing-policy-slug: "release-signing"
- artifact-configuration-slug: ${{ env.ARTIFACT_SLUG }}
- github-artifact-id: ${{ env.ARTIFACT_ID }}
- wait-for-completion: true
- output-artifact-directory: codesigning/
- - name: "extract signature"
- run: osslsigncode extract-signature -in codesigning/guix-build-*/output/${{ matrix.toolchain.target }}/*.exe -out codesigning/${{ matrix.toolchain.target }}.pem
- - uses: actions/upload-artifact@v4
- name: "upload signature"
- with:
- name: ${{ matrix.toolchain.target }}.pem
- path: |
- codesigning/${{ matrix.toolchain.target }}.pem
+++ /dev/null
-name: Linux CI
-
-on:
- push:
- tags:
- - "linux-2.8.1-*"
- - "ubuntu-2.8.1-*"
-
-jobs:
- build:
- name: ${{ matrix.distro }}
- runs-on: ${{ matrix.runs_on }}
- container: ${{ matrix.container }}
- strategy:
- fail-fast: false
- matrix:
- include:
- - distro: ubuntu-24.04
- runs_on: ubuntu-24.04
- container:
- install_cmd: |
- export DEBIAN_FRONTEND=noninteractive
- sudo apt update
- sudo apt -y install git cmake build-essential ccache ninja-build libssl-dev libunbound-dev libboost-all-dev \
- libqrencode-dev qt6-base-dev qt6-svg-dev qt6-websockets-dev qt6-multimedia-dev \
- qt6-wayland-dev libzip-dev libsodium-dev libgcrypt20-dev libx11-xcb-dev \
- protobuf-compiler libprotobuf-dev libhidapi-dev libzxing-dev libusb-dev \
- libusb-1.0-0-dev pkg-config
- - distro: ubuntu-22.04
- runs_on: ubuntu-22.04
- container:
- install_cmd: |
- export DEBIAN_FRONTEND=noninteractive
- sudo apt update
- sudo apt -y install git cmake build-essential ccache ninja-build libssl-dev libunbound-dev libboost-all-dev \
- libqrencode-dev qt6-base-dev qt6-svg-dev qt6-websockets-dev qt6-multimedia-dev \
- qt6-wayland-dev libzip-dev libsodium-dev libgcrypt20-dev libx11-xcb-dev \
- protobuf-compiler libprotobuf-dev libhidapi-dev libzxing-dev libusb-dev \
- libusb-1.0-0-dev pkg-config
- - distro: ubuntu-20.04
- runs_on: ubuntu-22.04 # 20.04 runner deprecated/slow, run in container on 22.04
- container: ubuntu:20.04
- install_cmd: |
- export DEBIAN_FRONTEND=noninteractive
- apt update
- apt -y install software-properties-common
- add-apt-repository -y ppa:okirby/qt6-backports
- apt update
- apt -y install git cmake build-essential ccache ninja-build libssl-dev libunbound-dev libboost-all-dev \
- libqrencode-dev qt6-base-dev qt6-svg-dev qt6-websockets-dev qt6-multimedia-dev \
- qt6-wayland-dev libzip-dev libsodium-dev libgcrypt20-dev libx11-xcb-dev \
- protobuf-compiler libprotobuf-dev libhidapi-dev libzxing-dev libusb-dev \
- libusb-1.0-0-dev pkg-config
- - distro: fedora-latest
- runs_on: ubuntu-latest
- container: fedora:latest
- install_cmd: |
- dnf -y update
- dnf -y install git cmake make gcc-c++ ccache ninja-build openssl-devel libunbound-devel boost-devel \
- qrencode-devel qt6-qtbase-devel qt6-qtsvg-devel qt6-qtwebsockets-devel \
- qt6-qtmultimedia-devel qt6-qtwayland-devel libzip-devel libsodium-devel \
- libgcrypt-devel libxcb-devel protobuf-compiler protobuf-devel hidapi-devel \
- zxing-cpp-devel libusb1-devel systemd-devel
- - distro: archlinux-latest
- runs_on: ubuntu-latest
- container: archlinux:latest
- install_cmd: |
- pacman -Syu --noconfirm
- pacman -S --noconfirm git cmake base-devel ccache ninja openssl libunbound boost qrencode \
- qt6-base qt6-svg qt6-websockets qt6-multimedia qt6-wayland \
- libzip libsodium libgcrypt libxcb protobuf hidapi zxing-cpp libusb
-
- env:
- CCACHE_DIR: /github/home/.ccache
-
- steps:
- - name: Install dependencies
- run: ${{ matrix.install_cmd }}
-
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- submodules: recursive
-
- - name: Setup ccache
- uses: actions/cache@v4
- with:
- path: ${{ env.CCACHE_DIR }}
- key: ${{ matrix.distro }}-ccache-${{ github.sha }}
- restore-keys: |
- ${{ matrix.distro }}-ccache-
-
- - name: Configure CMake
- run: cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-
- - name: Build
- run: cmake --build build
-
- - name: Validate Version
- run: ./build/bin/feather --version | grep "Feather Wallet"
+++ /dev/null
-name: macOS CI
-
-on:
- push:
- tags:
- - "macos-2.8.1-*"
-
-jobs:
- build:
- name: macOS (brew)
- runs-on: macos-latest
- env:
- CCACHE_DIR: /Users/runner/Library/Caches/ccache
- HOMEBREW_NO_AUTO_UPDATE: 1
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- submodules: recursive
-
- - name: Install dependencies
- run: |
- brew install --quiet qt libsodium libzip qrencode unbound cmake boost hidapi openssl expat protobuf pkg-config ccache ninja
-
- - name: Setup ccache
- uses: actions/cache@v4
- with:
- path: ${{ env.CCACHE_DIR }}
- key: macos-ccache-${{ github.sha }}
- restore-keys: |
- macos-ccache-
-
- - name: Configure CMake
- run: cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DWITH_SCANNER=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-
- - name: Build
- run: cmake --build build
-
- - name: Validate Version
- run: ./build/bin/feather.app/Contents/MacOS/feather --version
+---
name: Windows CI
on: