Skip to content

Support fixCleanup3_4_0 signing prefixes (Sponsor) (#3462) #9204

Support fixCleanup3_4_0 signing prefixes (Sponsor) (#3462)

Support fixCleanup3_4_0 signing prefixes (Sponsor) (#3462) #9204

Workflow file for this run

# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI
env:
GIT_REF: ${{ inputs.git_ref || github.ref }}
on:
push:
branches: [main]
tags:
- "**"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:
workflow_call:
inputs:
git_ref:
description: "Git ref to checkout (branch, tag, or commit SHA)"
required: true
type: string
run_unit_tests:
description: "Run unit tests job"
required: false
type: boolean
default: true
run_integration_tests:
description: "Run integration tests job"
required: false
type: boolean
default: true
run_browser_tests:
description: "Run browser tests job"
required: false
type: boolean
default: true
secrets:
GITLAB_REGISTRY_TOKEN:
description: "GitLab deploy token with read_registry access"
required: false
jobs:
resolve_xrpld_image:
runs-on: ubuntu-latest
timeout-minutes: 2
permissions:
contents: read
outputs:
image: ${{ steps.resolve.outputs.image }}
is_private: ${{ steps.resolve.outputs.is_private }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}
- name: Resolve xrpld image
id: resolve
env:
IMAGE_CONFIG_FILE: .github/xrpld-image.env
DEFAULT_IMAGE: rippleci/xrpld:develop
PRIVATE_IMAGE_REPO: registry.gitlab.com/ripple/xrpledger/xrpld_package_deploy/xrpld-private
GITLAB_REGISTRY_USERNAME: ${{ vars.GITLAB_REGISTRY_USERNAME }}
GITLAB_REGISTRY_TOKEN: ${{ secrets.GITLAB_REGISTRY_TOKEN }}
run: |
set -euo pipefail
# Read the requested private version from the committed config file.
# The file is never sourced: on fork pull requests its contents are
# untrusted, so we only extract the value and validate it strictly.
PRIVATE_VERSION=""
if [[ -f "${IMAGE_CONFIG_FILE}" ]]; then
RAW_LINE="$(grep -E '^[[:space:]]*XRPLD_PRIVATE_VERSION[[:space:]]*=' "${IMAGE_CONFIG_FILE}" | tail -n1 || true)"
PRIVATE_VERSION="$(printf '%s' "${RAW_LINE#*=}" | tr -d "[:space:]\"'")"
fi
if [[ -z "${PRIVATE_VERSION}" ]]; then
echo "No private xrpld version configured in ${IMAGE_CONFIG_FILE}; using default image ${DEFAULT_IMAGE}."
{
echo "image=${DEFAULT_IMAGE}"
echo "is_private=false"
} >> "${GITHUB_OUTPUT}"
exit 0
fi
if ! [[ "${PRIVATE_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-(b|rc)[0-9]+)?$ ]]; then
echo "XRPLD_PRIVATE_VERSION in ${IMAGE_CONFIG_FILE} must use X.Y.Z, X.Y.Z-bN, or X.Y.Z-rcN format (got '${PRIVATE_VERSION}')." >&2
exit 1
fi
if [[ -z "${GITLAB_REGISTRY_USERNAME}" || -z "${GITLAB_REGISTRY_TOKEN}" ]]; then
echo "A private xrpld version (${PRIVATE_VERSION}) is configured but the GITLAB_REGISTRY_USERNAME variable and GITLAB_REGISTRY_TOKEN secret are unavailable. These are not exposed to fork pull requests; run the private build from a branch in this repository, or clear XRPLD_PRIVATE_VERSION to use the default image." >&2
exit 1
fi
echo "Using private xrpld image for version ${PRIVATE_VERSION}."
{
echo "image=${PRIVATE_IMAGE_REPO}:private-${PRIVATE_VERSION}"
echo "is_private=true"
} >> "${GITHUB_OUTPUT}"
build-and-lint:
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
node-version: [24.x]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}
fetch-depth: 0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Setup npm version 10
run: |
npm i -g npm@10 --registry=https://registry.npmjs.org
- name: Cache node modules
id: cache-nodemodules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
# caching node_modules
path: |
node_modules
*/*/node_modules
key: ${{ runner.os }}-deps-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-deps-${{ matrix.node-version }}-
- name: Install Dependencies
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
run: npm ci
- run: npm run build
- run: npm run lint
unit:
if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_unit_tests != false }}
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
node-version: [20.x, 22.x, 24.x]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}
fetch-depth: 0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Setup npm version 10
run: |
npm i -g npm@10 --registry=https://registry.npmjs.org
- name: Cache node modules
id: cache-nodemodules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
# caching node_modules
path: |
node_modules
*/*/node_modules
key: ${{ runner.os }}-deps-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-deps-${{ matrix.node-version }}-
- name: Install Dependencies
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
run: npm ci
- run: npm run build
- run: npm test
integration:
if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_integration_tests != false }}
needs: resolve_xrpld_image
runs-on: ubuntu-latest
timeout-minutes: 10
env:
XRPLD_DOCKER_IMAGE: ${{ needs.resolve_xrpld_image.outputs.image }}
strategy:
matrix:
node-version: [20.x, 22.x, 24.x]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}
fetch-depth: 0
- name: Log in to the private GitLab registry
if: ${{ needs.resolve_xrpld_image.outputs.is_private == 'true' }}
env:
GITLAB_REGISTRY_USERNAME: ${{ vars.GITLAB_REGISTRY_USERNAME }}
GITLAB_REGISTRY_TOKEN: ${{ secrets.GITLAB_REGISTRY_TOKEN }}
run: |
printf '%s' "${GITLAB_REGISTRY_TOKEN}" | docker login registry.gitlab.com \
--username "${GITLAB_REGISTRY_USERNAME}" \
--password-stdin
- name: Run docker in background
run: |
docker run \
--detach \
--publish 6006:6006 \
--volume "${{ github.workspace }}/.ci-config/":"/etc/xrpld/" \
--name xrpld-service \
"${XRPLD_DOCKER_IMAGE}" --standalone
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Setup npm version 10
run: |
npm i -g npm@10 --registry=https://registry.npmjs.org
- name: Cache node modules
id: cache-nodemodules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
# caching node_modules
path: |
node_modules
*/*/node_modules
key: ${{ runner.os }}-deps-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-deps-${{ matrix.node-version }}-
- name: Install Dependencies
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
run: npm ci
- run: npm run build
- name: Run integration test
run: npm run test:integration
- name: Stop docker container
if: always()
run: docker logs xrpld-service && docker stop xrpld-service
browser:
if: ${{ github.event_name != 'workflow_dispatch' || inputs.run_browser_tests != false }}
needs: resolve_xrpld_image
runs-on: ubuntu-latest
timeout-minutes: 10
env:
XRPLD_DOCKER_IMAGE: ${{ needs.resolve_xrpld_image.outputs.image }}
strategy:
matrix:
node-version: [24.x]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}
fetch-depth: 0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Log in to the private GitLab registry
if: ${{ needs.resolve_xrpld_image.outputs.is_private == 'true' }}
env:
GITLAB_REGISTRY_USERNAME: ${{ vars.GITLAB_REGISTRY_USERNAME }}
GITLAB_REGISTRY_TOKEN: ${{ secrets.GITLAB_REGISTRY_TOKEN }}
run: |
printf '%s' "${GITLAB_REGISTRY_TOKEN}" | docker login registry.gitlab.com \
--username "${GITLAB_REGISTRY_USERNAME}" \
--password-stdin
- name: Run docker in background
run: |
docker run \
--detach \
--publish 6006:6006 \
--volume "${{ github.workspace }}/.ci-config/":"/etc/xrpld/" \
--name xrpld-service \
"${XRPLD_DOCKER_IMAGE}" --standalone
- name: Setup npm version 10
run: |
npm i -g npm@10 --registry=https://registry.npmjs.org
- name: Cache node modules
id: cache-nodemodules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
# caching node_modules
path: |
node_modules
*/*/node_modules
key: ${{ runner.os }}-deps-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-deps-${{ matrix.node-version }}-
- name: Install Dependencies
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
run: npm ci
- run: npm run build
- name: Run integration test
run: npm run test:browser
- name: Stop docker container
if: always()
run: docker logs xrpld-service && docker stop xrpld-service