name: CI on: push: branches: - "master" pull_request: branches: - "*" merge_group: branches: - "master" concurrency: # Cancel any previous workflows if they are from a PR or push. group: ${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true defaults: run: shell: bash env: BITCOIN_VERSION: "28" # TRANCHES defines the number of tranches used in the itests. TRANCHES: 16 # SMALL_TRANCHES defines the number of tranches used in the less stable itest # builds # # TODO(yy): remove this value and use TRANCHES. SMALL_TRANCHES: 8 # If you change this please also update GO_VERSION in Makefile (then run # `make lint` to see where else it needs to be updated as well). GO_VERSION: 1.22.11 jobs: ######################## # SQLC code gen check ######################## sqlc-check: name: Sqlc check runs-on: ubuntu-latest steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' - name: docker image cache uses: satackey/action-docker-layer-caching@v0.0.11 # Ignore the failure of a step and avoid terminating the job. continue-on-error: true - name: Generate sql models run: make sqlc-check ######################## # RPC and mobile compilation check ######################## rpc-check: name: RPC and mobile compilation check runs-on: ubuntu-latest steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' - name: run check run: make rpc-check - name: run JSON/WASM stub compilation check run: make rpc-js-compile - name: build mobile RPC bindings run: make mobile-rpc - name: build mobile specific code run: go build --tags="mobile" ./mobile ######################## # check commits ######################## check-commits: if: github.event_name == 'pull_request' name: check commits runs-on: ubuntu-latest steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' - name: fetch and rebase on ${{ github.base_ref }} uses: ./.github/actions/rebase - name: check commits run: scripts/check-each-commit.sh upstream/${{ github.base_ref }} ######################## # lint code ######################## lint: name: lint code runs-on: ubuntu-latest steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' - name: check code format run: make fmt-check - name: check go modules tidiness run: make tidy-module-check - name: lint proto files run: make protolint - name: lint run: GOGC=50 make lint ######################## # cross compilation ######################## cross-compile: name: cross compilation runs-on: ubuntu-latest strategy: fail-fast: true matrix: # Please keep this list in sync with make/release_flags.mk! include: - name: i386 sys: freebsd-386 linux-386 windows-386 - name: amd64 sys: darwin-amd64 freebsd-amd64 linux-amd64 netbsd-amd64 openbsd-amd64 windows-amd64 - name: arm sys: darwin-arm64 freebsd-arm linux-armv6 linux-armv7 linux-arm64 windows-arm steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: cross-compile use-build-cache: 'no' - name: build release for all architectures run: make release sys="${{ matrix.sys }}" ######################## # sample configuration check ######################## sample-conf-check: name: sample configuration check runs-on: ubuntu-latest steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' - name: check default values in sample-lnd.conf file run: make sample-conf-check ######################## # run unit tests ######################## unit-test: name: run unit tests runs-on: ubuntu-latest strategy: # Allow other tests in the matrix to continue if one fails. fail-fast: false matrix: unit_type: - btcd unit-cover - unit tags="kvdb_etcd" - unit tags="kvdb_postgres" - unit tags="kvdb_sqlite" - btcd unit-race - unit-module steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: fetch and rebase on ${{ github.base_ref }} if: github.event_name == 'pull_request' uses: ./.github/actions/rebase - name: git checkout fuzzing seeds uses: actions/checkout@v4 with: repository: lightninglabs/lnd-fuzz path: lnd-fuzz - name: rsync fuzzing seeds run: rsync -a --ignore-existing lnd-fuzz/ ./ - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: unit-test - name: install bitcoind run: ./scripts/install_bitcoind.sh $BITCOIN_VERSION - name: run ${{ matrix.unit_type }} run: make ${{ matrix.unit_type }} - name: Send coverage uses: ziggie1984/actions-goveralls@c440f43938a4032b627d2b03d61d4ae1a2ba2b5c if: matrix.unit_type == 'btcd unit-cover' continue-on-error: true with: path-to-profile: coverage.txt flag-name: 'unit' parallel: true ######################## # run integration tests with TRANCHES ######################## basic-integration-test: name: basic itests runs-on: ubuntu-latest if: '!contains(github.event.pull_request.labels.*.name, ''no-itest'')' strategy: # Allow other tests in the matrix to continue if one fails. fail-fast: false matrix: include: - name: btcd args: backend=btcd cover=1 - name: bitcoind args: backend=bitcoind cover=1 - name: bitcoind-notxindex args: backend="bitcoind notxindex" - name: neutrino args: backend=neutrino cover=1 steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: fetch and rebase on ${{ github.base_ref }} if: github.event_name == 'pull_request' uses: ./.github/actions/rebase - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: integration-test - name: install bitcoind run: ./scripts/install_bitcoind.sh $BITCOIN_VERSION - name: run ${{ matrix.name }} run: make itest-parallel tranches=${{ env.TRANCHES }} ${{ matrix.args }} shuffleseed=${{ github.run_id }}${{ strategy.job-index }} - name: Send coverage if: ${{ contains(matrix.args, 'cover=1') }} continue-on-error: true uses: ziggie1984/actions-goveralls@c440f43938a4032b627d2b03d61d4ae1a2ba2b5c with: path-to-profile: coverage.txt flag-name: 'itest-${{ matrix.name }}' parallel: true - name: Zip log files on failure if: ${{ failure() }} timeout-minutes: 5 # timeout after 5 minute run: 7z a logs-itest-${{ matrix.name }}.zip itest/**/*.log itest/postgres.log - name: Upload log files on failure uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: logs-itest-${{ matrix.name }} path: logs-itest-${{ matrix.name }}.zip retention-days: 5 ######################## # run integration tests with SMALL_TRANCHES ######################## integration-test: name: itests runs-on: ubuntu-latest if: '!contains(github.event.pull_request.labels.*.name, ''no-itest'')' strategy: # Allow other tests in the matrix to continue if one fails. fail-fast: false matrix: include: - name: bitcoind-rpcpolling args: backend="bitcoind rpcpolling" - name: bitcoind-etcd args: backend=bitcoind dbbackend=etcd - name: bitcoind-sqlite args: backend=bitcoind dbbackend=sqlite - name: bitcoind-sqlite-nativesql args: backend=bitcoind dbbackend=sqlite nativesql=true - name: bitcoind-postgres args: backend=bitcoind dbbackend=postgres - name: bitcoind-postgres-nativesql args: backend=bitcoind dbbackend=postgres nativesql=true steps: - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: fetch and rebase on ${{ github.base_ref }} if: github.event_name == 'pull_request' uses: ./.github/actions/rebase - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: integration-test - name: install bitcoind run: ./scripts/install_bitcoind.sh $BITCOIN_VERSION - name: run ${{ matrix.name }} run: make itest-parallel tranches=${{ env.SMALL_TRANCHES }} ${{ matrix.args }} shuffleseed=${{ github.run_id }}${{ strategy.job-index }} - name: Send coverage if: ${{ contains(matrix.args, 'cover=1') }} continue-on-error: true uses: shogo82148/actions-goveralls@v1 with: path-to-profile: coverage.txt flag-name: 'itest-${{ matrix.name }}' parallel: true - name: Zip log files on failure if: ${{ failure() }} timeout-minutes: 5 # timeout after 5 minute run: 7z a logs-itest-${{ matrix.name }}.zip itest/**/*.log - name: Upload log files on failure uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: logs-itest-${{ matrix.name }} path: logs-itest-${{ matrix.name }}.zip retention-days: 5 ######################## # run windows integration test ######################## windows-integration-test: name: windows itest runs-on: windows-latest if: '!contains(github.event.pull_request.labels.*.name, ''no-itest'')' steps: - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: fetch and rebase on ${{ github.base_ref }} if: github.event_name == 'pull_request' uses: ./.github/actions/rebase - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: integration-test - name: run itest run: make itest-parallel tranches=${{ env.SMALL_TRANCHES }} windows=1 shuffleseed=${{ github.run_id }} - name: kill any remaining lnd processes if: ${{ failure() }} shell: powershell run: taskkill /IM lnd-itest.exe /T /F - name: Zip log files on failure if: ${{ failure() }} timeout-minutes: 5 # timeout after 5 minute run: 7z a logs-itest-windows.zip itest/**/*.log - name: Upload log files on failure uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: logs-itest-windows path: logs-itest-windows.zip retention-days: 5 ######################## # run macOS integration test ######################## macos-integration-test: name: macOS itest runs-on: macos-14 if: '!contains(github.event.pull_request.labels.*.name, ''no-itest'')' steps: - name: git checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: fetch and rebase on ${{ github.base_ref }} if: github.event_name == 'pull_request' uses: ./.github/actions/rebase - name: setup go ${{ env.GO_VERSION }} uses: ./.github/actions/setup-go with: go-version: '${{ env.GO_VERSION }}' key-prefix: integration-test - name: run itest run: make itest-parallel tranches=${{ env.SMALL_TRANCHES }} shuffleseed=${{ github.run_id }} - name: Zip log files on failure if: ${{ failure() }} timeout-minutes: 5 # timeout after 5 minute run: 7z a logs-itest-macos.zip itest/**/*.log - name: Upload log files on failure uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: logs-itest-macos path: logs-itest-macos.zip retention-days: 5 ######################## # check pinned dependencies ######################## dep-pin: name: check pinned dependencies runs-on: ubuntu-latest strategy: # Allow other tests in the matrix to continue if one fails. fail-fast: false matrix: pinned_dep: - google.golang.org/grpc v1.59.0 - github.com/golang/protobuf v1.5.3 steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: ensure dependencies at correct version run: if ! grep -q "${{ matrix.pinned_dep }}" go.mod; then echo dependency ${{ matrix.pinned_dep }} should not be altered ; exit 1 ; fi ######################## # check PR updates release notes ######################## milestone-check: name: check release notes updated runs-on: ubuntu-latest if: '!contains(github.event.pull_request.labels.*.name, ''no-changelog'')' steps: - name: cleanup space run: rm -rf /opt/hostedtoolcache - name: git checkout uses: actions/checkout@v4 - name: release notes check run: scripts/check-release-notes.sh # Notify about the completion of all coverage collecting jobs. finish: if: ${{ always() }} needs: [unit-test, basic-integration-test] runs-on: ubuntu-latest steps: - uses: ziggie1984/actions-goveralls@c440f43938a4032b627d2b03d61d4ae1a2ba2b5c with: parallel-finished: true