diff --git a/.github/workflows/validation.yaml b/.github/workflows/validation.yaml index 972fe21f0..b328ffe78 100644 --- a/.github/workflows/validation.yaml +++ b/.github/workflows/validation.yaml @@ -398,16 +398,75 @@ jobs: run: | sh -x ./test/test_nodebuilder --ref "${GITHUB_SHA}" [ "$?" -gt 0 ] && echo "test_nodebuilder exited with status $?" >&2 && exit 1 - [ -f "/home/bitcoin/.bitcoin/debug.log" ] && cp "/home/bitcoin/.bitcoin/debug.log" . - find / -name debug.log 2> /dev/null | grep bitcoin || true + [ -f '/home/bitcoin/.bitcoin/debug.log' ] && cp '/home/bitcoin/.bitcoin/debug.log' . - name: Save Bitcoin Core log as artifact uses: actions/upload-artifact@v4 with: name: openbsd-source-bitcoin-debug.log path: /home/runner/work/nodebuilder/nodebuilder/debug.log + + run-nodebuilder-qemu: + name: Test ${{ matrix.job-purpose }} on ${{ matrix.arch }} ${{ matrix.distro }} + needs: [changes, shell-lint, yaml-lint] + if: >- + ${{ + github.event.action == 'prerelease' || + github.event.action == 'published' || + needs.changes.outputs.ci == 'true' || + needs.changes.outputs.dependencies == 'true' || + needs.changes.outputs.shell == 'true' + }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 5 + matrix: + arch: [aarch64, riscv64] + distro: [alpine_latest, ubuntu_latest] + job-purpose: [source, package] + include: + - job-purpose: package + additional-args: '' + - job-purpose: source + distro: alpine_latest + additional-args: '--compile --jobs 1' + - job-purpose: source + distro: ubuntu_latest + additional-args: '--compile' + exclude: + - distro: alpine_latest + job-purpose: package + steps: + - uses: actions/checkout@v4 + - name: Test the console output ${{ matrix.additional-args }} + uses: uraimo/run-on-arch-action@v2 + timeout-minutes: 330 + with: + arch: ${{ matrix.arch }} + distro: ${{ matrix.distro }} + dockerRunArgs: --volume "${PWD}/artifacts:/artifacts" + githubToken: ${{ github.token }} + setup: | + echo "${TERM:-TERM is not found}" + nproc + uname -a + id -u + df -h + tput colors + date -u + mkdir -p "${PWD}/artifacts" + run: | + /bin/sh -x ./test/test_nodebuilder --ref "${GITHUB_SHA}" ${{ matrix.additional-args }} + [ -f /root/.bitcoin/debug.log ] && cp /root/.bitcoin/debug.log /artifacts/ + chmod o+r /artifacts/debug.log + - name: Save Bitcoin Core log as artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.distro }}-${{ matrix.arch }}--${{ matrix.job-purpose }}-bitcoin-debug.log + path: /home/runner/work/nodebuilder/nodebuilder/artifacts/debug.log run-nodebuilder-docker: - name: Docker image for ${{ matrix.container }} + name: Build docker image for ${{ matrix.container }} needs: [changes, dockerfile-lint, shell-lint, yaml-lint] if: >- github.event.action != 'prerelease' && diff --git a/nodebuilder b/nodebuilder index a194f8409..9a211af3c 100755 --- a/nodebuilder +++ b/nodebuilder @@ -97,7 +97,10 @@ compile_bitcoin_from_source() gmake --jobs "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" > /dev/null 2>&1 ;; *) - make --jobs "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" > /dev/null 2>&1 + + log_info 'DEBUG compiling without output suppression' + make --jobs "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" + #make --jobs "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" > /dev/null 2>&1 ;; esac @@ -480,7 +483,7 @@ ensure_curl_dependency() sudo apk --quiet add --no-cache curl ;; debian | ubuntu) - sudo apt-get install -y curl > /dev/null + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y curl > /dev/null ;; fedora* | rhel | centos* | rocky | ol) sudo dnf install --allowerasing --assumeyes curl > /dev/null @@ -515,7 +518,7 @@ ensure_curl_dependency() if command -v apk > /dev/null; then sudo apk --quiet add --no-cache curl elif command -v apt-get > /dev/null; then - sudo apt-get -qq install -y curl > /dev/null + sudo DEBIAN_FRONTEND=noninteractive apt-get -qq install -y curl > /dev/null elif command -v dnf > /dev/null; then sudo dnf install --allowerasing --assumeyes curl > /dev/null elif command -v pacman > /dev/null; then @@ -546,7 +549,11 @@ ensure_sudo_dependency() apk --quiet add --no-cache sudo ;; debian | ubuntu) - apt-get install -y sudo > /dev/null + readonly STDERR_INSTALL_LOG_FILE="${TEMP_DIRECTORY}/stderr_install.log" + apt-get update > /dev/null + DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes --quiet sudo > /dev/null 2> "${STDERR_INSTALL_LOG_FILE}" + grep -v 'apt-utils' "${STDERR_INSTALL_LOG_FILE}" >&2 || true + rm "${STDERR_INSTALL_LOG_FILE}" ;; fedora* | rhel | centos* | rocky | ol) dnf install --allowerasing --assumeyes sudo > /dev/null @@ -867,7 +874,8 @@ install_build_dependencies_emerge() emerge --update --jobs "${compile_num_jobs:-${SYS_CORES_COUNT}}" --load-average "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" --quiet --quiet-build --quiet-fail --deep --newuse @world # Run the install command again printf '%s\n' "${dependencies}" | xargs emerge --autounmask-write \ - --jobs "${compile_num_jobs:-${SYS_CORES_COUNT}}" --load-average "${SYS_CORES_PLUS_ONE}" --quiet --quiet-build --quiet-fail + --jobs "${compile_num_jobs:-${SYS_CORES_COUNT}}" --load-average "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" --quiet --quiet-build --quiet-fail + --jobs "${compile_num_jobs:-${SYS_CORES_COUNT}}" --load-average "${compile_num_jobs:-${SYS_CORES_PLUS_ONE}}" --quiet --quiet-build --quiet-fail fi } @@ -1041,6 +1049,16 @@ install_runtime_dependencies_aptget() [ -z "${dependencies:-}" ] && throw_error 'The list of dependencies is empty.' sudo apt-get -qq update printf '%s\n' "${dependencies}" | xargs sudo DEBIAN_FRONTEND=noninteractive apt-get -qq install --assume-yes --no-install-recommends > /dev/null 2>&1 + case "${TARGET_ARCHITECTURE}" in + powerpc64) + # TODO: make this a CI step not in the script + sudo DEBIAN_FRONTEND=noninteractive apt-get -qq install --assume-yes --no-install-recommends libc6:ppc64el > /dev/null 2>&1 + ;; + riscv64) + sudo DEBIAN_FRONTEND=noninteractive apt-get -qq install --assume-yes --no-install-recommends libatomic1 > /dev/null 2>&1 + ;; + *) ;; + esac } install_runtime_dependencies_darwin() @@ -1249,7 +1267,8 @@ install_system_updates_aptget() { check_dpkg_lock readonly STDERR_INSTALL_LOG_FILE="${TEMP_DIRECTORY}/stderr_install.log" - sudo apt-get -qq update && sudo NEEDRESTART_MODE=a apt-get -qq dist-upgrade --assume-yes > /dev/null 2> "${STDERR_INSTALL_LOG_FILE}" + sudo apt-get -qq update && + sudo NEEDRESTART_MODE=a apt-get -qq dist-upgrade --assume-yes > /dev/null 2> "${STDERR_INSTALL_LOG_FILE}" grep -v 'apt-utils' "${STDERR_INSTALL_LOG_FILE}" >&2 || true rm "${STDERR_INSTALL_LOG_FILE}" } @@ -1611,7 +1630,13 @@ readonly BYTES_TO_KIB=1024 readonly KIB_TO_MIB="${BYTES_TO_KIB}" readonly MIB_TO_GIB="${BYTES_TO_KIB}" -TARGET_ARCHITECTURE="$(uname -m)" +TARGET_ARCHITECTURE=$(uname -m) +case "${TARGET_ARCHITECTURE}" in + ppc64le) + TARGET_ARCHITECTURE='powerpc64' + ;; + *) ;; +esac readonly TARGET_ARCHITECTURE TARGET_KERNEL="$(uname -s)" readonly TARGET_KERNEL @@ -1652,6 +1677,7 @@ if [ -z "${compile_num_jobs}" ]; then ;; esac readonly SYS_CORES_COUNT + #shellcheck disable=SC2034 readonly SYS_CORES_PLUS_ONE="$((SYS_CORES_COUNT + 1))" fi @@ -1932,9 +1958,9 @@ if [ "${ibd_status}" = 'true' ]; then log_info 'Disabling system sleep, suspend, and hibernate.' sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target > /dev/null 2>&1 fi - is_running_in_container || log_info "Close this Terminal window by clicking on the 'X'." - log_info "This info will refresh in ${SLEEP_TIME_SECONDS} seconds." + log_info "Close this Terminal window by clicking on the 'X'." fi + log_info "This info will refresh in ${SLEEP_TIME_SECONDS} seconds." sleep "${SLEEP_TIME_SECONDS}" else log_info 'Your node has already synced the blockchain.' diff --git a/test/test_nodebuilder b/test/test_nodebuilder index eae62364d..27739c068 100755 --- a/test/test_nodebuilder +++ b/test/test_nodebuilder @@ -28,9 +28,15 @@ get_operating_system() handle_exit() { kill_tail_process - [ -f nodebuilder ] && rm nodebuilder - [ -f "${STDOUT_TEST_FILENAME}" ] && rm "${STDOUT_TEST_FILENAME}" - [ -f "${STDERR_TEST_FILENAME}" ] && rm "${STDERR_TEST_FILENAME}" + if [ -f nodebuilder ]; then + rm nodebuilder + fi + if [ -f "${STDOUT_TEST_FILENAME}" ]; then + rm "${STDOUT_TEST_FILENAME}" + fi + if [ -f "${STDERR_TEST_FILENAME}" ]; then + rm "${STDERR_TEST_FILENAME}" + fi } handle_error() @@ -92,12 +98,14 @@ validate_bitcoin_version() validate_git_ref_short_name() { - [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = 'true' ] || - throw_error 'Not inside a Git repository.' "${LINENO}" - [ "$(basename "$(git rev-parse --show-toplevel)")" = 'nodebuilder' ] || - throw_error 'Not in the nodebuilder repository.' "${LINENO}" - git rev-parse --quiet --verify "$1" || - throw_error "$1 is not a valid branch, tag, or commit." "${LINENO}" + if command -v git > /dev/null 2>&1; then + [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = 'true' ] || + throw_error 'Not inside a Git repository.' "${LINENO}" + [ "$(basename "$(git rev-parse --show-toplevel)")" = 'nodebuilder' ] || + throw_error 'Not in the nodebuilder repository.' "${LINENO}" + git rev-parse --quiet --verify "$1" || + throw_error "$1 is not a valid branch, tag, or commit." "${LINENO}" + fi } readonly VALID_BITCOIN_VERSION_LIST='0.9.5 0.10.0 0.10.1 0.10.2 0.10.3 0.10.4 \ @@ -212,8 +220,7 @@ fi # Execute the script with optional command line arguments printf 'Executing command: %s\n' "${RUN_NODEBUILDER_COMMAND}" if ! ${RUN_NODEBUILDER_COMMAND} \ - > "${STDOUT_TEST_FILENAME}" \ - 2> "${STDERR_TEST_FILENAME}"; then + > "${STDOUT_TEST_FILENAME}"; then throw_error "Failed to execute nodebuilder command." fi