mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-05 04:15:51 +00:00
Compare commits
257 Commits
2.5.0-b2
...
clang_tidy
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1f5728c9e | ||
|
|
503e23055b | ||
|
|
97480ce626 | ||
|
|
bd966e636e | ||
|
|
ab34cdfc8e | ||
|
|
91b248e3b2 | ||
|
|
140ac78e15 | ||
|
|
f1bf423f69 | ||
|
|
dcf369e4ec | ||
|
|
56f4dc591c | ||
|
|
c40cd8154f | ||
|
|
989a0c8468 | ||
|
|
1adbed7913 | ||
|
|
490ec41083 | ||
|
|
384e79cd32 | ||
|
|
9edc26a2a3 | ||
|
|
08bb619964 | ||
|
|
26ef25f864 | ||
|
|
a62084a4f0 | ||
|
|
b8c298b734 | ||
|
|
cf4d5d649a | ||
|
|
eb2778ccad | ||
|
|
790402bcfb | ||
|
|
7c68770787 | ||
|
|
d9faf7a833 | ||
|
|
90ac03cae7 | ||
|
|
3a667f558c | ||
|
|
0a2930d861 | ||
|
|
e86178b523 | ||
|
|
10e15b524f | ||
|
|
402ab29a73 | ||
|
|
3df28f42ec | ||
|
|
0e8896ad06 | ||
|
|
ffd18049eb | ||
|
|
7413e02a05 | ||
|
|
0403248a8f | ||
|
|
e6b2f9cde7 | ||
|
|
2512a9c8e7 | ||
|
|
5e7f6bb5bd | ||
|
|
ae15bbd7b5 | ||
|
|
33c0737933 | ||
|
|
b26fcae690 | ||
|
|
60baaf921f | ||
|
|
f41e06061f | ||
|
|
c170c56a84 | ||
|
|
c9c392679d | ||
|
|
47f5ae5f12 | ||
|
|
6c34458d6c | ||
|
|
ec40cc93ff | ||
|
|
3681ef4e41 | ||
|
|
e2fbf56277 | ||
|
|
2d48de372b | ||
|
|
c780ef8a0b | ||
|
|
d833d36896 | ||
|
|
7a2090bc00 | ||
|
|
b5892dd139 | ||
|
|
a172d0b7ea | ||
|
|
e9ab081ab7 | ||
|
|
caedb51f00 | ||
|
|
e6abdda0a7 | ||
|
|
46c96654ee | ||
|
|
57ac234657 | ||
|
|
4232359dce | ||
|
|
8b1cab46e7 | ||
|
|
e05505aa4f | ||
|
|
73bc85864b | ||
|
|
373430924b | ||
|
|
8ad111655c | ||
|
|
0a8470758d | ||
|
|
1ec906addc | ||
|
|
afc0a358d9 | ||
|
|
af284dda37 | ||
|
|
7558348d14 | ||
|
|
0d262e74bc | ||
|
|
312e7be2b4 | ||
|
|
de9b79adf0 | ||
|
|
6c68360234 | ||
|
|
7e42507b9a | ||
|
|
36bfcc7543 | ||
|
|
4a5278a915 | ||
|
|
333b73e882 | ||
|
|
9420c506ca | ||
|
|
707427c63a | ||
|
|
5eea26d9ac | ||
|
|
226d386be2 | ||
|
|
c95d8f2f89 | ||
|
|
ed5dfc6c0e | ||
|
|
2600198bd5 | ||
|
|
c83be63b9c | ||
|
|
4aa2ca94de | ||
|
|
87565b685a | ||
|
|
e4d0c1ca48 | ||
|
|
498232baf8 | ||
|
|
43f4828a61 | ||
|
|
1a298dedd2 | ||
|
|
6c9c88e3fc | ||
|
|
156b858db7 | ||
|
|
cfffbfba9d | ||
|
|
97a938a2a9 | ||
|
|
63d664b9fb | ||
|
|
40824812d6 | ||
|
|
288ffb8fef | ||
|
|
a9cf781ca5 | ||
|
|
a446d85297 | ||
|
|
dc18aefb33 | ||
|
|
e312354016 | ||
|
|
ba905e38ae | ||
|
|
f35e5ac784 | ||
|
|
a9b02fb292 | ||
|
|
bc8a2c19aa | ||
|
|
46b86a5d61 | ||
|
|
3defcaecac | ||
|
|
d7888d5556 | ||
|
|
f518936e69 | ||
|
|
9e35f16be1 | ||
|
|
d048641242 | ||
|
|
f347a732a6 | ||
|
|
0e2ba4a64e | ||
|
|
4a4f8842bd | ||
|
|
a63805d631 | ||
|
|
b3beb50e8f | ||
|
|
0be712c363 | ||
|
|
ad5f0642ba | ||
|
|
4948882545 | ||
|
|
5778363689 | ||
|
|
d6fec5b5ff | ||
|
|
e380214496 | ||
|
|
1463b0e3e5 | ||
|
|
60bbe1eb72 | ||
|
|
b29e2e4c88 | ||
|
|
bcaa5f3392 | ||
|
|
3f0f20a542 | ||
|
|
00333a8d16 | ||
|
|
61c17400fe | ||
|
|
d43002b49a | ||
|
|
30880ad627 | ||
|
|
25e55ef952 | ||
|
|
579e6030ca | ||
|
|
d93b23206e | ||
|
|
1b63c3c315 | ||
|
|
a8e61204da | ||
|
|
bef24c1387 | ||
|
|
b6c1e2578b | ||
|
|
e0496aff5a | ||
|
|
2f7adfb883 | ||
|
|
0f1895947d | ||
|
|
fa693b2aff | ||
|
|
1825ea701f | ||
|
|
2ae5b13fb9 | ||
|
|
686a732fa8 | ||
|
|
4919b57466 | ||
|
|
44d39f335e | ||
|
|
bfe5b52a64 | ||
|
|
413b823976 | ||
|
|
e664f0b9ce | ||
|
|
907bd7a58f | ||
|
|
f94a9864f0 | ||
|
|
36ea0389e2 | ||
|
|
12640de22d | ||
|
|
ae4f2d9023 | ||
|
|
b7b61ef61d | ||
|
|
f391c3c899 | ||
|
|
562ea41a64 | ||
|
|
687b1e8887 | ||
|
|
cc506fd094 | ||
|
|
1fe323190a | ||
|
|
379a44641b | ||
|
|
18b8fc7e5c | ||
|
|
be2d915df7 | ||
|
|
57dda8ac50 | ||
|
|
5cdd8a642f | ||
|
|
8abc9c6645 | ||
|
|
24e1aa9ae5 | ||
|
|
9bee023105 | ||
|
|
4ee3ef94d9 | ||
|
|
8fcc2dfa19 | ||
|
|
123e09695e | ||
|
|
371237487b | ||
|
|
d97f19ba1d | ||
|
|
e92dbc8fce | ||
|
|
769fdab6b7 | ||
|
|
363344d36e | ||
|
|
4f7e8194f0 | ||
|
|
04c80c62f5 | ||
|
|
92fdebf590 | ||
|
|
b054a8424d | ||
|
|
162b1305e0 | ||
|
|
bdaa04d1ec | ||
|
|
6c69453bda | ||
|
|
7661ee6a3b | ||
|
|
6cabe89601 | ||
|
|
70f7635dda | ||
|
|
c8574ea42a | ||
|
|
e4fbf5131f | ||
|
|
87ee358297 | ||
|
|
27e29d0421 | ||
|
|
63ec563135 | ||
|
|
2c6f52a0ed | ||
|
|
97956b1718 | ||
|
|
ebfe4e6468 | ||
|
|
534518f13e | ||
|
|
4ed51c22d0 | ||
|
|
4364c07f1e | ||
|
|
f20efae75a | ||
|
|
67b27ee344 | ||
|
|
082f2fe21e | ||
|
|
7584a683dd | ||
|
|
f58c85d203 | ||
|
|
95698ee2de | ||
|
|
3d3db68508 | ||
|
|
7fcabd1ce7 | ||
|
|
59bb9a11ab | ||
|
|
ac5fcc7f4b | ||
|
|
3d0e722176 | ||
|
|
93add775b2 | ||
|
|
0273ba0da3 | ||
|
|
276477c494 | ||
|
|
d0b2a24a30 | ||
|
|
e44a058b13 | ||
|
|
743c9b92de | ||
|
|
35c90e64ec | ||
|
|
6e0d7a0fac | ||
|
|
d3c98ab2a8 | ||
|
|
2d172f470d | ||
|
|
a68229e9d7 | ||
|
|
cec8b29998 | ||
|
|
13524be6cc | ||
|
|
2bf582839e | ||
|
|
ed47db7d39 | ||
|
|
4994f9db92 | ||
|
|
50851aed16 | ||
|
|
4118fb2584 | ||
|
|
837a547849 | ||
|
|
b57618a211 | ||
|
|
588ed91d1b | ||
|
|
4904c4b4d4 | ||
|
|
03070d7582 | ||
|
|
b3f3259b14 | ||
|
|
357b96ab0d | ||
|
|
550f0fae85 | ||
|
|
19257f8aa9 | ||
|
|
49b4af1a56 | ||
|
|
c7600057bc | ||
|
|
0b7fd64a4c | ||
|
|
ecdea015b9 | ||
|
|
7588e9d5bf | ||
|
|
bfa17134d2 | ||
|
|
57b8ff1c49 | ||
|
|
9b69da7f91 | ||
|
|
09409fc05d | ||
|
|
561eae1b7f | ||
|
|
28062496eb | ||
|
|
3e83b54332 | ||
|
|
3e520c8742 | ||
|
|
2a147b9487 | ||
|
|
8aab33c18c | ||
|
|
aef3119efb |
@@ -16,6 +16,7 @@ coverage:
|
|||||||
#
|
#
|
||||||
# More info: https://github.com/XRPLF/clio/pull/2066
|
# More info: https://github.com/XRPLF/clio/pull/2066
|
||||||
ignore:
|
ignore:
|
||||||
|
- "benchmarks"
|
||||||
- "tests"
|
- "tests"
|
||||||
- "src/data/cassandra/"
|
- "src/data/cassandra/"
|
||||||
- "src/data/CassandraBackend.hpp"
|
- "src/data/CassandraBackend.hpp"
|
||||||
|
|||||||
38
.github/actions/build_docker_image/action.yml
vendored
38
.github/actions/build_docker_image/action.yml
vendored
@@ -5,9 +5,6 @@ inputs:
|
|||||||
images:
|
images:
|
||||||
description: Name of the images to use as a base name
|
description: Name of the images to use as a base name
|
||||||
required: true
|
required: true
|
||||||
dockerhub_repo:
|
|
||||||
description: DockerHub repository name
|
|
||||||
required: true
|
|
||||||
push_image:
|
push_image:
|
||||||
description: Whether to push the image to the registry (true/false)
|
description: Whether to push the image to the registry (true/false)
|
||||||
required: true
|
required: true
|
||||||
@@ -20,23 +17,31 @@ inputs:
|
|||||||
platforms:
|
platforms:
|
||||||
description: Platforms to build the image for (e.g. linux/amd64,linux/arm64)
|
description: Platforms to build the image for (e.g. linux/amd64,linux/arm64)
|
||||||
required: true
|
required: true
|
||||||
description:
|
build_args:
|
||||||
|
description: List of build-time variables
|
||||||
|
required: false
|
||||||
|
|
||||||
|
dockerhub_repo:
|
||||||
|
description: DockerHub repository name
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
dockerhub_description:
|
||||||
description: Short description of the image
|
description: Short description of the image
|
||||||
required: true
|
required: false
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
if: ${{ inputs.push_image == 'true' }}
|
if: ${{ inputs.push_image == 'true' && inputs.dockerhub_repo != '' }}
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
with:
|
with:
|
||||||
username: ${{ env.DOCKERHUB_USER }}
|
username: ${{ env.DOCKERHUB_USER }}
|
||||||
password: ${{ env.DOCKERHUB_PW }}
|
password: ${{ env.DOCKERHUB_PW }}
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
if: ${{ inputs.push_image == 'true' }}
|
if: ${{ inputs.push_image == 'true' }}
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@@ -45,28 +50,19 @@ runs:
|
|||||||
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||||
with:
|
with:
|
||||||
cache-image: false
|
cache-image: false
|
||||||
- uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
|
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
|
- uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
||||||
id: meta
|
id: meta
|
||||||
with:
|
with:
|
||||||
images: ${{ inputs.images }}
|
images: ${{ inputs.images }}
|
||||||
tags: ${{ inputs.tags }}
|
tags: ${{ inputs.tags }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
with:
|
with:
|
||||||
context: ${{ inputs.directory }}
|
context: ${{ inputs.directory }}
|
||||||
platforms: ${{ inputs.platforms }}
|
platforms: ${{ inputs.platforms }}
|
||||||
push: ${{ inputs.push_image == 'true' }}
|
push: ${{ inputs.push_image == 'true' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
build-args: ${{ inputs.build_args }}
|
||||||
- name: Update DockerHub description
|
|
||||||
if: ${{ inputs.push_image == 'true' }}
|
|
||||||
uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2
|
|
||||||
with:
|
|
||||||
username: ${{ env.DOCKERHUB_USER }}
|
|
||||||
password: ${{ env.DOCKERHUB_PW }}
|
|
||||||
repository: ${{ inputs.dockerhub_repo }}
|
|
||||||
short-description: ${{ inputs.description }}
|
|
||||||
readme-filepath: ${{ inputs.directory }}/README.md
|
|
||||||
|
|||||||
73
.github/actions/cmake/action.yml
vendored
Normal file
73
.github/actions/cmake/action.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
name: Run CMake
|
||||||
|
description: Run CMake to generate build files
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
build_dir:
|
||||||
|
description: Build directory
|
||||||
|
required: false
|
||||||
|
default: "build"
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
build_type:
|
||||||
|
description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
|
||||||
|
required: true
|
||||||
|
default: "Release"
|
||||||
|
integration_tests:
|
||||||
|
description: Whether to generate target integration tests
|
||||||
|
required: true
|
||||||
|
default: "true"
|
||||||
|
benchmark:
|
||||||
|
description: Whether to generate targets for benchmarks
|
||||||
|
required: true
|
||||||
|
default: "true"
|
||||||
|
code_coverage:
|
||||||
|
description: Whether to enable code coverage
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
static:
|
||||||
|
description: Whether Clio is to be statically linked
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
time_trace:
|
||||||
|
description: Whether to enable compiler trace reports
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
package:
|
||||||
|
description: Whether to generate Debian package
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Run cmake
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: "${{ inputs.build_type }}"
|
||||||
|
SANITIZER_OPTION: |-
|
||||||
|
${{ endsWith(inputs.conan_profile, '.asan') && '-Dsan=address' ||
|
||||||
|
endsWith(inputs.conan_profile, '.tsan') && '-Dsan=thread' ||
|
||||||
|
endsWith(inputs.conan_profile, '.ubsan') && '-Dsan=undefined' ||
|
||||||
|
'' }}
|
||||||
|
INTEGRATION_TESTS: "${{ inputs.integration_tests == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
BENCHMARK: "${{ inputs.benchmark == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
COVERAGE: "${{ inputs.code_coverage == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
STATIC: "${{ inputs.static == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
TIME_TRACE: "${{ inputs.time_trace == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
PACKAGE: "${{ inputs.package == 'true' && 'ON' || 'OFF' }}"
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
-B ${{inputs.build_dir}} \
|
||||||
|
-S . \
|
||||||
|
-G Ninja \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
|
||||||
|
"${SANITIZER_OPTION}" \
|
||||||
|
-Dtests=ON \
|
||||||
|
-Dintegration_tests="${INTEGRATION_TESTS}" \
|
||||||
|
-Dbenchmark="${BENCHMARK}" \
|
||||||
|
-Dcoverage="${COVERAGE}" \
|
||||||
|
-Dstatic="${STATIC}" \
|
||||||
|
-Dtime_trace="${TIME_TRACE}" \
|
||||||
|
-Dpackage="${PACKAGE}"
|
||||||
1
.github/actions/code_coverage/action.yml
vendored
1
.github/actions/code_coverage/action.yml
vendored
@@ -15,6 +15,7 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
gcovr \
|
gcovr \
|
||||||
|
-e benchmarks \
|
||||||
-e tests \
|
-e tests \
|
||||||
-e src/data/cassandra \
|
-e src/data/cassandra \
|
||||||
-e src/data/CassandraBackend.hpp \
|
-e src/data/CassandraBackend.hpp \
|
||||||
|
|||||||
38
.github/actions/conan/action.yml
vendored
Normal file
38
.github/actions/conan/action.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: Run Conan
|
||||||
|
description: Run conan to install dependencies
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
build_dir:
|
||||||
|
description: Build directory
|
||||||
|
required: false
|
||||||
|
default: "build"
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
force_conan_source_build:
|
||||||
|
description: Whether conan should build all dependencies from source
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
build_type:
|
||||||
|
description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
|
||||||
|
required: true
|
||||||
|
default: "Release"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Create build directory
|
||||||
|
shell: bash
|
||||||
|
run: mkdir -p "${{ inputs.build_dir }}"
|
||||||
|
|
||||||
|
- name: Run conan
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
CONAN_BUILD_OPTION: "${{ inputs.force_conan_source_build == 'true' && '*' || 'missing' }}"
|
||||||
|
run: |
|
||||||
|
conan \
|
||||||
|
install . \
|
||||||
|
-of build \
|
||||||
|
-b "$CONAN_BUILD_OPTION" \
|
||||||
|
-s "build_type=${{ inputs.build_type }}" \
|
||||||
|
--profile:all "${{ inputs.conan_profile }}"
|
||||||
88
.github/actions/generate/action.yml
vendored
88
.github/actions/generate/action.yml
vendored
@@ -1,88 +0,0 @@
|
|||||||
name: Run conan and cmake
|
|
||||||
description: Run conan and cmake
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
conan_profile:
|
|
||||||
description: Conan profile name
|
|
||||||
required: true
|
|
||||||
conan_cache_hit:
|
|
||||||
description: Whether conan cache has been downloaded
|
|
||||||
required: true
|
|
||||||
default: "false"
|
|
||||||
build_type:
|
|
||||||
description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
|
|
||||||
required: true
|
|
||||||
default: "Release"
|
|
||||||
build_integration_tests:
|
|
||||||
description: Whether to build integration tests
|
|
||||||
required: true
|
|
||||||
default: "true"
|
|
||||||
code_coverage:
|
|
||||||
description: Whether conan's coverage option should be on or not
|
|
||||||
required: true
|
|
||||||
default: "false"
|
|
||||||
static:
|
|
||||||
description: Whether Clio is to be statically linked
|
|
||||||
required: true
|
|
||||||
default: "false"
|
|
||||||
sanitizer:
|
|
||||||
description: Sanitizer to use
|
|
||||||
required: true
|
|
||||||
default: "false"
|
|
||||||
choices:
|
|
||||||
- "false"
|
|
||||||
- "tsan"
|
|
||||||
- "asan"
|
|
||||||
- "ubsan"
|
|
||||||
time_trace:
|
|
||||||
description: Whether to enable compiler trace reports
|
|
||||||
required: true
|
|
||||||
default: "false"
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
- name: Create build directory
|
|
||||||
shell: bash
|
|
||||||
run: mkdir -p build
|
|
||||||
|
|
||||||
- name: Run conan
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
BUILD_OPTION: "${{ inputs.conan_cache_hit == 'true' && 'missing' || '' }}"
|
|
||||||
CODE_COVERAGE: "${{ inputs.code_coverage == 'true' && 'True' || 'False' }}"
|
|
||||||
STATIC_OPTION: "${{ inputs.static == 'true' && 'True' || 'False' }}"
|
|
||||||
INTEGRATION_TESTS_OPTION: "${{ inputs.build_integration_tests == 'true' && 'True' || 'False' }}"
|
|
||||||
TIME_TRACE: "${{ inputs.time_trace == 'true' && 'True' || 'False' }}"
|
|
||||||
run: |
|
|
||||||
cd build
|
|
||||||
conan \
|
|
||||||
install .. \
|
|
||||||
-of . \
|
|
||||||
-b $BUILD_OPTION \
|
|
||||||
-s build_type="${{ inputs.build_type }}" \
|
|
||||||
-o clio:static="${STATIC_OPTION}" \
|
|
||||||
-o clio:tests=True \
|
|
||||||
-o clio:integration_tests="${INTEGRATION_TESTS_OPTION}" \
|
|
||||||
-o clio:lint=False \
|
|
||||||
-o clio:coverage="${CODE_COVERAGE}" \
|
|
||||||
-o clio:time_trace="${TIME_TRACE}" \
|
|
||||||
--profile "${{ inputs.conan_profile }}"
|
|
||||||
|
|
||||||
- name: Run cmake
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: "${{ inputs.build_type }}"
|
|
||||||
SANITIZER_OPTION: |-
|
|
||||||
${{ inputs.sanitizer == 'tsan' && '-Dsan=thread' ||
|
|
||||||
inputs.sanitizer == 'ubsan' && '-Dsan=undefined' ||
|
|
||||||
inputs.sanitizer == 'asan' && '-Dsan=address' ||
|
|
||||||
'' }}
|
|
||||||
run: |
|
|
||||||
cd build
|
|
||||||
cmake \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
|
|
||||||
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
|
|
||||||
"${SANITIZER_OPTION}" \
|
|
||||||
.. \
|
|
||||||
-G Ninja
|
|
||||||
77
.github/actions/prepare_runner/action.yml
vendored
77
.github/actions/prepare_runner/action.yml
vendored
@@ -1,77 +0,0 @@
|
|||||||
name: Prepare runner
|
|
||||||
description: Install packages, set environment variables, create directories
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
disable_ccache:
|
|
||||||
description: Whether ccache should be disabled
|
|
||||||
required: true
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
- name: Install packages on mac
|
|
||||||
if: ${{ runner.os == 'macOS' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
brew install \
|
|
||||||
bison \
|
|
||||||
ca-certificates \
|
|
||||||
ccache \
|
|
||||||
clang-build-analyzer \
|
|
||||||
conan@1 \
|
|
||||||
gh \
|
|
||||||
jq \
|
|
||||||
llvm@14 \
|
|
||||||
ninja \
|
|
||||||
pkg-config
|
|
||||||
echo "/opt/homebrew/opt/conan@1/bin" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Install CMake 3.31.6 on mac
|
|
||||||
if: ${{ runner.os == 'macOS' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
# Uninstall any existing cmake
|
|
||||||
brew uninstall cmake --ignore-dependencies || true
|
|
||||||
|
|
||||||
# Download specific cmake formula
|
|
||||||
FORMULA_URL="https://raw.githubusercontent.com/Homebrew/homebrew-core/b4e46db74e74a8c1650b38b1da222284ce1ec5ce/Formula/c/cmake.rb"
|
|
||||||
FORMULA_EXPECTED_SHA256="c7ec95d86f0657638835441871e77541165e0a2581b53b3dd657cf13ad4228d4"
|
|
||||||
|
|
||||||
mkdir -p /tmp/homebrew-formula
|
|
||||||
curl -s -L "$FORMULA_URL" -o /tmp/homebrew-formula/cmake.rb
|
|
||||||
|
|
||||||
echo "$FORMULA_EXPECTED_SHA256 /tmp/homebrew-formula/cmake.rb" | shasum -a 256 -c
|
|
||||||
|
|
||||||
# Install cmake from the specific formula with force flag
|
|
||||||
brew install --formula --force /tmp/homebrew-formula/cmake.rb
|
|
||||||
|
|
||||||
- name: Fix git permissions on Linux
|
|
||||||
if: ${{ runner.os == 'Linux' }}
|
|
||||||
shell: bash
|
|
||||||
run: git config --global --add safe.directory "$PWD"
|
|
||||||
|
|
||||||
- name: Set env variables for macOS
|
|
||||||
if: ${{ runner.os == 'macOS' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "CCACHE_DIR=${{ github.workspace }}/.ccache" >> $GITHUB_ENV
|
|
||||||
echo "CONAN_USER_HOME=${{ github.workspace }}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Set env variables for Linux
|
|
||||||
if: ${{ runner.os == 'Linux' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "CCACHE_DIR=/root/.ccache" >> $GITHUB_ENV
|
|
||||||
echo "CONAN_USER_HOME=/root/" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Set CCACHE_DISABLE=1
|
|
||||||
if: ${{ inputs.disable_ccache == 'true' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "CCACHE_DISABLE=1" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Create directories
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p "$CCACHE_DIR"
|
|
||||||
mkdir -p "$CONAN_USER_HOME/.conan"
|
|
||||||
30
.github/actions/restore_cache/action.yml
vendored
30
.github/actions/restore_cache/action.yml
vendored
@@ -1,10 +1,7 @@
|
|||||||
name: Restore cache
|
name: Restore cache
|
||||||
description: Find and restores conan and ccache cache
|
description: Find and restores ccache cache
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
conan_dir:
|
|
||||||
description: Path to .conan directory
|
|
||||||
required: true
|
|
||||||
conan_profile:
|
conan_profile:
|
||||||
description: Conan profile name
|
description: Conan profile name
|
||||||
required: true
|
required: true
|
||||||
@@ -19,13 +16,8 @@ inputs:
|
|||||||
description: Whether code coverage is on
|
description: Whether code coverage is on
|
||||||
required: true
|
required: true
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
conan_hash:
|
|
||||||
description: Hash to use as a part of conan cache key
|
|
||||||
value: ${{ steps.conan_hash.outputs.hash }}
|
|
||||||
conan_cache_hit:
|
|
||||||
description: True if conan cache has been downloaded
|
|
||||||
value: ${{ steps.conan_cache.outputs.cache-hit }}
|
|
||||||
ccache_cache_hit:
|
ccache_cache_hit:
|
||||||
description: True if ccache cache has been downloaded
|
description: True if ccache cache has been downloaded
|
||||||
value: ${{ steps.ccache_cache.outputs.cache-hit }}
|
value: ${{ steps.ccache_cache.outputs.cache-hit }}
|
||||||
@@ -37,24 +29,6 @@ runs:
|
|||||||
id: git_common_ancestor
|
id: git_common_ancestor
|
||||||
uses: ./.github/actions/git_common_ancestor
|
uses: ./.github/actions/git_common_ancestor
|
||||||
|
|
||||||
- name: Calculate conan hash
|
|
||||||
id: conan_hash
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
conan info . -j info.json -o clio:tests=True
|
|
||||||
packages_info="$(cat info.json | jq '.[] | "\(.display_name): \(.id)"' | grep -v 'clio')"
|
|
||||||
echo "$packages_info"
|
|
||||||
hash="$(echo "$packages_info" | shasum -a 256 | cut -d ' ' -f 1)"
|
|
||||||
rm info.json
|
|
||||||
echo "hash=$hash" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Restore conan cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
id: conan_cache
|
|
||||||
with:
|
|
||||||
path: ${{ inputs.conan_dir }}/data
|
|
||||||
key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ steps.conan_hash.outputs.hash }}
|
|
||||||
|
|
||||||
- name: Restore ccache cache
|
- name: Restore ccache cache
|
||||||
uses: actions/cache/restore@v4
|
uses: actions/cache/restore@v4
|
||||||
id: ccache_cache
|
id: ccache_cache
|
||||||
|
|||||||
35
.github/actions/save_cache/action.yml
vendored
35
.github/actions/save_cache/action.yml
vendored
@@ -1,27 +1,13 @@
|
|||||||
name: Save cache
|
name: Save cache
|
||||||
description: Save conan and ccache cache for develop branch
|
description: Save ccache cache for develop branch
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
conan_dir:
|
|
||||||
description: Path to .conan directory
|
|
||||||
required: true
|
|
||||||
conan_profile:
|
conan_profile:
|
||||||
description: Conan profile name
|
description: Conan profile name
|
||||||
required: true
|
required: true
|
||||||
conan_hash:
|
|
||||||
description: Hash to use as a part of conan cache key
|
|
||||||
required: true
|
|
||||||
conan_cache_hit:
|
|
||||||
description: Whether conan cache has been downloaded
|
|
||||||
required: true
|
|
||||||
ccache_dir:
|
ccache_dir:
|
||||||
description: Path to .ccache directory
|
description: Path to .ccache directory
|
||||||
required: true
|
required: true
|
||||||
ccache_cache_hit:
|
|
||||||
description: Whether conan cache has been downloaded
|
|
||||||
required: true
|
|
||||||
ccache_cache_miss_rate:
|
|
||||||
description: How many cache misses happened
|
|
||||||
build_type:
|
build_type:
|
||||||
description: Current build type (e.g. Release, Debug)
|
description: Current build type (e.g. Release, Debug)
|
||||||
required: true
|
required: true
|
||||||
@@ -31,6 +17,12 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|
||||||
|
ccache_cache_hit:
|
||||||
|
description: Whether ccache cache has been downloaded
|
||||||
|
required: true
|
||||||
|
ccache_cache_miss_rate:
|
||||||
|
description: How many ccache cache misses happened
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
@@ -38,19 +30,6 @@ runs:
|
|||||||
id: git_common_ancestor
|
id: git_common_ancestor
|
||||||
uses: ./.github/actions/git_common_ancestor
|
uses: ./.github/actions/git_common_ancestor
|
||||||
|
|
||||||
- name: Cleanup conan directory from extra data
|
|
||||||
if: ${{ inputs.conan_cache_hit != 'true' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
conan remove "*" -s -b -f
|
|
||||||
|
|
||||||
- name: Save conan cache
|
|
||||||
if: ${{ inputs.conan_cache_hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v4
|
|
||||||
with:
|
|
||||||
path: ${{ inputs.conan_dir }}/data
|
|
||||||
key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ inputs.conan_hash }}
|
|
||||||
|
|
||||||
- name: Save ccache cache
|
- name: Save ccache cache
|
||||||
if: ${{ inputs.ccache_cache_hit != 'true' || inputs.ccache_cache_miss_rate == '100.0' }}
|
if: ${{ inputs.ccache_cache_hit != 'true' || inputs.ccache_cache_miss_rate == '100.0' }}
|
||||||
uses: actions/cache/save@v4
|
uses: actions/cache/save@v4
|
||||||
|
|||||||
33
.github/actions/setup_conan/action.yml
vendored
33
.github/actions/setup_conan/action.yml
vendored
@@ -1,33 +0,0 @@
|
|||||||
name: Setup conan
|
|
||||||
description: Setup conan profile and artifactory
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
conan_profile:
|
|
||||||
description: Conan profile name
|
|
||||||
required: true
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
- name: Create conan profile on macOS
|
|
||||||
if: ${{ runner.os == 'macOS' }}
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
CONAN_PROFILE: ${{ inputs.conan_profile }}
|
|
||||||
run: |
|
|
||||||
echo "Creating \"$CONAN_PROFILE\" conan profile"
|
|
||||||
conan profile new "$CONAN_PROFILE" --detect --force
|
|
||||||
conan profile update settings.compiler.libcxx=libc++ "$CONAN_PROFILE"
|
|
||||||
conan profile update settings.compiler.cppstd=20 "$CONAN_PROFILE"
|
|
||||||
conan profile update env.CXXFLAGS=-DBOOST_ASIO_DISABLE_CONCEPTS "$CONAN_PROFILE"
|
|
||||||
conan profile update "conf.tools.build:cxxflags+=[\"-DBOOST_ASIO_DISABLE_CONCEPTS\"]" "$CONAN_PROFILE"
|
|
||||||
|
|
||||||
- name: Add conan-non-prod artifactory
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ -z "$(conan remote list | grep conan-non-prod)" ]]; then
|
|
||||||
echo "Adding conan-non-prod"
|
|
||||||
conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
|
||||||
else
|
|
||||||
echo "Conan-non-prod is available"
|
|
||||||
fi
|
|
||||||
43
.github/dependabot.yml
vendored
43
.github/dependabot.yml
vendored
@@ -39,6 +39,19 @@ updates:
|
|||||||
prefix: "ci: [DEPENDABOT] "
|
prefix: "ci: [DEPENDABOT] "
|
||||||
target-branch: develop
|
target-branch: develop
|
||||||
|
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: .github/actions/cmake/
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
day: monday
|
||||||
|
time: "04:00"
|
||||||
|
timezone: Etc/GMT
|
||||||
|
reviewers:
|
||||||
|
- XRPLF/clio-dev-team
|
||||||
|
commit-message:
|
||||||
|
prefix: "ci: [DEPENDABOT] "
|
||||||
|
target-branch: develop
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
directory: .github/actions/code_coverage/
|
directory: .github/actions/code_coverage/
|
||||||
schedule:
|
schedule:
|
||||||
@@ -53,7 +66,7 @@ updates:
|
|||||||
target-branch: develop
|
target-branch: develop
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
directory: .github/actions/create_issue/
|
directory: .github/actions/conan/
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: monday
|
day: monday
|
||||||
@@ -66,7 +79,7 @@ updates:
|
|||||||
target-branch: develop
|
target-branch: develop
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
directory: .github/actions/generate/
|
directory: .github/actions/create_issue/
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: monday
|
day: monday
|
||||||
@@ -104,19 +117,6 @@ updates:
|
|||||||
prefix: "ci: [DEPENDABOT] "
|
prefix: "ci: [DEPENDABOT] "
|
||||||
target-branch: develop
|
target-branch: develop
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: .github/actions/prepare_runner/
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: "04:00"
|
|
||||||
timezone: Etc/GMT
|
|
||||||
reviewers:
|
|
||||||
- XRPLF/clio-dev-team
|
|
||||||
commit-message:
|
|
||||||
prefix: "ci: [DEPENDABOT] "
|
|
||||||
target-branch: develop
|
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
directory: .github/actions/restore_cache/
|
directory: .github/actions/restore_cache/
|
||||||
schedule:
|
schedule:
|
||||||
@@ -142,16 +142,3 @@ updates:
|
|||||||
commit-message:
|
commit-message:
|
||||||
prefix: "ci: [DEPENDABOT] "
|
prefix: "ci: [DEPENDABOT] "
|
||||||
target-branch: develop
|
target-branch: develop
|
||||||
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: .github/actions/setup_conan/
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: "04:00"
|
|
||||||
timezone: Etc/GMT
|
|
||||||
reviewers:
|
|
||||||
- XRPLF/clio-dev-team
|
|
||||||
commit-message:
|
|
||||||
prefix: "ci: [DEPENDABOT] "
|
|
||||||
target-branch: develop
|
|
||||||
|
|||||||
11
.github/scripts/conan/apple-clang-17.profile
vendored
Normal file
11
.github/scripts/conan/apple-clang-17.profile
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[settings]
|
||||||
|
arch={{detect_api.detect_arch()}}
|
||||||
|
build_type=Release
|
||||||
|
compiler=apple-clang
|
||||||
|
compiler.cppstd=20
|
||||||
|
compiler.libcxx=libc++
|
||||||
|
compiler.version=17
|
||||||
|
os=Macos
|
||||||
|
|
||||||
|
[conf]
|
||||||
|
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
|
||||||
39
.github/scripts/conan/generate_matrix.py
vendored
Executable file
39
.github/scripts/conan/generate_matrix.py
vendored
Executable file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import itertools
|
||||||
|
import json
|
||||||
|
|
||||||
|
LINUX_OS = ["heavy", "heavy-arm64"]
|
||||||
|
LINUX_CONTAINERS = ['{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }']
|
||||||
|
LINUX_COMPILERS = ["gcc", "clang"]
|
||||||
|
|
||||||
|
MACOS_OS = ["macos15"]
|
||||||
|
MACOS_CONTAINERS = [""]
|
||||||
|
MACOS_COMPILERS = ["apple-clang"]
|
||||||
|
|
||||||
|
BUILD_TYPES = ["Release", "Debug"]
|
||||||
|
SANITIZER_EXT = [".asan", ".tsan", ".ubsan", ""]
|
||||||
|
|
||||||
|
|
||||||
|
def generate_matrix():
|
||||||
|
configurations = []
|
||||||
|
|
||||||
|
for os, container, compiler in itertools.chain(
|
||||||
|
itertools.product(LINUX_OS, LINUX_CONTAINERS, LINUX_COMPILERS),
|
||||||
|
itertools.product(MACOS_OS, MACOS_CONTAINERS, MACOS_COMPILERS),
|
||||||
|
):
|
||||||
|
for sanitizer_ext, build_type in itertools.product(SANITIZER_EXT, BUILD_TYPES):
|
||||||
|
configurations.append(
|
||||||
|
{
|
||||||
|
"os": os,
|
||||||
|
"container": container,
|
||||||
|
"compiler": compiler,
|
||||||
|
"sanitizer_ext": sanitizer_ext,
|
||||||
|
"build_type": build_type,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return {"include": configurations}
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(f"matrix={json.dumps(generate_matrix())}")
|
||||||
48
.github/scripts/conan/init.sh
vendored
Executable file
48
.github/scripts/conan/init.sh
vendored
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
REPO_DIR="$(cd "$CURRENT_DIR/../../../" && pwd)"
|
||||||
|
|
||||||
|
CONAN_DIR="${CONAN_HOME:-$HOME/.conan2}"
|
||||||
|
PROFILES_DIR="$CONAN_DIR/profiles"
|
||||||
|
|
||||||
|
# When developers' compilers are updated, these profiles might be different
|
||||||
|
if [[ -z "$CI" ]]; then
|
||||||
|
APPLE_CLANG_PROFILE="$CURRENT_DIR/apple-clang-17.profile"
|
||||||
|
else
|
||||||
|
APPLE_CLANG_PROFILE="$CURRENT_DIR/apple-clang-17.profile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
GCC_PROFILE="$REPO_DIR/docker/ci/conan/gcc.profile"
|
||||||
|
CLANG_PROFILE="$REPO_DIR/docker/ci/conan/clang.profile"
|
||||||
|
|
||||||
|
SANITIZER_TEMPLATE_FILE="$REPO_DIR/docker/ci/conan/sanitizer_template.profile"
|
||||||
|
|
||||||
|
rm -rf "$CONAN_DIR"
|
||||||
|
|
||||||
|
conan remote add --index 0 xrplf https://conan.ripplex.io
|
||||||
|
|
||||||
|
cp "$REPO_DIR/docker/ci/conan/global.conf" "$CONAN_DIR/global.conf"
|
||||||
|
|
||||||
|
create_profile_with_sanitizers() {
|
||||||
|
profile_name="$1"
|
||||||
|
profile_source="$2"
|
||||||
|
|
||||||
|
cp "$profile_source" "$PROFILES_DIR/$profile_name"
|
||||||
|
cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.asan"
|
||||||
|
cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.tsan"
|
||||||
|
cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.ubsan"
|
||||||
|
}
|
||||||
|
|
||||||
|
mkdir -p "$PROFILES_DIR"
|
||||||
|
|
||||||
|
if [[ "$(uname)" == "Darwin" ]]; then
|
||||||
|
create_profile_with_sanitizers "apple-clang" "$APPLE_CLANG_PROFILE"
|
||||||
|
echo "include(apple-clang)" > "$PROFILES_DIR/default"
|
||||||
|
else
|
||||||
|
create_profile_with_sanitizers "clang" "$CLANG_PROFILE"
|
||||||
|
create_profile_with_sanitizers "gcc" "$GCC_PROFILE"
|
||||||
|
echo "include(gcc)" > "$PROFILES_DIR/default"
|
||||||
|
fi
|
||||||
24
.github/scripts/prepare-release-artifacts.sh
vendored
Executable file
24
.github/scripts/prepare-release-artifacts.sh
vendored
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex -o pipefail
|
||||||
|
|
||||||
|
BINARY_NAME="clio_server"
|
||||||
|
|
||||||
|
ARTIFACTS_DIR="$1"
|
||||||
|
if [ -z "${ARTIFACTS_DIR}" ]; then
|
||||||
|
echo "Usage: $0 <artifacts_directory>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "${ARTIFACTS_DIR}" || exit 1
|
||||||
|
|
||||||
|
for artifact_name in $(ls); do
|
||||||
|
pushd "${artifact_name}" || exit 1
|
||||||
|
zip -r "../${artifact_name}.zip" ./${BINARY_NAME}
|
||||||
|
popd || exit 1
|
||||||
|
|
||||||
|
rm "${artifact_name}/${BINARY_NAME}"
|
||||||
|
rm -r "${artifact_name}"
|
||||||
|
|
||||||
|
sha256sum "./${artifact_name}.zip" > "./${artifact_name}.zip.sha256sum"
|
||||||
|
done
|
||||||
28
.github/scripts/update-libxrpl-version
vendored
28
.github/scripts/update-libxrpl-version
vendored
@@ -1,28 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Note: This script is intended to be run from the root of the repository.
|
|
||||||
#
|
|
||||||
# This script modifies conanfile.py such that the specified version of libXRPL is used.
|
|
||||||
|
|
||||||
if [[ -z "$1" ]]; then
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
ERROR
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
Version should be passed as first argument to the script.
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
VERSION=$1
|
|
||||||
GNU_SED=$(sed --version 2>&1 | grep -q 'GNU' && echo true || echo false)
|
|
||||||
|
|
||||||
echo "+ Updating required libXRPL version to $VERSION"
|
|
||||||
|
|
||||||
if [[ "$GNU_SED" == "false" ]]; then
|
|
||||||
sed -i '' -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
|
|
||||||
else
|
|
||||||
sed -i -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
|
|
||||||
fi
|
|
||||||
60
.github/workflows/build.yml
vendored
60
.github/workflows/build.yml
vendored
@@ -2,9 +2,9 @@ name: Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master, release/*, develop]
|
branches: [release/*, develop]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [master, release/*, develop]
|
branches: [release/*, develop]
|
||||||
paths:
|
paths:
|
||||||
- .github/workflows/build.yml
|
- .github/workflows/build.yml
|
||||||
|
|
||||||
@@ -18,6 +18,8 @@ on:
|
|||||||
- "!.github/actions/create_issue/**"
|
- "!.github/actions/create_issue/**"
|
||||||
|
|
||||||
- CMakeLists.txt
|
- CMakeLists.txt
|
||||||
|
- conanfile.py
|
||||||
|
- conan.lock
|
||||||
- "cmake/**"
|
- "cmake/**"
|
||||||
- "src/**"
|
- "src/**"
|
||||||
- "tests/**"
|
- "tests/**"
|
||||||
@@ -26,8 +28,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
# Develop branch: Each run gets unique group (using run_number) for parallel execution
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
# Other branches: Shared group with cancel-in-progress to stop old runs when new commits are pushed
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref == 'refs/heads/develop' && github.run_number || 'branch' }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -40,12 +43,15 @@ jobs:
|
|||||||
os: [heavy]
|
os: [heavy]
|
||||||
conan_profile: [gcc, clang]
|
conan_profile: [gcc, clang]
|
||||||
build_type: [Release, Debug]
|
build_type: [Release, Debug]
|
||||||
container: ['{ "image": "ghcr.io/xrplf/clio-ci:latest" }']
|
container:
|
||||||
|
[
|
||||||
|
'{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }',
|
||||||
|
]
|
||||||
static: [true]
|
static: [true]
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- os: macos15
|
- os: macos15
|
||||||
conan_profile: default_apple_clang
|
conan_profile: apple-clang
|
||||||
build_type: Release
|
build_type: Release
|
||||||
container: ""
|
container: ""
|
||||||
static: false
|
static: false
|
||||||
@@ -67,7 +73,7 @@ jobs:
|
|||||||
uses: ./.github/workflows/build_impl.yml
|
uses: ./.github/workflows/build_impl.yml
|
||||||
with:
|
with:
|
||||||
runs_on: heavy
|
runs_on: heavy
|
||||||
container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
conan_profile: gcc
|
conan_profile: gcc
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
disable_cache: false
|
disable_cache: false
|
||||||
@@ -75,22 +81,38 @@ jobs:
|
|||||||
static: true
|
static: true
|
||||||
upload_clio_server: false
|
upload_clio_server: false
|
||||||
targets: all
|
targets: all
|
||||||
sanitizer: "false"
|
|
||||||
analyze_build_time: false
|
analyze_build_time: false
|
||||||
secrets:
|
secrets:
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
package:
|
||||||
|
name: Build packages
|
||||||
|
|
||||||
|
uses: ./.github/workflows/build_impl.yml
|
||||||
|
with:
|
||||||
|
runs_on: heavy
|
||||||
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
|
conan_profile: gcc
|
||||||
|
build_type: Release
|
||||||
|
disable_cache: false
|
||||||
|
code_coverage: false
|
||||||
|
static: true
|
||||||
|
upload_clio_server: false
|
||||||
|
package: true
|
||||||
|
targets: package
|
||||||
|
analyze_build_time: false
|
||||||
|
|
||||||
check_config:
|
check_config:
|
||||||
name: Check Config Description
|
name: Check Config Description
|
||||||
needs: build-and-test
|
needs: build-and-test
|
||||||
runs-on: heavy
|
runs-on: heavy
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: clio_server_Linux_Release_gcc
|
name: clio_server_Linux_Release_gcc
|
||||||
|
|
||||||
@@ -98,23 +120,9 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
repoConfigFile=docs/config-description.md
|
repoConfigFile=docs/config-description.md
|
||||||
if ! [ -f "${repoConfigFile}" ]; then
|
configDescriptionFile=config_description_new.md
|
||||||
echo "Config Description markdown file is missing in docs folder"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
chmod +x ./clio_server
|
chmod +x ./clio_server
|
||||||
configDescriptionFile=config_description_new.md
|
|
||||||
./clio_server -d "${configDescriptionFile}"
|
./clio_server -d "${configDescriptionFile}"
|
||||||
|
|
||||||
configDescriptionHash=$(sha256sum "${configDescriptionFile}" | cut -d' ' -f1)
|
diff -u "${repoConfigFile}" "${configDescriptionFile}"
|
||||||
repoConfigHash=$(sha256sum "${repoConfigFile}" | cut -d' ' -f1)
|
|
||||||
|
|
||||||
if [ "${configDescriptionHash}" != "${repoConfigHash}" ]; then
|
|
||||||
echo "Markdown file is not up to date"
|
|
||||||
diff -u "${repoConfigFile}" "${configDescriptionFile}"
|
|
||||||
rm -f "${configDescriptionFile}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
rm -f "${configDescriptionFile}"
|
|
||||||
exit 0
|
|
||||||
|
|||||||
18
.github/workflows/build_and_test.yml
vendored
18
.github/workflows/build_and_test.yml
vendored
@@ -24,7 +24,7 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
disable_cache:
|
disable_cache:
|
||||||
description: Whether ccache and conan cache should be disabled
|
description: Whether ccache should be disabled
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
@@ -57,11 +57,17 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
default: all
|
default: all
|
||||||
|
|
||||||
sanitizer:
|
expected_version:
|
||||||
description: Sanitizer to use
|
description: Expected version of the clio_server binary
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
default: "false"
|
default: ""
|
||||||
|
|
||||||
|
package:
|
||||||
|
description: Whether to generate Debian package
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -76,8 +82,9 @@ jobs:
|
|||||||
static: ${{ inputs.static }}
|
static: ${{ inputs.static }}
|
||||||
upload_clio_server: ${{ inputs.upload_clio_server }}
|
upload_clio_server: ${{ inputs.upload_clio_server }}
|
||||||
targets: ${{ inputs.targets }}
|
targets: ${{ inputs.targets }}
|
||||||
sanitizer: ${{ inputs.sanitizer }}
|
|
||||||
analyze_build_time: false
|
analyze_build_time: false
|
||||||
|
expected_version: ${{ inputs.expected_version }}
|
||||||
|
package: ${{ inputs.package }}
|
||||||
|
|
||||||
test:
|
test:
|
||||||
needs: build
|
needs: build
|
||||||
@@ -89,4 +96,3 @@ jobs:
|
|||||||
build_type: ${{ inputs.build_type }}
|
build_type: ${{ inputs.build_type }}
|
||||||
run_unit_tests: ${{ inputs.run_unit_tests }}
|
run_unit_tests: ${{ inputs.run_unit_tests }}
|
||||||
run_integration_tests: ${{ inputs.run_integration_tests }}
|
run_integration_tests: ${{ inputs.run_integration_tests }}
|
||||||
sanitizer: ${{ inputs.sanitizer }}
|
|
||||||
|
|||||||
20
.github/workflows/build_clio_docker_image.yml
vendored
20
.github/workflows/build_clio_docker_image.yml
vendored
@@ -48,7 +48,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Download Clio binary from artifact
|
- name: Download Clio binary from artifact
|
||||||
if: ${{ inputs.artifact_name != null }}
|
if: ${{ inputs.artifact_name != null }}
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.artifact_name }}
|
name: ${{ inputs.artifact_name }}
|
||||||
path: ./docker/clio/artifact/
|
path: ./docker/clio/artifact/
|
||||||
@@ -73,7 +73,8 @@ jobs:
|
|||||||
elif [[ $artifact == *.tar.gz ]]; then
|
elif [[ $artifact == *.tar.gz ]]; then
|
||||||
tar -xvf $artifact
|
tar -xvf $artifact
|
||||||
fi
|
fi
|
||||||
mv clio_server ../
|
chmod +x ./clio_server
|
||||||
|
mv ./clio_server ../
|
||||||
cd ../
|
cd ../
|
||||||
rm -rf ./artifact
|
rm -rf ./artifact
|
||||||
|
|
||||||
@@ -82,19 +83,24 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: strip ./docker/clio/clio_server
|
run: strip ./docker/clio/clio_server
|
||||||
|
|
||||||
|
- name: Set GHCR_REPO
|
||||||
|
id: set-ghcr-repo
|
||||||
|
run: |
|
||||||
|
echo "GHCR_REPO=$(echo ghcr.io/${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> ${GITHUB_OUTPUT}
|
||||||
|
|
||||||
- name: Build Docker image
|
- name: Build Docker image
|
||||||
uses: ./.github/actions/build_docker_image
|
uses: ./.github/actions/build_docker_image
|
||||||
env:
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||||
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
rippleci/clio
|
ghcr.io/${{ steps.set-ghcr-repo.outputs.GHCR_REPO }}/clio
|
||||||
ghcr.io/xrplf/clio
|
${{ github.repository_owner == 'XRPLF' && 'rippleci/clio' || '' }}
|
||||||
dockerhub_repo: rippleci/clio
|
|
||||||
push_image: ${{ inputs.publish_image }}
|
push_image: ${{ inputs.publish_image }}
|
||||||
directory: docker/clio
|
directory: docker/clio
|
||||||
tags: ${{ inputs.tags }}
|
tags: ${{ inputs.tags }}
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
description: Clio is an XRP Ledger API server.
|
dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio' || '' }}
|
||||||
|
dockerhub_description: Clio is an XRP Ledger API server.
|
||||||
|
|||||||
90
.github/workflows/build_impl.yml
vendored
90
.github/workflows/build_impl.yml
vendored
@@ -24,7 +24,7 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
disable_cache:
|
disable_cache:
|
||||||
description: Whether ccache and conan cache should be disabled
|
description: Whether ccache should be disabled
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
@@ -48,66 +48,80 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
sanitizer:
|
|
||||||
description: Sanitizer to use
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
analyze_build_time:
|
analyze_build_time:
|
||||||
description: Whether to enable build time analysis
|
description: Whether to enable build time analysis
|
||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
|
expected_version:
|
||||||
|
description: Expected version of the clio_server binary
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
|
||||||
|
package:
|
||||||
|
description: Whether to generate Debian package
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
secrets:
|
secrets:
|
||||||
CODECOV_TOKEN:
|
CODECOV_TOKEN:
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build ${{ inputs.container != '' && 'in container' || 'natively' }}
|
name: Build
|
||||||
runs-on: ${{ inputs.runs_on }}
|
runs-on: ${{ inputs.runs_on }}
|
||||||
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clean workdir
|
- name: Cleanup workspace
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
|
uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
# We need to fetch tags to have correct version in the release
|
||||||
|
# The workaround is based on https://github.com/actions/checkout/issues/1467
|
||||||
|
fetch-tags: true
|
||||||
|
ref: ${{ github.ref }}
|
||||||
|
|
||||||
- name: Prepare runner
|
- name: Prepare runner
|
||||||
uses: ./.github/actions/prepare_runner
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
with:
|
with:
|
||||||
disable_ccache: ${{ inputs.disable_cache }}
|
disable_ccache: ${{ inputs.disable_cache }}
|
||||||
|
|
||||||
- name: Setup conan
|
- name: Setup conan on macOS
|
||||||
uses: ./.github/actions/setup_conan
|
if: runner.os == 'macOS'
|
||||||
with:
|
shell: bash
|
||||||
conan_profile: ${{ inputs.conan_profile }}
|
run: ./.github/scripts/conan/init.sh
|
||||||
|
|
||||||
- name: Restore cache
|
- name: Restore cache
|
||||||
if: ${{ !inputs.disable_cache }}
|
if: ${{ !inputs.disable_cache }}
|
||||||
uses: ./.github/actions/restore_cache
|
uses: ./.github/actions/restore_cache
|
||||||
id: restore_cache
|
id: restore_cache
|
||||||
with:
|
with:
|
||||||
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
|
||||||
conan_profile: ${{ inputs.conan_profile }}
|
conan_profile: ${{ inputs.conan_profile }}
|
||||||
ccache_dir: ${{ env.CCACHE_DIR }}
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
build_type: ${{ inputs.build_type }}
|
build_type: ${{ inputs.build_type }}
|
||||||
code_coverage: ${{ inputs.code_coverage }}
|
code_coverage: ${{ inputs.code_coverage }}
|
||||||
|
|
||||||
- name: Run conan and cmake
|
- name: Run conan
|
||||||
uses: ./.github/actions/generate
|
uses: ./.github/actions/conan
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ inputs.conan_profile }}
|
||||||
|
build_type: ${{ inputs.build_type }}
|
||||||
|
|
||||||
|
- name: Run CMake
|
||||||
|
uses: ./.github/actions/cmake
|
||||||
with:
|
with:
|
||||||
conan_profile: ${{ inputs.conan_profile }}
|
conan_profile: ${{ inputs.conan_profile }}
|
||||||
conan_cache_hit: ${{ !inputs.disable_cache && steps.restore_cache.outputs.conan_cache_hit }}
|
|
||||||
build_type: ${{ inputs.build_type }}
|
build_type: ${{ inputs.build_type }}
|
||||||
code_coverage: ${{ inputs.code_coverage }}
|
code_coverage: ${{ inputs.code_coverage }}
|
||||||
static: ${{ inputs.static }}
|
static: ${{ inputs.static }}
|
||||||
sanitizer: ${{ inputs.sanitizer }}
|
|
||||||
time_trace: ${{ inputs.analyze_build_time }}
|
time_trace: ${{ inputs.analyze_build_time }}
|
||||||
|
package: ${{ inputs.package }}
|
||||||
|
|
||||||
- name: Build Clio
|
- name: Build Clio
|
||||||
uses: ./.github/actions/build_clio
|
uses: ./.github/actions/build_clio
|
||||||
@@ -140,11 +154,11 @@ jobs:
|
|||||||
cat /tmp/ccache.stats
|
cat /tmp/ccache.stats
|
||||||
|
|
||||||
- name: Strip unit_tests
|
- name: Strip unit_tests
|
||||||
if: inputs.sanitizer == 'false' && !inputs.code_coverage && !inputs.analyze_build_time
|
if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }}
|
||||||
run: strip build/clio_tests
|
run: strip build/clio_tests
|
||||||
|
|
||||||
- name: Strip integration_tests
|
- name: Strip integration_tests
|
||||||
if: inputs.sanitizer == 'false' && !inputs.code_coverage && !inputs.analyze_build_time
|
if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }}
|
||||||
run: strip build/clio_integration_tests
|
run: strip build/clio_integration_tests
|
||||||
|
|
||||||
- name: Upload clio_server
|
- name: Upload clio_server
|
||||||
@@ -155,36 +169,40 @@ jobs:
|
|||||||
path: build/clio_server
|
path: build/clio_server
|
||||||
|
|
||||||
- name: Upload clio_tests
|
- name: Upload clio_tests
|
||||||
if: ${{ !inputs.code_coverage && !inputs.analyze_build_time }}
|
if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }}
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
path: build/clio_tests
|
path: build/clio_tests
|
||||||
|
|
||||||
- name: Upload clio_integration_tests
|
- name: Upload clio_integration_tests
|
||||||
if: ${{ !inputs.code_coverage && !inputs.analyze_build_time }}
|
if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }}
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
path: build/clio_integration_tests
|
path: build/clio_integration_tests
|
||||||
|
|
||||||
|
- name: Upload Clio Linux package
|
||||||
|
if: inputs.package
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_deb_package_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
|
path: build/*.deb
|
||||||
|
|
||||||
- name: Save cache
|
- name: Save cache
|
||||||
if: ${{ !inputs.disable_cache && github.ref == 'refs/heads/develop' }}
|
if: ${{ !inputs.disable_cache && github.ref == 'refs/heads/develop' }}
|
||||||
uses: ./.github/actions/save_cache
|
uses: ./.github/actions/save_cache
|
||||||
with:
|
with:
|
||||||
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
conan_profile: ${{ inputs.conan_profile }}
|
||||||
conan_hash: ${{ steps.restore_cache.outputs.conan_hash }}
|
|
||||||
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
|
||||||
ccache_dir: ${{ env.CCACHE_DIR }}
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
ccache_cache_hit: ${{ steps.restore_cache.outputs.ccache_cache_hit }}
|
|
||||||
ccache_cache_miss_rate: ${{ steps.ccache_stats.outputs.miss_rate }}
|
|
||||||
build_type: ${{ inputs.build_type }}
|
build_type: ${{ inputs.build_type }}
|
||||||
code_coverage: ${{ inputs.code_coverage }}
|
code_coverage: ${{ inputs.code_coverage }}
|
||||||
conan_profile: ${{ inputs.conan_profile }}
|
|
||||||
|
ccache_cache_hit: ${{ steps.restore_cache.outputs.ccache_cache_hit }}
|
||||||
|
ccache_cache_miss_rate: ${{ steps.ccache_stats.outputs.miss_rate }}
|
||||||
|
|
||||||
# This is run as part of the build job, because it requires the following:
|
# This is run as part of the build job, because it requires the following:
|
||||||
# - source code
|
# - source code
|
||||||
# - generated source code (Build.cpp)
|
|
||||||
# - conan packages
|
# - conan packages
|
||||||
# - .gcno files in build directory
|
# - .gcno files in build directory
|
||||||
#
|
#
|
||||||
@@ -193,6 +211,18 @@ jobs:
|
|||||||
if: ${{ inputs.code_coverage }}
|
if: ${{ inputs.code_coverage }}
|
||||||
uses: ./.github/actions/code_coverage
|
uses: ./.github/actions/code_coverage
|
||||||
|
|
||||||
|
- name: Verify expected version
|
||||||
|
if: ${{ inputs.expected_version != '' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
EXPECTED_VERSION="clio-${{ inputs.expected_version }}"
|
||||||
|
actual_version=$(./build/clio_server --version)
|
||||||
|
if [[ "$actual_version" != "$EXPECTED_VERSION" ]]; then
|
||||||
|
echo "Expected version '$EXPECTED_VERSION', but got '$actual_version'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# `codecov/codecov-action` will rerun `gcov` if it's available and build directory is present
|
# `codecov/codecov-action` will rerun `gcov` if it's available and build directory is present
|
||||||
# To prevent this from happening, we run this action in a separate workflow
|
# To prevent this from happening, we run this action in a separate workflow
|
||||||
#
|
#
|
||||||
|
|||||||
43
.github/workflows/check_libxrpl.yml
vendored
43
.github/workflows/check_libxrpl.yml
vendored
@@ -15,36 +15,40 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build Clio / `libXRPL ${{ github.event.client_payload.version }}`
|
name: Build Clio / `libXRPL ${{ github.event.client_payload.version }}`
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: heavy
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Update libXRPL version requirement
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
./.github/scripts/update-libxrpl-version ${{ github.event.client_payload.version }}
|
|
||||||
|
|
||||||
- name: Prepare runner
|
- name: Prepare runner
|
||||||
uses: ./.github/actions/prepare_runner
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
with:
|
with:
|
||||||
disable_ccache: true
|
disable_ccache: true
|
||||||
|
|
||||||
- name: Setup conan
|
- name: Update libXRPL version requirement
|
||||||
uses: ./.github/actions/setup_conan
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i.bak -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/${{ github.event.client_payload.conan_ref }}'|g" conanfile.py
|
||||||
|
rm -f conanfile.py.bak
|
||||||
|
|
||||||
|
- name: Update conan lockfile
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan lock create . --profile:all ${{ env.CONAN_PROFILE }}
|
||||||
|
|
||||||
|
- name: Run conan
|
||||||
|
uses: ./.github/actions/conan
|
||||||
with:
|
with:
|
||||||
conan_profile: ${{ env.CONAN_PROFILE }}
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
|
|
||||||
- name: Run conan and cmake
|
- name: Run CMake
|
||||||
uses: ./.github/actions/generate
|
uses: ./.github/actions/cmake
|
||||||
with:
|
with:
|
||||||
conan_profile: ${{ env.CONAN_PROFILE }}
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
|
||||||
build_type: Release
|
|
||||||
|
|
||||||
- name: Build Clio
|
- name: Build Clio
|
||||||
uses: ./.github/actions/build_clio
|
uses: ./.github/actions/build_clio
|
||||||
@@ -61,12 +65,12 @@ jobs:
|
|||||||
run_tests:
|
run_tests:
|
||||||
name: Run tests
|
name: Run tests
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: heavy
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: clio_tests_check_libxrpl
|
name: clio_tests_check_libxrpl
|
||||||
|
|
||||||
@@ -96,6 +100,7 @@ jobs:
|
|||||||
labels: "compatibility,bug"
|
labels: "compatibility,bug"
|
||||||
title: "Proposed libXRPL check failed"
|
title: "Proposed libXRPL check failed"
|
||||||
body: >
|
body: >
|
||||||
Clio build or tests failed against `libXRPL ${{ github.event.client_payload.version }}`.
|
Clio build or tests failed against `libXRPL ${{ github.event.client_payload.conan_ref }}`.
|
||||||
|
|
||||||
Workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
|
PR: ${{ github.event.client_payload.pr_url }}
|
||||||
|
Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
|
||||||
|
|||||||
2
.github/workflows/check_pr_title.yml
vendored
2
.github/workflows/check_pr_title.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: ytanikin/pr-conventional-commits@8267db1bacc237419f9ed0228bb9d94e94271a1d # v1.4.1
|
- uses: ytanikin/pr-conventional-commits@b72758283dcbee706975950e96bc4bf323a8d8c0 # v1.4.2
|
||||||
with:
|
with:
|
||||||
task_types: '["build","feat","fix","docs","test","ci","style","refactor","perf","chore"]'
|
task_types: '["build","feat","fix","docs","test","ci","style","refactor","perf","chore"]'
|
||||||
add_label: false
|
add_label: false
|
||||||
|
|||||||
26
.github/workflows/clang-tidy.yml
vendored
26
.github/workflows/clang-tidy.yml
vendored
@@ -18,12 +18,13 @@ concurrency:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
CONAN_PROFILE: clang
|
CONAN_PROFILE: clang
|
||||||
|
LLVM_TOOLS_VERSION: 20
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
clang_tidy:
|
clang_tidy:
|
||||||
runs-on: heavy
|
runs-on: heavy
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -36,29 +37,26 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Prepare runner
|
- name: Prepare runner
|
||||||
uses: ./.github/actions/prepare_runner
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
with:
|
with:
|
||||||
disable_ccache: true
|
disable_ccache: true
|
||||||
|
|
||||||
- name: Setup conan
|
|
||||||
uses: ./.github/actions/setup_conan
|
|
||||||
with:
|
|
||||||
conan_profile: ${{ env.CONAN_PROFILE }}
|
|
||||||
|
|
||||||
- name: Restore cache
|
- name: Restore cache
|
||||||
uses: ./.github/actions/restore_cache
|
uses: ./.github/actions/restore_cache
|
||||||
id: restore_cache
|
id: restore_cache
|
||||||
with:
|
with:
|
||||||
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
|
||||||
ccache_dir: ${{ env.CCACHE_DIR }}
|
|
||||||
conan_profile: ${{ env.CONAN_PROFILE }}
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
|
|
||||||
- name: Run conan and cmake
|
- name: Run conan
|
||||||
uses: ./.github/actions/generate
|
uses: ./.github/actions/conan
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
|
|
||||||
|
- name: Run CMake
|
||||||
|
uses: ./.github/actions/cmake
|
||||||
with:
|
with:
|
||||||
conan_profile: ${{ env.CONAN_PROFILE }}
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
|
||||||
build_type: Release
|
|
||||||
|
|
||||||
- name: Get number of threads
|
- name: Get number of threads
|
||||||
uses: ./.github/actions/get_number_of_threads
|
uses: ./.github/actions/get_number_of_threads
|
||||||
@@ -69,7 +67,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
id: run_clang_tidy
|
id: run_clang_tidy
|
||||||
run: |
|
run: |
|
||||||
run-clang-tidy-19 -p build -j "${{ steps.number_of_threads.outputs.threads_number }}" -fix -quiet 1>output.txt
|
run-clang-tidy-${{ env.LLVM_TOOLS_VERSION }} -p build -j "${{ steps.number_of_threads.outputs.threads_number }}" -fix -quiet 1>output.txt
|
||||||
|
|
||||||
- name: Fix local includes and clang-format style
|
- name: Fix local includes and clang-format style
|
||||||
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
|||||||
47
.github/workflows/docs.yml
vendored
47
.github/workflows/docs.yml
vendored
@@ -5,25 +5,16 @@ on:
|
|||||||
branches: [develop]
|
branches: [develop]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pages: write
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
build:
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
continue-on-error: true
|
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -31,20 +22,44 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
lfs: true
|
lfs: true
|
||||||
|
|
||||||
- name: Build docs
|
- name: Prepare runner
|
||||||
run: |
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
mkdir -p build_docs && cd build_docs
|
with:
|
||||||
cmake ../docs && cmake --build . --target docs
|
disable_ccache: true
|
||||||
|
|
||||||
|
- name: Create build directory
|
||||||
|
run: mkdir build_docs
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
working-directory: build_docs
|
||||||
|
run: cmake ../docs
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
working-directory: build_docs
|
||||||
|
run: cmake --build . --target docs
|
||||||
|
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v5
|
uses: actions/configure-pages@v5
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v3
|
uses: actions/upload-pages-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: build_docs/html
|
path: build_docs/html
|
||||||
name: docs-develop
|
name: docs-develop
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
needs: build
|
||||||
|
permissions:
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v4
|
uses: actions/deploy-pages@v4
|
||||||
|
|||||||
35
.github/workflows/nightly.yml
vendored
35
.github/workflows/nightly.yml
vendored
@@ -11,10 +11,12 @@ on:
|
|||||||
- .github/workflows/release_impl.yml
|
- .github/workflows/release_impl.yml
|
||||||
- .github/workflows/build_and_test.yml
|
- .github/workflows/build_and_test.yml
|
||||||
- .github/workflows/build_impl.yml
|
- .github/workflows/build_impl.yml
|
||||||
|
- .github/workflows/test_impl.yml
|
||||||
- .github/workflows/build_clio_docker_image.yml
|
- .github/workflows/build_clio_docker_image.yml
|
||||||
|
|
||||||
- ".github/actions/**"
|
- ".github/actions/**"
|
||||||
- "!.github/actions/code_coverage/**"
|
- "!.github/actions/code_coverage/**"
|
||||||
|
- .github/scripts/prepare-release-artifacts.sh
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
||||||
@@ -30,19 +32,24 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: macos15
|
- os: macos15
|
||||||
conan_profile: default_apple_clang
|
conan_profile: apple-clang
|
||||||
build_type: Release
|
build_type: Release
|
||||||
static: false
|
static: false
|
||||||
- os: heavy
|
- os: heavy
|
||||||
conan_profile: gcc
|
conan_profile: gcc
|
||||||
build_type: Release
|
build_type: Release
|
||||||
static: true
|
static: true
|
||||||
container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
- os: heavy
|
- os: heavy
|
||||||
conan_profile: gcc
|
conan_profile: gcc
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
static: true
|
static: true
|
||||||
container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
|
- os: heavy
|
||||||
|
conan_profile: gcc.ubsan
|
||||||
|
build_type: Release
|
||||||
|
static: false
|
||||||
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
|
|
||||||
uses: ./.github/workflows/build_and_test.yml
|
uses: ./.github/workflows/build_and_test.yml
|
||||||
with:
|
with:
|
||||||
@@ -63,15 +70,12 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
# TODO: Enable when we have at least ubuntu 22.04
|
- os: heavy
|
||||||
# as ClangBuildAnalyzer requires relatively modern glibc
|
conan_profile: clang
|
||||||
#
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
# - os: heavy
|
static: true
|
||||||
# conan_profile: clang
|
|
||||||
# container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
|
|
||||||
# static: true
|
|
||||||
- os: macos15
|
- os: macos15
|
||||||
conan_profile: default_apple_clang
|
conan_profile: apple-clang
|
||||||
container: ""
|
container: ""
|
||||||
static: false
|
static: false
|
||||||
uses: ./.github/workflows/build_impl.yml
|
uses: ./.github/workflows/build_impl.yml
|
||||||
@@ -85,7 +89,6 @@ jobs:
|
|||||||
static: ${{ matrix.static }}
|
static: ${{ matrix.static }}
|
||||||
upload_clio_server: false
|
upload_clio_server: false
|
||||||
targets: all
|
targets: all
|
||||||
sanitizer: "false"
|
|
||||||
analyze_build_time: true
|
analyze_build_time: true
|
||||||
|
|
||||||
nightly_release:
|
nightly_release:
|
||||||
@@ -93,9 +96,15 @@ jobs:
|
|||||||
uses: ./.github/workflows/release_impl.yml
|
uses: ./.github/workflows/release_impl.yml
|
||||||
with:
|
with:
|
||||||
overwrite_release: true
|
overwrite_release: true
|
||||||
|
prerelease: true
|
||||||
title: "Clio development (nightly) build"
|
title: "Clio development (nightly) build"
|
||||||
version: nightly
|
version: nightly
|
||||||
notes_header_file: nightly_notes.md
|
header: >
|
||||||
|
> **Note:** Please remember that this is a development release and it is not recommended for production use.
|
||||||
|
|
||||||
|
Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly>
|
||||||
|
generate_changelog: false
|
||||||
|
draft: false
|
||||||
|
|
||||||
build_and_publish_docker_image:
|
build_and_publish_docker_image:
|
||||||
uses: ./.github/workflows/build_clio_docker_image.yml
|
uses: ./.github/workflows/build_clio_docker_image.yml
|
||||||
|
|||||||
7
.github/workflows/nightly_notes.md
vendored
7
.github/workflows/nightly_notes.md
vendored
@@ -1,7 +0,0 @@
|
|||||||
# Release notes
|
|
||||||
|
|
||||||
> **Note:** Please remember that this is a development release and it is not recommended for production use.
|
|
||||||
|
|
||||||
Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly>
|
|
||||||
|
|
||||||
## SHA256 checksums
|
|
||||||
41
.github/workflows/pre-commit-autoupdate.yml
vendored
41
.github/workflows/pre-commit-autoupdate.yml
vendored
@@ -4,36 +4,19 @@ on:
|
|||||||
# every first day of the month
|
# every first day of the month
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "0 0 1 * *"
|
- cron: "0 0 1 * *"
|
||||||
# on demand
|
pull_request:
|
||||||
|
branches: [release/*, develop]
|
||||||
|
paths:
|
||||||
|
- ".pre-commit-config.yaml"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
auto-update:
|
auto-update:
|
||||||
runs-on: ubuntu-latest
|
uses: XRPLF/actions/.github/workflows/pre-commit-autoupdate.yml@afbcbdafbe0ce5439492fb87eda6441371086386
|
||||||
|
with:
|
||||||
permissions:
|
sign_commit: true
|
||||||
contents: write
|
committer: "Clio CI <skuznetsov@ripple.com>"
|
||||||
pull-requests: write
|
reviewers: "godexsoft,kuznetsss,PeterChen13579,mathbunnyru"
|
||||||
|
secrets:
|
||||||
steps:
|
GPG_PRIVATE_KEY: ${{ secrets.ACTIONS_GPG_PRIVATE_KEY }}
|
||||||
- uses: actions/checkout@v4
|
GPG_PASSPHRASE: ${{ secrets.ACTIONS_GPG_PASSPHRASE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: 3.x
|
|
||||||
|
|
||||||
- run: pip install pre-commit
|
|
||||||
- run: pre-commit autoupdate --freeze
|
|
||||||
- run: pre-commit run --all-files || true
|
|
||||||
|
|
||||||
- uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
|
|
||||||
if: always()
|
|
||||||
env:
|
|
||||||
GH_REPO: ${{ github.repository }}
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
with:
|
|
||||||
branch: update/pre-commit-hooks
|
|
||||||
title: Update pre-commit hooks
|
|
||||||
commit-message: "style: update pre-commit hooks"
|
|
||||||
body: Update versions of pre-commit hooks to latest version.
|
|
||||||
reviewers: "godexsoft,kuznetsss,PeterChen13579,mathbunnyru"
|
|
||||||
|
|||||||
24
.github/workflows/pre-commit.yml
vendored
24
.github/workflows/pre-commit.yml
vendored
@@ -3,26 +3,12 @@ name: Run pre-commit hooks
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [develop]
|
||||||
- develop
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
run-hooks:
|
run-hooks:
|
||||||
runs-on: heavy
|
uses: XRPLF/actions/.github/workflows/pre-commit.yml@afbcbdafbe0ce5439492fb87eda6441371086386
|
||||||
container:
|
with:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
runs_on: heavy
|
||||||
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
steps:
|
|
||||||
- name: Checkout Repo ⚡️
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Prepare runner
|
|
||||||
uses: ./.github/actions/prepare_runner
|
|
||||||
with:
|
|
||||||
disable_ccache: true
|
|
||||||
|
|
||||||
- name: Run pre-commit ✅
|
|
||||||
run: pre-commit run --all-files
|
|
||||||
|
|||||||
58
.github/workflows/release.yml
vendored
Normal file
58
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: Create release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*.*.*"
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/release.yml
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-test:
|
||||||
|
name: Build and Test
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: macos15
|
||||||
|
conan_profile: apple-clang
|
||||||
|
build_type: Release
|
||||||
|
static: false
|
||||||
|
- os: heavy
|
||||||
|
conan_profile: gcc
|
||||||
|
build_type: Release
|
||||||
|
static: true
|
||||||
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
|
|
||||||
|
uses: ./.github/workflows/build_and_test.yml
|
||||||
|
with:
|
||||||
|
runs_on: ${{ matrix.os }}
|
||||||
|
container: ${{ matrix.container }}
|
||||||
|
conan_profile: ${{ matrix.conan_profile }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
static: ${{ matrix.static }}
|
||||||
|
run_unit_tests: true
|
||||||
|
run_integration_tests: true
|
||||||
|
upload_clio_server: true
|
||||||
|
disable_cache: true
|
||||||
|
expected_version: ${{ github.event_name == 'push' && github.ref_name || '' }}
|
||||||
|
|
||||||
|
release:
|
||||||
|
needs: build-and-test
|
||||||
|
uses: ./.github/workflows/release_impl.yml
|
||||||
|
with:
|
||||||
|
overwrite_release: false
|
||||||
|
prerelease: ${{ contains(github.ref_name, '-') }}
|
||||||
|
title: "${{ github.ref_name}}"
|
||||||
|
version: "${{ github.ref_name }}"
|
||||||
|
header: >
|
||||||
|
${{ contains(github.ref_name, '-') && '> **Note:** Please remember that this is a release candidate and it is not recommended for production use.' || '' }}
|
||||||
|
generate_changelog: ${{ !contains(github.ref_name, '-') }}
|
||||||
|
draft: true
|
||||||
74
.github/workflows/release_impl.yml
vendored
74
.github/workflows/release_impl.yml
vendored
@@ -8,6 +8,11 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
|
prerelease:
|
||||||
|
description: "Create a prerelease"
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
title:
|
title:
|
||||||
description: "Release title"
|
description: "Release title"
|
||||||
required: true
|
required: true
|
||||||
@@ -18,14 +23,26 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
notes_header_file:
|
header:
|
||||||
description: "Release notes header file"
|
description: "Release notes header"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
|
generate_changelog:
|
||||||
|
description: "Generate changelog"
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
draft:
|
||||||
|
description: "Create a draft release"
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: heavy
|
||||||
|
container:
|
||||||
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
env:
|
env:
|
||||||
GH_REPO: ${{ github.repository }}
|
GH_REPO: ${{ github.repository }}
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
@@ -35,29 +52,45 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- name: Prepare runner
|
||||||
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
|
with:
|
||||||
|
disable_ccache: true
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
path: release_artifacts
|
path: release_artifacts
|
||||||
pattern: clio_server_*
|
pattern: clio_server_*
|
||||||
|
|
||||||
- name: Prepare files
|
- name: Create release notes
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: release_artifacts
|
|
||||||
run: |
|
run: |
|
||||||
cp ${{ github.workspace }}/.github/workflows/${{ inputs.notes_header_file }} "${RUNNER_TEMP}/release_notes.md"
|
echo "# Release notes" > "${RUNNER_TEMP}/release_notes.md"
|
||||||
echo '' >> "${RUNNER_TEMP}/release_notes.md"
|
echo "" >> "${RUNNER_TEMP}/release_notes.md"
|
||||||
echo '```' >> "${RUNNER_TEMP}/release_notes.md"
|
printf '%s\n' "${{ inputs.header }}" >> "${RUNNER_TEMP}/release_notes.md"
|
||||||
|
|
||||||
for d in $(ls); do
|
- name: Generate changelog
|
||||||
archive_name=$(ls $d)
|
shell: bash
|
||||||
mv ${d}/${archive_name} ./
|
if: ${{ inputs.generate_changelog }}
|
||||||
rm -r $d
|
run: |
|
||||||
sha256sum ./$archive_name > ./${archive_name}.sha256sum
|
LAST_TAG="$(gh release view --json tagName -q .tagName --repo XRPLF/clio)"
|
||||||
cat ./$archive_name.sha256sum >> "${RUNNER_TEMP}/release_notes.md"
|
LAST_TAG_COMMIT="$(git rev-parse $LAST_TAG)"
|
||||||
done
|
BASE_COMMIT="$(git merge-base HEAD $LAST_TAG_COMMIT)"
|
||||||
|
git-cliff "${BASE_COMMIT}..HEAD" --ignore-tags "nightly|-b|-rc"
|
||||||
|
cat CHANGELOG.md >> "${RUNNER_TEMP}/release_notes.md"
|
||||||
|
|
||||||
echo '```' >> "${RUNNER_TEMP}/release_notes.md"
|
- name: Prepare release artifacts
|
||||||
|
shell: bash
|
||||||
|
run: .github/scripts/prepare-release-artifacts.sh release_artifacts
|
||||||
|
|
||||||
|
- name: Upload release notes
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: release_notes_${{ inputs.version }}
|
||||||
|
path: "${RUNNER_TEMP}/release_notes.md"
|
||||||
|
|
||||||
- name: Remove current release and tag
|
- name: Remove current release and tag
|
||||||
if: ${{ github.event_name != 'pull_request' && inputs.overwrite_release }}
|
if: ${{ github.event_name != 'pull_request' && inputs.overwrite_release }}
|
||||||
@@ -70,9 +103,10 @@ jobs:
|
|||||||
if: ${{ github.event_name != 'pull_request' }}
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
gh release create ${{ inputs.version }} \
|
gh release create "${{ inputs.version }}" \
|
||||||
${{ inputs.overwrite_release && '--prerelease' || '' }} \
|
${{ inputs.prerelease && '--prerelease' || '' }} \
|
||||||
--title "${{ inputs.title }}" \
|
--title "${{ inputs.title }}" \
|
||||||
--target $GITHUB_SHA \
|
--target "${GITHUB_SHA}" \
|
||||||
|
${{ inputs.draft && '--draft' || '' }} \
|
||||||
--notes-file "${RUNNER_TEMP}/release_notes.md" \
|
--notes-file "${RUNNER_TEMP}/release_notes.md" \
|
||||||
./release_artifacts/clio_server*
|
./release_artifacts/clio_server*
|
||||||
|
|||||||
22
.github/workflows/sanitizers.yml
vendored
22
.github/workflows/sanitizers.yml
vendored
@@ -18,6 +18,8 @@ on:
|
|||||||
- .github/scripts/execute-tests-under-sanitizer
|
- .github/scripts/execute-tests-under-sanitizer
|
||||||
|
|
||||||
- CMakeLists.txt
|
- CMakeLists.txt
|
||||||
|
- conanfile.py
|
||||||
|
- conan.lock
|
||||||
- "cmake/**"
|
- "cmake/**"
|
||||||
# We don't run sanitizer on code change, because it takes too long
|
# We don't run sanitizer on code change, because it takes too long
|
||||||
# - "src/**"
|
# - "src/**"
|
||||||
@@ -35,24 +37,20 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
compiler: [gcc, clang]
|
||||||
- sanitizer: tsan
|
sanitizer_ext: [.asan, .tsan, .ubsan]
|
||||||
compiler: gcc
|
build_type: [Release, Debug]
|
||||||
- sanitizer: asan
|
|
||||||
compiler: gcc
|
|
||||||
- sanitizer: ubsan
|
|
||||||
compiler: gcc
|
|
||||||
|
|
||||||
uses: ./.github/workflows/build_and_test.yml
|
uses: ./.github/workflows/build_and_test.yml
|
||||||
with:
|
with:
|
||||||
runs_on: heavy
|
runs_on: heavy
|
||||||
container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
|
container: '{ "image": "ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d" }'
|
||||||
disable_cache: true
|
disable_cache: true
|
||||||
conan_profile: ${{ matrix.compiler }}.${{ matrix.sanitizer }}
|
conan_profile: ${{ matrix.compiler }}${{ matrix.sanitizer_ext }}
|
||||||
build_type: Release
|
build_type: ${{ matrix.build_type }}
|
||||||
static: false
|
static: false
|
||||||
run_unit_tests: true
|
# Currently, both gcc.tsan and clang.tsan unit tests hang
|
||||||
|
run_unit_tests: ${{ matrix.sanitizer_ext != '.tsan' }}
|
||||||
run_integration_tests: false
|
run_integration_tests: false
|
||||||
upload_clio_server: false
|
upload_clio_server: false
|
||||||
targets: clio_tests clio_integration_tests
|
targets: clio_tests clio_integration_tests
|
||||||
sanitizer: ${{ matrix.sanitizer }}
|
|
||||||
|
|||||||
27
.github/workflows/test_impl.yml
vendored
27
.github/workflows/test_impl.yml
vendored
@@ -33,33 +33,28 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
sanitizer:
|
|
||||||
description: Sanitizer to use
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
unit_tests:
|
unit_tests:
|
||||||
name: Unit testing ${{ inputs.container != '' && 'in container' || 'natively' }}
|
name: Unit testing
|
||||||
runs-on: ${{ inputs.runs_on }}
|
runs-on: ${{ inputs.runs_on }}
|
||||||
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
||||||
|
|
||||||
if: inputs.run_unit_tests
|
if: inputs.run_unit_tests
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# TODO: remove when we have fixed all currently existing issues from sanitizers
|
# TODO: remove completely when we have fixed all currently existing issues with sanitizers
|
||||||
SANITIZER_IGNORE_ERRORS: ${{ inputs.sanitizer != 'false' && inputs.sanitizer != 'ubsan' }}
|
SANITIZER_IGNORE_ERRORS: ${{ endsWith(inputs.conan_profile, '.asan') || endsWith(inputs.conan_profile, '.tsan') }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clean workdir
|
- name: Cleanup workspace
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
|
uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
|
|
||||||
@@ -90,7 +85,7 @@ jobs:
|
|||||||
if: env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true'
|
if: env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.conan_profile }}_report
|
name: sanitizer_report_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
path: .sanitizer-report/*
|
path: .sanitizer-report/*
|
||||||
include-hidden-files: true
|
include-hidden-files: true
|
||||||
|
|
||||||
@@ -109,7 +104,7 @@ jobs:
|
|||||||
Reports are available as artifacts.
|
Reports are available as artifacts.
|
||||||
|
|
||||||
integration_tests:
|
integration_tests:
|
||||||
name: Integration testing ${{ inputs.container != '' && 'in container' || 'natively' }}
|
name: Integration testing
|
||||||
runs-on: ${{ inputs.runs_on }}
|
runs-on: ${{ inputs.runs_on }}
|
||||||
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
|
||||||
|
|
||||||
@@ -125,9 +120,9 @@ jobs:
|
|||||||
--health-retries 5
|
--health-retries 5
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clean workdir
|
- name: Cleanup workspace
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
|
uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
|
||||||
|
|
||||||
- name: Spin up scylladb
|
- name: Spin up scylladb
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
@@ -149,7 +144,7 @@ jobs:
|
|||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
|
||||||
|
|
||||||
|
|||||||
310
.github/workflows/update_docker_ci.yml
vendored
310
.github/workflows/update_docker_ci.yml
vendored
@@ -9,6 +9,7 @@ on:
|
|||||||
|
|
||||||
- "docker/ci/**"
|
- "docker/ci/**"
|
||||||
- "docker/compilers/**"
|
- "docker/compilers/**"
|
||||||
|
- "docker/tools/**"
|
||||||
push:
|
push:
|
||||||
branches: [develop]
|
branches: [develop]
|
||||||
paths:
|
paths:
|
||||||
@@ -16,39 +17,322 @@ on:
|
|||||||
|
|
||||||
- ".github/actions/build_docker_image/**"
|
- ".github/actions/build_docker_image/**"
|
||||||
|
|
||||||
# CI image must update when either its Dockerfile changes
|
|
||||||
# or any compilers changed and were pushed by hand
|
|
||||||
- "docker/ci/**"
|
- "docker/ci/**"
|
||||||
- "docker/compilers/**"
|
- "docker/compilers/**"
|
||||||
|
- "docker/tools/**"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
|
# Only matches runs for the current workflow - matches against branch & tags
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
# We want to execute all builds sequentially in develop
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
CLANG_MAJOR_VERSION: 19
|
||||||
|
GCC_MAJOR_VERSION: 15
|
||||||
|
GCC_VERSION: 15.2.0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_push:
|
repo:
|
||||||
name: Build and push docker image
|
name: Calculate repo name
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
GHCR_REPO: ${{ steps.set-ghcr-repo.outputs.GHCR_REPO }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Set GHCR_REPO
|
||||||
|
id: set-ghcr-repo
|
||||||
|
run: |
|
||||||
|
echo "GHCR_REPO=$(echo ghcr.io/${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> ${GITHUB_OUTPUT}
|
||||||
|
|
||||||
|
gcc-amd64:
|
||||||
|
name: Build and push GCC docker image (amd64)
|
||||||
|
runs-on: heavy
|
||||||
|
needs: repo
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/compilers/gcc/**"
|
||||||
|
|
||||||
|
- uses: ./.github/actions/build_docker_image
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
|
||||||
|
${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
|
||||||
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
|
directory: docker/compilers/gcc
|
||||||
|
tags: |
|
||||||
|
type=raw,value=amd64-latest
|
||||||
|
type=raw,value=amd64-${{ env.GCC_MAJOR_VERSION }}
|
||||||
|
type=raw,value=amd64-${{ env.GCC_VERSION }}
|
||||||
|
type=raw,value=amd64-${{ github.sha }}
|
||||||
|
platforms: linux/amd64
|
||||||
|
build_args: |
|
||||||
|
GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
|
||||||
|
GCC_VERSION=${{ env.GCC_VERSION }}
|
||||||
|
dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
|
||||||
|
dockerhub_description: GCC compiler for XRPLF/clio.
|
||||||
|
|
||||||
|
gcc-arm64:
|
||||||
|
name: Build and push GCC docker image (arm64)
|
||||||
|
runs-on: heavy-arm64
|
||||||
|
needs: repo
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/compilers/gcc/**"
|
||||||
|
|
||||||
|
- uses: ./.github/actions/build_docker_image
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
|
||||||
|
${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
|
||||||
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
|
directory: docker/compilers/gcc
|
||||||
|
tags: |
|
||||||
|
type=raw,value=arm64-latest
|
||||||
|
type=raw,value=arm64-${{ env.GCC_MAJOR_VERSION }}
|
||||||
|
type=raw,value=arm64-${{ env.GCC_VERSION }}
|
||||||
|
type=raw,value=arm64-${{ github.sha }}
|
||||||
|
platforms: linux/arm64
|
||||||
|
build_args: |
|
||||||
|
GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
|
||||||
|
GCC_VERSION=${{ env.GCC_VERSION }}
|
||||||
|
dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
|
||||||
|
dockerhub_description: GCC compiler for XRPLF/clio.
|
||||||
|
|
||||||
|
gcc-merge:
|
||||||
|
name: Merge and push multi-arch GCC docker image
|
||||||
|
runs-on: heavy
|
||||||
|
needs: [repo, gcc-amd64, gcc-arm64]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/compilers/gcc/**"
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
if: github.repository_owner == 'XRPLF' && github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_PW }}
|
||||||
|
|
||||||
|
- name: Create and push multi-arch manifest
|
||||||
|
if: github.event_name != 'pull_request' && steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
run: |
|
||||||
|
push_image() {
|
||||||
|
image=$1
|
||||||
|
|
||||||
|
docker buildx imagetools create \
|
||||||
|
-t $image:latest \
|
||||||
|
-t $image:${{ env.GCC_MAJOR_VERSION }} \
|
||||||
|
-t $image:${{ env.GCC_VERSION }} \
|
||||||
|
-t $image:${{ github.sha }} \
|
||||||
|
$image:arm64-latest \
|
||||||
|
$image:amd64-latest
|
||||||
|
}
|
||||||
|
push_image ${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
|
||||||
|
if [[ ${{ github.repository_owner }} == 'XRPLF' ]]; then
|
||||||
|
push_image rippleci/clio_clang
|
||||||
|
fi
|
||||||
|
|
||||||
|
clang:
|
||||||
|
name: Build and push Clang docker image
|
||||||
|
runs-on: heavy
|
||||||
|
needs: repo
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/compilers/clang/**"
|
||||||
|
|
||||||
|
- uses: ./.github/actions/build_docker_image
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-clang
|
||||||
|
${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_clang' || '' }}
|
||||||
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
|
directory: docker/compilers/clang
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest
|
||||||
|
type=raw,value=${{ env.CLANG_MAJOR_VERSION }}
|
||||||
|
type=raw,value=${{ github.sha }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
build_args: |
|
||||||
|
CLANG_MAJOR_VERSION=${{ env.CLANG_MAJOR_VERSION }}
|
||||||
|
dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_clang' || '' }}
|
||||||
|
dockerhub_description: Clang compiler for XRPLF/clio.
|
||||||
|
|
||||||
|
tools-amd64:
|
||||||
|
name: Build and push tools docker image (amd64)
|
||||||
|
runs-on: heavy
|
||||||
|
needs: [repo, gcc-merge]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/tools/**"
|
||||||
|
|
||||||
|
- uses: ./.github/actions/build_docker_image
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
|
||||||
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
|
directory: docker/tools
|
||||||
|
tags: |
|
||||||
|
type=raw,value=amd64-latest
|
||||||
|
type=raw,value=amd64-${{ github.sha }}
|
||||||
|
platforms: linux/amd64
|
||||||
|
build_args: |
|
||||||
|
GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
|
||||||
|
GCC_VERSION=${{ env.GCC_VERSION }}
|
||||||
|
|
||||||
|
tools-arm64:
|
||||||
|
name: Build and push tools docker image (arm64)
|
||||||
|
runs-on: heavy-arm64
|
||||||
|
needs: [repo, gcc-merge]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/tools/**"
|
||||||
|
|
||||||
|
- uses: ./.github/actions/build_docker_image
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
|
||||||
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
|
directory: docker/tools
|
||||||
|
tags: |
|
||||||
|
type=raw,value=arm64-latest
|
||||||
|
type=raw,value=arm64-${{ github.sha }}
|
||||||
|
platforms: linux/arm64
|
||||||
|
build_args: |
|
||||||
|
GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
|
||||||
|
GCC_VERSION=${{ env.GCC_VERSION }}
|
||||||
|
|
||||||
|
tools-merge:
|
||||||
|
name: Merge and push multi-arch tools docker image
|
||||||
|
runs-on: heavy
|
||||||
|
needs: [repo, tools-amd64, tools-arm64]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
|
||||||
|
with:
|
||||||
|
files: "docker/tools/**"
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Create and push multi-arch manifest
|
||||||
|
if: github.event_name != 'pull_request' && steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
run: |
|
||||||
|
image=${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
|
||||||
|
docker buildx imagetools create \
|
||||||
|
-t $image:latest \
|
||||||
|
-t $image:${{ github.sha }} \
|
||||||
|
$image:arm64-latest \
|
||||||
|
$image:amd64-latest
|
||||||
|
|
||||||
|
ci:
|
||||||
|
name: Build and push CI docker image
|
||||||
|
runs-on: heavy
|
||||||
|
needs: [repo, gcc-merge, clang, tools-merge]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: ./.github/actions/build_docker_image
|
- uses: ./.github/actions/build_docker_image
|
||||||
env:
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||||
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
rippleci/clio_ci
|
${{ needs.repo.outputs.GHCR_REPO }}/clio-ci
|
||||||
ghcr.io/xrplf/clio-ci
|
${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_ci' || '' }}
|
||||||
dockerhub_repo: rippleci/clio_ci
|
|
||||||
push_image: ${{ github.event_name != 'pull_request' }}
|
push_image: ${{ github.event_name != 'pull_request' }}
|
||||||
directory: docker/ci
|
directory: docker/ci
|
||||||
tags: |
|
tags: |
|
||||||
type=raw,value=latest
|
type=raw,value=latest
|
||||||
type=raw,value=gcc_12_clang_16
|
type=raw,value=gcc_${{ env.GCC_MAJOR_VERSION }}_clang_${{ env.CLANG_MAJOR_VERSION }}
|
||||||
type=raw,value=${{ github.sha }}
|
type=raw,value=${{ github.sha }}
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
description: CI image for XRPLF/clio.
|
build_args: |
|
||||||
|
GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
|
||||||
|
CLANG_MAJOR_VERSION=${{ env.CLANG_MAJOR_VERSION }}
|
||||||
|
GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
|
||||||
|
GCC_VERSION=${{ env.GCC_VERSION }}
|
||||||
|
dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_ci' || '' }}
|
||||||
|
dockerhub_description: CI image for XRPLF/clio.
|
||||||
|
|||||||
101
.github/workflows/upload_conan_deps.yml
vendored
Normal file
101
.github/workflows/upload_conan_deps.yml
vendored
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
name: Upload Conan Dependencies
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 9 * * 1-5"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force_source_build:
|
||||||
|
description: "Force source build of all dependencies"
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
force_upload:
|
||||||
|
description: "Force upload of all dependencies"
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
pull_request:
|
||||||
|
branches: [develop]
|
||||||
|
paths:
|
||||||
|
- .github/workflows/upload_conan_deps.yml
|
||||||
|
|
||||||
|
- .github/actions/conan/action.yml
|
||||||
|
- ".github/scripts/conan/**"
|
||||||
|
|
||||||
|
- conanfile.py
|
||||||
|
- conan.lock
|
||||||
|
push:
|
||||||
|
branches: [develop]
|
||||||
|
paths:
|
||||||
|
- .github/workflows/upload_conan_deps.yml
|
||||||
|
|
||||||
|
- .github/actions/conan/action.yml
|
||||||
|
- ".github/scripts/conan/**"
|
||||||
|
|
||||||
|
- conanfile.py
|
||||||
|
- conan.lock
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
generate-matrix:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Calculate conan matrix
|
||||||
|
id: set-matrix
|
||||||
|
run: .github/scripts/conan/generate_matrix.py >> "${GITHUB_OUTPUT}"
|
||||||
|
|
||||||
|
upload-conan-deps:
|
||||||
|
name: Build ${{ matrix.compiler }}${{ matrix.sanitizer_ext }} ${{ matrix.build_type }}
|
||||||
|
|
||||||
|
needs: generate-matrix
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
container: ${{ matrix.container != '' && fromJson(matrix.container) || null }}
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_PROFILE: ${{ matrix.compiler }}${{ matrix.sanitizer_ext }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Prepare runner
|
||||||
|
uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
|
||||||
|
with:
|
||||||
|
disable_ccache: true
|
||||||
|
|
||||||
|
- name: Setup conan on macOS
|
||||||
|
if: runner.os == 'macOS'
|
||||||
|
shell: bash
|
||||||
|
run: ./.github/scripts/conan/init.sh
|
||||||
|
|
||||||
|
- name: Show conan profile
|
||||||
|
run: conan profile show --profile:all ${{ env.CONAN_PROFILE }}
|
||||||
|
|
||||||
|
- name: Run conan
|
||||||
|
uses: ./.github/actions/conan
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ env.CONAN_PROFILE }}
|
||||||
|
# We check that everything builds fine from source on scheduled runs
|
||||||
|
# But we do build and upload packages with build=missing by default
|
||||||
|
force_conan_source_build: ${{ github.event_name == 'schedule' || github.event.inputs.force_source_build == 'true' }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
|
||||||
|
- name: Login to Conan
|
||||||
|
if: github.repository_owner == 'XRPLF' && github.event_name != 'pull_request'
|
||||||
|
run: conan remote login -p ${{ secrets.CONAN_PASSWORD }} xrplf ${{ secrets.CONAN_USERNAME }}
|
||||||
|
|
||||||
|
- name: Upload Conan packages
|
||||||
|
if: github.repository_owner == 'XRPLF' && github.event_name != 'pull_request' && github.event_name != 'schedule'
|
||||||
|
run: conan upload "*" -r=xrplf --confirm ${{ github.event.inputs.force_upload == 'true' && '--force' || '' }}
|
||||||
4
.github/workflows/upload_coverage_report.yml
vendored
4
.github/workflows/upload_coverage_report.yml
vendored
@@ -18,14 +18,14 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Download report artifact
|
- name: Download report artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: coverage-report.xml
|
name: coverage-report.xml
|
||||||
path: build
|
path: build
|
||||||
|
|
||||||
- name: Upload coverage report
|
- name: Upload coverage report
|
||||||
if: ${{ hashFiles('build/coverage_report.xml') != '' }}
|
if: ${{ hashFiles('build/coverage_report.xml') != '' }}
|
||||||
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
|
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
|
||||||
with:
|
with:
|
||||||
files: build/coverage_report.xml
|
files: build/coverage_report.xml
|
||||||
fail_ci_if_error: true
|
fail_ci_if_error: true
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,4 +9,3 @@
|
|||||||
.sanitizer-report
|
.sanitizer-report
|
||||||
CMakeUserPresets.json
|
CMakeUserPresets.json
|
||||||
config.json
|
config.json
|
||||||
src/util/build/Build.cpp
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
---
|
---
|
||||||
ignored:
|
ignored:
|
||||||
- DL3003
|
- DL3003
|
||||||
|
- DL3007
|
||||||
- DL3008
|
- DL3008
|
||||||
- DL3013
|
- DL3013
|
||||||
- DL3015
|
|
||||||
- DL3027
|
|
||||||
- DL3047
|
|
||||||
|
|||||||
@@ -11,28 +11,27 @@
|
|||||||
#
|
#
|
||||||
# See https://pre-commit.com for more information
|
# See https://pre-commit.com for more information
|
||||||
# See https://pre-commit.com/hooks.html for more hooks
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
|
exclude: ^(docs/doxygen-awesome-theme/|conan\.lock$)
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
# `pre-commit sample-config` default hooks
|
# `pre-commit sample-config` default hooks
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b # frozen: v5.0.0
|
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
- id: check-executables-have-shebangs
|
- id: check-executables-have-shebangs
|
||||||
- id: check-shebang-scripts-are-executable
|
- id: check-shebang-scripts-are-executable
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
exclude: ^docs/doxygen-awesome-theme/
|
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
exclude: ^docs/doxygen-awesome-theme/
|
|
||||||
|
|
||||||
# Autoformat: YAML, JSON, Markdown, etc.
|
# Autoformat: YAML, JSON, Markdown, etc.
|
||||||
- repo: https://github.com/rbubley/mirrors-prettier
|
- repo: https://github.com/rbubley/mirrors-prettier
|
||||||
rev: 787fb9f542b140ba0b2aced38e6a3e68021647a3 # frozen: v3.5.3
|
rev: 5ba47274f9b181bce26a5150a725577f3c336011 # frozen: v3.6.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: prettier
|
- id: prettier
|
||||||
exclude: ^docs/doxygen-awesome-theme/
|
|
||||||
|
|
||||||
- repo: https://github.com/igorshubovych/markdownlint-cli
|
- repo: https://github.com/igorshubovych/markdownlint-cli
|
||||||
rev: 586c3ea3f51230da42bab657c6a32e9e66c364f0 # frozen: v0.44.0
|
rev: 192ad822316c3a22fb3d3cc8aa6eafa0b8488360 # frozen: v0.45.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: markdownlint-fix
|
- id: markdownlint-fix
|
||||||
exclude: LICENSE.md
|
exclude: LICENSE.md
|
||||||
@@ -56,17 +55,32 @@ repos:
|
|||||||
--ignore-words=pre-commit-hooks/codespell_ignore.txt,
|
--ignore-words=pre-commit-hooks/codespell_ignore.txt,
|
||||||
]
|
]
|
||||||
|
|
||||||
# Running fix-local-includes before clang-format
|
# Running some C++ hooks before clang-format
|
||||||
# to ensure that the include order is correct.
|
# to ensure that the style is consistent.
|
||||||
- repo: local
|
- repo: local
|
||||||
hooks:
|
hooks:
|
||||||
|
- id: json-in-cpp
|
||||||
|
name: Fix JSON style in C++
|
||||||
|
entry: pre-commit-hooks/json_in_cpp.py
|
||||||
|
types: [c++]
|
||||||
|
language: python
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
tests/unit/etl/SubscriptionSourceTests.cpp|
|
||||||
|
tests/unit/web/ServerTests.cpp|
|
||||||
|
tests/unit/web/impl/ErrorHandlingTests.cpp|
|
||||||
|
tests/unit/web/ng/ServerTests.cpp|
|
||||||
|
tests/unit/web/ng/impl/ErrorHandlingTests.cpp
|
||||||
|
)$
|
||||||
|
|
||||||
- id: fix-local-includes
|
- id: fix-local-includes
|
||||||
name: Fix Local Includes
|
name: Fix Local Includes
|
||||||
entry: pre-commit-hooks/fix-local-includes.sh
|
entry: pre-commit-hooks/fix-local-includes.sh
|
||||||
types: [c++]
|
types: [c++]
|
||||||
language: script
|
language: script
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||||
rev: f9a52e87b6cdcb01b0a62b8611d9ba9f2dad0067 # frozen: v19.1.7
|
rev: 86fdcc9bd34d6afbbd29358b97436c8ffe3aa3b2 # frozen: v21.1.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: clang-format
|
- id: clang-format
|
||||||
args: [--style=file]
|
args: [--style=file]
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
set(CMAKE_PROJECT_INCLUDE_BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClioVersion.cmake)
|
|
||||||
|
|
||||||
project(clio VERSION ${CLIO_VERSION} HOMEPAGE_URL "https://github.com/XRPLF/clio"
|
project(clio VERSION ${CLIO_VERSION} HOMEPAGE_URL "https://github.com/XRPLF/clio"
|
||||||
DESCRIPTION "An XRP Ledger API Server"
|
DESCRIPTION "An XRP Ledger API Server"
|
||||||
)
|
)
|
||||||
@@ -13,7 +11,7 @@ option(integration_tests "Build integration tests" FALSE)
|
|||||||
option(benchmark "Build benchmarks" FALSE)
|
option(benchmark "Build benchmarks" FALSE)
|
||||||
option(docs "Generate doxygen docs" FALSE)
|
option(docs "Generate doxygen docs" FALSE)
|
||||||
option(coverage "Build test coverage report" FALSE)
|
option(coverage "Build test coverage report" FALSE)
|
||||||
option(packaging "Create distribution packages" FALSE)
|
option(package "Create distribution packages" FALSE)
|
||||||
option(lint "Run clang-tidy checks during compilation" FALSE)
|
option(lint "Run clang-tidy checks during compilation" FALSE)
|
||||||
option(static "Statically linked Clio" FALSE)
|
option(static "Statically linked Clio" FALSE)
|
||||||
option(snapshot "Build snapshot tool" FALSE)
|
option(snapshot "Build snapshot tool" FALSE)
|
||||||
@@ -31,6 +29,7 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
|||||||
include(Ccache)
|
include(Ccache)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
include(ClangTidy)
|
include(ClangTidy)
|
||||||
|
include(Linker)
|
||||||
|
|
||||||
add_library(clio_options INTERFACE)
|
add_library(clio_options INTERFACE)
|
||||||
target_compile_features(clio_options INTERFACE cxx_std_23) # Clio needs c++23 but deps can remain c++20 for now
|
target_compile_features(clio_options INTERFACE cxx_std_23) # Clio needs c++23 but deps can remain c++20 for now
|
||||||
@@ -40,11 +39,6 @@ if (verbose)
|
|||||||
set(CMAKE_VERBOSE_MAKEFILE TRUE)
|
set(CMAKE_VERBOSE_MAKEFILE TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (packaging)
|
|
||||||
add_definitions(-DPKG=1)
|
|
||||||
target_compile_definitions(clio_options INTERFACE PKG=1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Clio tweaks and checks
|
# Clio tweaks and checks
|
||||||
include(CheckCompiler)
|
include(CheckCompiler)
|
||||||
include(Settings)
|
include(Settings)
|
||||||
@@ -58,6 +52,7 @@ include(deps/Threads)
|
|||||||
include(deps/libfmt)
|
include(deps/libfmt)
|
||||||
include(deps/cassandra)
|
include(deps/cassandra)
|
||||||
include(deps/libbacktrace)
|
include(deps/libbacktrace)
|
||||||
|
include(deps/spdlog)
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
@@ -69,15 +64,17 @@ endif ()
|
|||||||
# Enable selected sanitizer if enabled via `san`
|
# Enable selected sanitizer if enabled via `san`
|
||||||
if (san)
|
if (san)
|
||||||
set(SUPPORTED_SANITIZERS "address" "thread" "memory" "undefined")
|
set(SUPPORTED_SANITIZERS "address" "thread" "memory" "undefined")
|
||||||
list(FIND SUPPORTED_SANITIZERS "${san}" INDEX)
|
if (NOT san IN_LIST SUPPORTED_SANITIZERS)
|
||||||
if (INDEX EQUAL -1)
|
|
||||||
message(FATAL_ERROR "Error: Unsupported sanitizer '${san}'. Supported values are: ${SUPPORTED_SANITIZERS}.")
|
message(FATAL_ERROR "Error: Unsupported sanitizer '${san}'. Supported values are: ${SUPPORTED_SANITIZERS}.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_compile_options(
|
# Sanitizers recommend minimum of -O1 for reasonable performance so we enable it for debug builds
|
||||||
clio_options INTERFACE # Sanitizers recommend minimum of -O1 for reasonable performance
|
set(SAN_OPTIMIZATION_FLAG "")
|
||||||
$<$<CONFIG:Debug>:-O1> ${SAN_FLAG} -fno-omit-frame-pointer
|
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
)
|
set(SAN_OPTIMIZATION_FLAG -O1)
|
||||||
|
endif ()
|
||||||
|
target_compile_options(clio_options INTERFACE ${SAN_OPTIMIZATION_FLAG} ${SAN_FLAG} -fno-omit-frame-pointer)
|
||||||
|
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
clio_options INTERFACE $<$<STREQUAL:${san},address>:SANITIZER=ASAN> $<$<STREQUAL:${san},thread>:SANITIZER=TSAN>
|
clio_options INTERFACE $<$<STREQUAL:${san},address>:SANITIZER=ASAN> $<$<STREQUAL:${san},thread>:SANITIZER=TSAN>
|
||||||
$<$<STREQUAL:${san},memory>:SANITIZER=MSAN> $<$<STREQUAL:${san},undefined>:SANITIZER=UBSAN>
|
$<$<STREQUAL:${san},memory>:SANITIZER=MSAN> $<$<STREQUAL:${san},undefined>:SANITIZER=UBSAN>
|
||||||
@@ -91,8 +88,8 @@ if (docs)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
include(install/install)
|
include(install/install)
|
||||||
if (packaging)
|
if (package)
|
||||||
include(cmake/packaging.cmake) # This file exists only in build runner
|
include(ClioPackage)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (snapshot)
|
if (snapshot)
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ target_sources(
|
|||||||
Playground.cpp
|
Playground.cpp
|
||||||
# ExecutionContext
|
# ExecutionContext
|
||||||
util/async/ExecutionContextBenchmarks.cpp
|
util/async/ExecutionContextBenchmarks.cpp
|
||||||
|
# Logger
|
||||||
|
util/log/LoggerBenchmark.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
include(deps/gbench)
|
include(deps/gbench)
|
||||||
|
|
||||||
target_include_directories(clio_benchmark PRIVATE .)
|
target_include_directories(clio_benchmark PRIVATE .)
|
||||||
target_link_libraries(clio_benchmark PUBLIC clio_etl benchmark::benchmark_main)
|
target_link_libraries(clio_benchmark PUBLIC clio_util benchmark::benchmark_main spdlog::spdlog)
|
||||||
set_target_properties(clio_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
set_target_properties(clio_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
|
|||||||
@@ -191,8 +191,9 @@ generateData()
|
|||||||
constexpr auto kTOTAL = 10'000;
|
constexpr auto kTOTAL = 10'000;
|
||||||
std::vector<uint64_t> data;
|
std::vector<uint64_t> data;
|
||||||
data.reserve(kTOTAL);
|
data.reserve(kTOTAL);
|
||||||
|
util::MTRandomGenerator randomGenerator;
|
||||||
for (auto i = 0; i < kTOTAL; ++i)
|
for (auto i = 0; i < kTOTAL; ++i)
|
||||||
data.push_back(util::Random::uniform(1, 100'000'000));
|
data.push_back(randomGenerator.uniform(1, 100'000'000));
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
149
benchmarks/util/log/LoggerBenchmark.cpp
Normal file
149
benchmarks/util/log/LoggerBenchmark.cpp
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2025, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "util/config/ConfigDefinition.hpp"
|
||||||
|
#include "util/log/Logger.hpp"
|
||||||
|
#include "util/prometheus/Prometheus.hpp"
|
||||||
|
|
||||||
|
#include <benchmark/benchmark.h>
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <spdlog/async.h>
|
||||||
|
#include <spdlog/async_logger.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
#include <barrier>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace util;
|
||||||
|
|
||||||
|
static constexpr auto kLOG_FORMAT = "%Y-%m-%d %H:%M:%S.%f %^%3!l:%n%$ - %v";
|
||||||
|
|
||||||
|
struct BenchmarkLoggingInitializer {
|
||||||
|
static std::shared_ptr<spdlog::sinks::sink>
|
||||||
|
createFileSink(LogService::FileLoggingParams const& params)
|
||||||
|
{
|
||||||
|
return LogService::createFileSink(params, kLOG_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Logger
|
||||||
|
getLogger(std::shared_ptr<spdlog::logger> logger)
|
||||||
|
{
|
||||||
|
return Logger(std::move(logger));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
std::string
|
||||||
|
uniqueLogDir()
|
||||||
|
{
|
||||||
|
auto const epochTime = std::chrono::high_resolution_clock::now().time_since_epoch();
|
||||||
|
auto const tmpDir = std::filesystem::temp_directory_path();
|
||||||
|
std::string const dirName =
|
||||||
|
fmt::format("logs_{}", std::chrono::duration_cast<std::chrono::microseconds>(epochTime).count());
|
||||||
|
return tmpDir / "clio_benchmark" / dirName;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
static void
|
||||||
|
benchmarkConcurrentFileLogging(benchmark::State& state)
|
||||||
|
{
|
||||||
|
spdlog::drop_all();
|
||||||
|
|
||||||
|
auto const numThreads = static_cast<size_t>(state.range(0));
|
||||||
|
auto const messagesPerThread = static_cast<size_t>(state.range(1));
|
||||||
|
|
||||||
|
PrometheusService::init(config::getClioConfig());
|
||||||
|
|
||||||
|
auto const logDir = uniqueLogDir();
|
||||||
|
for (auto _ : state) {
|
||||||
|
state.PauseTiming();
|
||||||
|
|
||||||
|
std::filesystem::create_directories(logDir);
|
||||||
|
spdlog::init_thread_pool(8192, 1);
|
||||||
|
|
||||||
|
auto fileSink = BenchmarkLoggingInitializer::createFileSink({
|
||||||
|
.logDir = logDir,
|
||||||
|
.rotationSizeMB = 5,
|
||||||
|
.dirMaxFiles = 25,
|
||||||
|
});
|
||||||
|
|
||||||
|
std::vector<std::thread> threads;
|
||||||
|
threads.reserve(numThreads);
|
||||||
|
|
||||||
|
std::chrono::high_resolution_clock::time_point start;
|
||||||
|
std::barrier barrier(numThreads, [&state, &start]() {
|
||||||
|
state.ResumeTiming();
|
||||||
|
start = std::chrono::high_resolution_clock::now();
|
||||||
|
});
|
||||||
|
|
||||||
|
for (size_t threadNum = 0; threadNum < numThreads; ++threadNum) {
|
||||||
|
threads.emplace_back([threadNum, messagesPerThread, fileSink, &barrier]() {
|
||||||
|
std::string const channel = fmt::format("Thread_{}", threadNum);
|
||||||
|
auto logger = std::make_shared<spdlog::async_logger>(
|
||||||
|
channel, fileSink, spdlog::thread_pool(), spdlog::async_overflow_policy::block
|
||||||
|
);
|
||||||
|
spdlog::register_logger(logger);
|
||||||
|
Logger const threadLogger = BenchmarkLoggingInitializer::getLogger(std::move(logger));
|
||||||
|
|
||||||
|
barrier.arrive_and_wait();
|
||||||
|
|
||||||
|
for (size_t messageNum = 0; messageNum < messagesPerThread; ++messageNum) {
|
||||||
|
LOG(threadLogger.info()) << "Test log message #" << messageNum;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& thread : threads) {
|
||||||
|
thread.join();
|
||||||
|
}
|
||||||
|
spdlog::shutdown();
|
||||||
|
|
||||||
|
auto const end = std::chrono::high_resolution_clock::now();
|
||||||
|
state.SetIterationTime(std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count());
|
||||||
|
|
||||||
|
std::filesystem::remove_all(logDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const totalMessages = numThreads * messagesPerThread;
|
||||||
|
state.counters["TotalMessagesRate"] = benchmark::Counter(totalMessages, benchmark::Counter::kIsRate);
|
||||||
|
state.counters["Threads"] = numThreads;
|
||||||
|
state.counters["MessagesPerThread"] = messagesPerThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
// One line of log message is around 110 bytes
|
||||||
|
// So, 100K messages is around 10.5MB
|
||||||
|
|
||||||
|
BENCHMARK(benchmarkConcurrentFileLogging)
|
||||||
|
->ArgsProduct({
|
||||||
|
// Number of threads
|
||||||
|
{1, 2, 4, 8},
|
||||||
|
// Messages per thread
|
||||||
|
{10'000, 100'000, 500'000, 1'000'000, 10'000'000},
|
||||||
|
})
|
||||||
|
->UseManualTime()
|
||||||
|
->Unit(benchmark::kMillisecond);
|
||||||
17
cliff.toml
17
cliff.toml
@@ -8,15 +8,24 @@
|
|||||||
[changelog]
|
[changelog]
|
||||||
# template for the changelog header
|
# template for the changelog header
|
||||||
header = """
|
header = """
|
||||||
# Changelog\n
|
|
||||||
All notable changes to this project will be documented in this file.\n
|
|
||||||
"""
|
"""
|
||||||
# template for the changelog body
|
# template for the changelog body
|
||||||
# https://keats.github.io/tera/docs/#introduction
|
# https://keats.github.io/tera/docs/#introduction
|
||||||
|
|
||||||
body = """
|
body = """
|
||||||
{% if version %}\
|
{% if version %}\
|
||||||
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
Version {{ version | trim_start_matches(pat="v") }} of Clio, an XRP Ledger API server optimized for HTTP and WebSocket API calls, is now available.
|
||||||
{% else %}\
|
{% else %}\
|
||||||
|
Clio, an XRP Ledger API server optimized for HTTP and WebSocket API calls, is under active development.
|
||||||
|
{% endif %}\
|
||||||
|
|
||||||
|
<!-- Please, remove one of the 2 following lines -->
|
||||||
|
This release adds new features and bug fixes.
|
||||||
|
This release adds bug fixes.
|
||||||
|
\
|
||||||
|
{% if version %}
|
||||||
|
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||||
|
{% else %}
|
||||||
## [unreleased]
|
## [unreleased]
|
||||||
{% endif %}\
|
{% endif %}\
|
||||||
{% for group, commits in commits | filter(attribute="merge_commit", value=false) | group_by(attribute="group") %}
|
{% for group, commits in commits | filter(attribute="merge_commit", value=false) | group_by(attribute="group") %}
|
||||||
@@ -24,7 +33,7 @@ body = """
|
|||||||
{% for commit in commits %}
|
{% for commit in commits %}
|
||||||
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
|
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
|
||||||
{% if commit.breaking %}[**breaking**] {% endif %}\
|
{% if commit.breaking %}[**breaking**] {% endif %}\
|
||||||
{{ commit.message | upper_first }} {% if commit.remote.username %}by @{{ commit.remote.username }}{% endif %}\
|
{{ commit.message | upper_first }}{% if commit.remote.username %} by @{{ commit.remote.username }}{% endif %}\
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}\n
|
{% endfor %}\n
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ if (lint)
|
|||||||
endif ()
|
endif ()
|
||||||
message(STATUS "Using clang-tidy from CLIO_CLANG_TIDY_BIN")
|
message(STATUS "Using clang-tidy from CLIO_CLANG_TIDY_BIN")
|
||||||
else ()
|
else ()
|
||||||
find_program(_CLANG_TIDY_BIN NAMES "clang-tidy-19" "clang-tidy" REQUIRED)
|
find_program(_CLANG_TIDY_BIN NAMES "clang-tidy-20" "clang-tidy" REQUIRED)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (NOT _CLANG_TIDY_BIN)
|
if (NOT _CLANG_TIDY_BIN)
|
||||||
|
|||||||
8
cmake/ClioPackage.cmake
Normal file
8
cmake/ClioPackage.cmake
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/ClioVersion.cmake")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/clio")
|
||||||
|
set(CPACK_PACKAGE_VERSION "${CLIO_VERSION}")
|
||||||
|
set(CPACK_STRIP_FILES TRUE)
|
||||||
|
|
||||||
|
include(pkg/deb)
|
||||||
|
include(CPack)
|
||||||
@@ -1,42 +1,43 @@
|
|||||||
#[===================================================================[
|
|
||||||
write version to source
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
find_package(Git REQUIRED)
|
find_package(Git REQUIRED)
|
||||||
|
|
||||||
set(GIT_COMMAND rev-parse --short HEAD)
|
set(GIT_COMMAND describe --tags --exact-match)
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE REV
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND}
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE TAG
|
||||||
|
RESULT_VARIABLE RC
|
||||||
|
ERROR_VARIABLE ERR
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE
|
||||||
)
|
)
|
||||||
|
|
||||||
set(GIT_COMMAND branch --show-current)
|
if (RC EQUAL 0)
|
||||||
execute_process(
|
message(STATUS "Found tag '${TAG}' in git. Will use it as Clio version")
|
||||||
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BRANCH
|
set(CLIO_VERSION "${TAG}")
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
set(DOC_CLIO_VERSION "${TAG}")
|
||||||
)
|
else ()
|
||||||
|
message(STATUS "Error finding tag in git: ${ERR}")
|
||||||
|
message(STATUS "Will use 'YYYYMMDDHMS-<branch>-<git-rev>' as Clio version")
|
||||||
|
|
||||||
if (BRANCH STREQUAL "")
|
|
||||||
set(BRANCH "dev")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT (BRANCH MATCHES master OR BRANCH MATCHES release/*)) # for develop and any other branch name
|
|
||||||
# YYYYMMDDHMS-<branch>-<git-rev>
|
|
||||||
set(GIT_COMMAND show -s --date=format:%Y%m%d%H%M%S --format=%cd)
|
set(GIT_COMMAND show -s --date=format:%Y%m%d%H%M%S --format=%cd)
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE DATE
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE DATE
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(GIT_COMMAND branch --show-current)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BRANCH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
|
||||||
|
)
|
||||||
|
|
||||||
|
set(GIT_COMMAND rev-parse --short HEAD)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE REV
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
|
||||||
|
)
|
||||||
|
|
||||||
set(CLIO_VERSION "${DATE}-${BRANCH}-${REV}")
|
set(CLIO_VERSION "${DATE}-${BRANCH}-${REV}")
|
||||||
set(DOC_CLIO_VERSION "develop")
|
set(DOC_CLIO_VERSION "develop")
|
||||||
else ()
|
|
||||||
set(GIT_COMMAND describe --tags)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE CLIO_TAG_VERSION
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
set(CLIO_VERSION "${CLIO_TAG_VERSION}")
|
|
||||||
set(DOC_CLIO_VERSION "${CLIO_TAG_VERSION}")
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (CMAKE_BUILD_TYPE MATCHES Debug)
|
if (CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
@@ -44,5 +45,3 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
message(STATUS "Build version: ${CLIO_VERSION}")
|
message(STATUS "Build version: ${CLIO_VERSION}")
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/Build.cpp.in ${CMAKE_CURRENT_LIST_DIR}/../src/util/build/Build.cpp)
|
|
||||||
|
|||||||
11
cmake/Linker.cmake
Normal file
11
cmake/Linker.cmake
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
if (DEFINED CMAKE_LINKER_TYPE)
|
||||||
|
message(STATUS "Custom linker is already set: ${CMAKE_LINKER_TYPE}")
|
||||||
|
return()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
find_program(MOLD_PATH mold)
|
||||||
|
|
||||||
|
if (MOLD_PATH AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
message(STATUS "Using Mold linker: ${MOLD_PATH}")
|
||||||
|
set(CMAKE_LINKER_TYPE MOLD)
|
||||||
|
endif ()
|
||||||
@@ -1,21 +1,22 @@
|
|||||||
set(COMPILER_FLAGS
|
set(COMPILER_FLAGS
|
||||||
|
-pedantic
|
||||||
-Wall
|
-Wall
|
||||||
-Wcast-align
|
-Wcast-align
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Wextra
|
|
||||||
-Werror
|
-Werror
|
||||||
|
-Wextra
|
||||||
-Wformat=2
|
-Wformat=2
|
||||||
-Wimplicit-fallthrough
|
-Wimplicit-fallthrough
|
||||||
-Wmisleading-indentation
|
-Wmisleading-indentation
|
||||||
-Wno-narrowing
|
|
||||||
-Wno-deprecated-declarations
|
|
||||||
-Wno-dangling-else
|
-Wno-dangling-else
|
||||||
|
-Wno-deprecated-declarations
|
||||||
|
-Wno-narrowing
|
||||||
-Wno-unused-but-set-variable
|
-Wno-unused-but-set-variable
|
||||||
-Wnon-virtual-dtor
|
-Wnon-virtual-dtor
|
||||||
-Wnull-dereference
|
-Wnull-dereference
|
||||||
-Wold-style-cast
|
-Wold-style-cast
|
||||||
-pedantic
|
|
||||||
-Wpedantic
|
-Wpedantic
|
||||||
|
-Wunreachable-code
|
||||||
-Wunused
|
-Wunused
|
||||||
# FIXME: The following bunch are needed for gcc12 atm.
|
# FIXME: The following bunch are needed for gcc12 atm.
|
||||||
-Wno-missing-requires
|
-Wno-missing-requires
|
||||||
|
|||||||
5
cmake/deps/spdlog.cmake
Normal file
5
cmake/deps/spdlog.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
find_package(spdlog REQUIRED)
|
||||||
|
|
||||||
|
if (NOT TARGET spdlog::spdlog)
|
||||||
|
message(FATAL_ERROR "spdlog::spdlog target not found")
|
||||||
|
endif ()
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Clio XRPL API server
|
|
||||||
Documentation=https://github.com/XRPLF/clio.git
|
|
||||||
|
|
||||||
After=network-online.target
|
|
||||||
Wants=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=@CLIO_INSTALL_DIR@/bin/clio_server @CLIO_INSTALL_DIR@/etc/config.json
|
|
||||||
Restart=on-failure
|
|
||||||
User=clio
|
|
||||||
Group=clio
|
|
||||||
LimitNOFILE=65536
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
set(CLIO_INSTALL_DIR "/opt/clio")
|
set(CLIO_INSTALL_DIR "/opt/clio")
|
||||||
set(CMAKE_INSTALL_PREFIX ${CLIO_INSTALL_DIR})
|
set(CMAKE_INSTALL_PREFIX "${CLIO_INSTALL_DIR}" CACHE PATH "Install prefix" FORCE)
|
||||||
|
|
||||||
install(TARGETS clio_server DESTINATION bin)
|
set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
install(TARGETS clio_server DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||||
|
|
||||||
file(READ docs/examples/config/example-config.json config)
|
file(READ docs/examples/config/example-config.json config)
|
||||||
string(REGEX REPLACE "./clio_log" "/var/log/clio/" config "${config}")
|
string(REGEX REPLACE "./clio_log" "/var/log/clio/" config "${config}")
|
||||||
file(WRITE ${CMAKE_BINARY_DIR}/install-config.json "${config}")
|
file(WRITE ${CMAKE_BINARY_DIR}/install-config.json "${config}")
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/install-config.json DESTINATION etc RENAME config.json)
|
install(FILES ${CMAKE_BINARY_DIR}/install-config.json DESTINATION etc RENAME config.json)
|
||||||
|
|
||||||
configure_file("${CMAKE_SOURCE_DIR}/cmake/install/clio.service.in" "${CMAKE_BINARY_DIR}/clio.service")
|
|
||||||
|
|
||||||
install(FILES "${CMAKE_BINARY_DIR}/clio.service" DESTINATION /lib/systemd/system)
|
|
||||||
|
|||||||
12
cmake/pkg/deb.cmake
Normal file
12
cmake/pkg/deb.cmake
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
set(CPACK_GENERATOR "DEB")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/XRPLF/clio")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Ripple Labs Inc. <support@ripple.com>")
|
||||||
|
|
||||||
|
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
|
||||||
|
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||||
|
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_SOURCE_DIR}/cmake/pkg/postinst)
|
||||||
|
|
||||||
|
# We must replace "-" with "~" otherwise dpkg will sort "X.Y.Z-b1" as greater than "X.Y.Z"
|
||||||
|
string(REPLACE "-" "~" git "${CPACK_PACKAGE_VERSION}")
|
||||||
46
cmake/pkg/postinst
Executable file
46
cmake/pkg/postinst
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
USER_NAME=clio
|
||||||
|
GROUP_NAME="${USER_NAME}"
|
||||||
|
CLIO_EXECUTABLE="clio_server"
|
||||||
|
CLIO_PREFIX="/opt/clio"
|
||||||
|
CLIO_BIN="$CLIO_PREFIX/bin/${CLIO_EXECUTABLE}"
|
||||||
|
CLIO_CONFIG="$CLIO_PREFIX/etc/config.json"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
configure)
|
||||||
|
if ! id -u "$USER_NAME" >/dev/null 2>&1; then
|
||||||
|
# Users who should not have a home directory should have their home directory set to /nonexistent
|
||||||
|
# https://www.debian.org/doc/debian-policy/ch-opersys.html#non-existent-home-directories
|
||||||
|
useradd \
|
||||||
|
--system \
|
||||||
|
--home-dir /nonexistent \
|
||||||
|
--no-create-home \
|
||||||
|
--shell /usr/sbin/nologin \
|
||||||
|
--comment "system user for ${CLIO_EXECUTABLE}" \
|
||||||
|
--user-group \
|
||||||
|
${USER_NAME}
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -d -o "$USER_NAME" -g "$GROUP_NAME" /var/log/clio
|
||||||
|
|
||||||
|
if [ -f "$CLIO_CONFIG" ]; then
|
||||||
|
chown "$USER_NAME:$GROUP_NAME" "$CLIO_CONFIG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
chown -R "$USER_NAME:$GROUP_NAME" "$CLIO_PREFIX"
|
||||||
|
|
||||||
|
ln -sf "$CLIO_BIN" "/usr/bin/${CLIO_EXECUTABLE}"
|
||||||
|
|
||||||
|
;;
|
||||||
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "postinst called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
61
conan.lock
Normal file
61
conan.lock
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"version": "0.5",
|
||||||
|
"requires": [
|
||||||
|
"zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497",
|
||||||
|
"xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683",
|
||||||
|
"xrpl/2.6.0#57b93b5a6c99dc8511fccb3bb5390352%1756820296.642",
|
||||||
|
"sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869",
|
||||||
|
"spdlog/1.15.3#3ca0e9e6b83af4d0151e26541d140c86%1754401846.61",
|
||||||
|
"soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318",
|
||||||
|
"re2/20230301#dfd6e2bf050eb90ddd8729cfb4c844a4%1756234257.976",
|
||||||
|
"rapidjson/cci.20220822#1b9d8c2256876a154172dc5cfbe447c6%1754325007.656",
|
||||||
|
"protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
|
||||||
|
"openssl/1.1.1w#a8f0792d7c5121b954578a7149d23e03%1756223730.729",
|
||||||
|
"nudb/2.0.9#c62cfd501e57055a7e0d8ee3d5e5427d%1756234237.107",
|
||||||
|
"minizip/1.2.13#9e87d57804bd372d6d1e32b1871517a3%1754325004.374",
|
||||||
|
"lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999",
|
||||||
|
"libuv/1.46.0#dc28c1f653fa197f00db5b577a6f6011%1754325003.592",
|
||||||
|
"libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64",
|
||||||
|
"libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1756230911.03",
|
||||||
|
"libarchive/3.8.1#5cf685686322e906cb42706ab7e099a8%1756234256.696",
|
||||||
|
"http_parser/2.9.4#98d91690d6fd021e9e624218a85d9d97%1754325001.385",
|
||||||
|
"gtest/1.14.0#f8f0757a574a8dd747d16af62d6eb1b7%1754325000.842",
|
||||||
|
"grpc/1.50.1#02291451d1e17200293a409410d1c4e1%1756234248.958",
|
||||||
|
"fmt/11.2.0#579bb2cdf4a7607621beea4eb4651e0f%1754324999.086",
|
||||||
|
"doctest/2.4.11#a4211dfc329a16ba9f280f9574025659%1756234220.819",
|
||||||
|
"date/3.0.4#f74bbba5a08fa388256688743136cb6f%1756234217.493",
|
||||||
|
"cassandra-cpp-driver/2.17.0#e50919efac8418c26be6671fd702540a%1754324997.363",
|
||||||
|
"c-ares/1.34.5#b78b91e7cfb1f11ce777a285bbf169c6%1756234217.915",
|
||||||
|
"bzip2/1.0.8#00b4a4658791c1f06914e087f0e792f5%1756234261.716",
|
||||||
|
"boost/1.83.0#5d975011d65b51abb2d2f6eb8386b368%1754325043.336",
|
||||||
|
"benchmark/1.9.4#ce4403f7a24d3e1f907cd9da4b678be4%1754578869.672",
|
||||||
|
"abseil/20230802.1#f0f91485b111dc9837a68972cb19ca7b%1756234220.907"
|
||||||
|
],
|
||||||
|
"build_requires": [
|
||||||
|
"zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497",
|
||||||
|
"protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
|
||||||
|
"cmake/3.31.8#dde3bde00bb843687e55aea5afa0e220%1756234232.89",
|
||||||
|
"b2/5.3.3#107c15377719889654eb9a162a673975%1756234226.28"
|
||||||
|
],
|
||||||
|
"python_requires": [],
|
||||||
|
"overrides": {
|
||||||
|
"boost/1.83.0": [
|
||||||
|
null,
|
||||||
|
"boost/1.83.0"
|
||||||
|
],
|
||||||
|
"protobuf/3.21.12": [
|
||||||
|
null,
|
||||||
|
"protobuf/3.21.12"
|
||||||
|
],
|
||||||
|
"boost/1.86.0": [
|
||||||
|
"boost/1.83.0#5d975011d65b51abb2d2f6eb8386b368"
|
||||||
|
],
|
||||||
|
"lz4/1.9.4": [
|
||||||
|
"lz4/1.10.0"
|
||||||
|
],
|
||||||
|
"sqlite3/3.44.2": [
|
||||||
|
"sqlite3/3.49.1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"config_requires": []
|
||||||
|
}
|
||||||
60
conanfile.py
60
conanfile.py
@@ -2,54 +2,29 @@ from conan import ConanFile
|
|||||||
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
|
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
|
||||||
|
|
||||||
|
|
||||||
class Clio(ConanFile):
|
class ClioConan(ConanFile):
|
||||||
name = 'clio'
|
name = 'clio'
|
||||||
license = 'ISC'
|
license = 'ISC'
|
||||||
author = 'Alex Kremer <akremer@ripple.com>, John Freeman <jfreeman@ripple.com>'
|
author = 'Alex Kremer <akremer@ripple.com>, John Freeman <jfreeman@ripple.com>, Ayaz Salikhov <asalikhov@ripple.com>'
|
||||||
url = 'https://github.com/xrplf/clio'
|
url = 'https://github.com/xrplf/clio'
|
||||||
description = 'Clio RPC server'
|
description = 'Clio RPC server'
|
||||||
settings = 'os', 'compiler', 'build_type', 'arch'
|
settings = 'os', 'compiler', 'build_type', 'arch'
|
||||||
options = {
|
options = {}
|
||||||
'static': [True, False], # static linkage
|
|
||||||
'fPIC': [True, False], # unused?
|
|
||||||
'verbose': [True, False],
|
|
||||||
'tests': [True, False], # build unit tests; create `clio_tests` binary
|
|
||||||
'integration_tests': [True, False], # build integration tests; create `clio_integration_tests` binary
|
|
||||||
'benchmark': [True, False], # build benchmarks; create `clio_benchmarks` binary
|
|
||||||
'docs': [True, False], # doxygen API docs; create custom target 'docs'
|
|
||||||
'packaging': [True, False], # create distribution packages
|
|
||||||
'coverage': [True, False], # build for test coverage report; create custom target `clio_tests-ccov`
|
|
||||||
'lint': [True, False], # run clang-tidy checks during compilation
|
|
||||||
'snapshot': [True, False], # build export/import snapshot tool
|
|
||||||
'time_trace': [True, False] # build using -ftime-trace to create compiler trace reports
|
|
||||||
}
|
|
||||||
|
|
||||||
requires = [
|
requires = [
|
||||||
'boost/1.83.0',
|
'boost/1.83.0',
|
||||||
'cassandra-cpp-driver/2.17.0',
|
'cassandra-cpp-driver/2.17.0',
|
||||||
'fmt/10.1.1',
|
'fmt/11.2.0',
|
||||||
'protobuf/3.21.9',
|
'protobuf/3.21.12',
|
||||||
'grpc/1.50.1',
|
'grpc/1.50.1',
|
||||||
'openssl/1.1.1v',
|
'openssl/1.1.1w',
|
||||||
'xrpl/2.5.0-b1',
|
'xrpl/2.6.0',
|
||||||
'zlib/1.3.1',
|
'zlib/1.3.1',
|
||||||
'libbacktrace/cci.20210118'
|
'libbacktrace/cci.20210118',
|
||||||
|
'spdlog/1.15.3',
|
||||||
]
|
]
|
||||||
|
|
||||||
default_options = {
|
default_options = {
|
||||||
'static': False,
|
|
||||||
'fPIC': True,
|
|
||||||
'verbose': False,
|
|
||||||
'tests': False,
|
|
||||||
'integration_tests': False,
|
|
||||||
'benchmark': False,
|
|
||||||
'packaging': False,
|
|
||||||
'coverage': False,
|
|
||||||
'lint': False,
|
|
||||||
'docs': False,
|
|
||||||
'snapshot': False,
|
|
||||||
'time_trace': False,
|
|
||||||
|
|
||||||
'xrpl/*:tests': False,
|
'xrpl/*:tests': False,
|
||||||
'xrpl/*:rocksdb': False,
|
'xrpl/*:rocksdb': False,
|
||||||
'cassandra-cpp-driver/*:shared': False,
|
'cassandra-cpp-driver/*:shared': False,
|
||||||
@@ -70,10 +45,8 @@ class Clio(ConanFile):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def requirements(self):
|
def requirements(self):
|
||||||
if self.options.tests or self.options.integration_tests:
|
self.requires('gtest/1.14.0')
|
||||||
self.requires('gtest/1.14.0')
|
self.requires('benchmark/1.9.4')
|
||||||
if self.options.benchmark:
|
|
||||||
self.requires('benchmark/1.8.3')
|
|
||||||
|
|
||||||
def configure(self):
|
def configure(self):
|
||||||
if self.settings.compiler == 'apple-clang':
|
if self.settings.compiler == 'apple-clang':
|
||||||
@@ -89,17 +62,6 @@ class Clio(ConanFile):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
tc = CMakeToolchain(self)
|
tc = CMakeToolchain(self)
|
||||||
tc.variables['verbose'] = self.options.verbose
|
|
||||||
tc.variables['static'] = self.options.static
|
|
||||||
tc.variables['tests'] = self.options.tests
|
|
||||||
tc.variables['integration_tests'] = self.options.integration_tests
|
|
||||||
tc.variables['coverage'] = self.options.coverage
|
|
||||||
tc.variables['lint'] = self.options.lint
|
|
||||||
tc.variables['docs'] = self.options.docs
|
|
||||||
tc.variables['packaging'] = self.options.packaging
|
|
||||||
tc.variables['benchmark'] = self.options.benchmark
|
|
||||||
tc.variables['snapshot'] = self.options.snapshot
|
|
||||||
tc.variables['time_trace'] = self.options.time_trace
|
|
||||||
tc.generate()
|
tc.generate()
|
||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
FROM rippleci/clio_clang:16
|
ARG GHCR_REPO=invalid
|
||||||
|
ARG CLANG_MAJOR_VERSION=invalid
|
||||||
|
ARG GCC_VERSION=invalid
|
||||||
|
|
||||||
|
FROM ${GHCR_REPO}/clio-gcc:${GCC_VERSION} AS clio-gcc
|
||||||
|
FROM ${GHCR_REPO}/clio-tools:latest AS clio-tools
|
||||||
|
|
||||||
|
FROM ${GHCR_REPO}/clio-clang:${CLANG_MAJOR_VERSION}
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
ARG TARGETARCH
|
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
@@ -13,112 +20,116 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|||||||
USER root
|
USER root
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
|
|
||||||
ENV CCACHE_VERSION=4.10.2 \
|
# Install common tools and dependencies
|
||||||
LLVM_TOOLS_VERSION=19 \
|
RUN apt-get update \
|
||||||
GH_VERSION=2.40.0 \
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
DOXYGEN_VERSION=1.12.0 \
|
curl \
|
||||||
CLANG_BUILD_ANALYZER_VERSION=1.6.0 \
|
dpkg-dev \
|
||||||
GIT_CLIFF_VERSION=2.8.0
|
file \
|
||||||
|
git \
|
||||||
|
git-lfs \
|
||||||
|
gnupg \
|
||||||
|
graphviz \
|
||||||
|
jq \
|
||||||
|
# libgmp, libmpfr and libncurses are gdb dependencies
|
||||||
|
libgmp-dev \
|
||||||
|
libmpfr-dev \
|
||||||
|
libncurses-dev \
|
||||||
|
make \
|
||||||
|
ninja-build \
|
||||||
|
wget \
|
||||||
|
zip \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Add repositories
|
# Install Python tools
|
||||||
RUN apt-get -qq update \
|
ARG PYTHON_VERSION=3.13
|
||||||
&& apt-get -qq install -y --no-install-recommends --no-install-suggests gnupg wget curl software-properties-common \
|
|
||||||
&& echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-${LLVM_TOOLS_VERSION} main" >> /etc/apt/sources.list \
|
|
||||||
&& wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
|
|
||||||
apt-get clean && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install packages
|
RUN add-apt-repository ppa:deadsnakes/ppa \
|
||||||
RUN apt update -qq \
|
&& apt-get update \
|
||||||
&& apt install -y --no-install-recommends --no-install-suggests python3 python3-pip git git-lfs make ninja-build flex bison jq graphviz \
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
clang-tidy-${LLVM_TOOLS_VERSION} clang-tools-${LLVM_TOOLS_VERSION} \
|
python${PYTHON_VERSION} \
|
||||||
&& pip3 install -q --upgrade --no-cache-dir pip && pip3 install -q --no-cache-dir conan==1.62 gcovr cmake==3.31.6 pre-commit \
|
python${PYTHON_VERSION}-venv \
|
||||||
&& apt-get clean && apt remove -y software-properties-common
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION}
|
||||||
|
|
||||||
# Install gcc-12 and make ldconfig aware of the new libstdc++ location (for gcc)
|
# Create a virtual environment for python tools
|
||||||
|
RUN python${PYTHON_VERSION} -m venv /opt/venv
|
||||||
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
|
|
||||||
|
RUN pip install -q --no-cache-dir \
|
||||||
|
cmake \
|
||||||
|
conan==2.20.1 \
|
||||||
|
gcovr \
|
||||||
|
pre-commit
|
||||||
|
|
||||||
|
# Install LLVM tools
|
||||||
|
ARG LLVM_TOOLS_VERSION=20
|
||||||
|
|
||||||
|
RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-${LLVM_TOOLS_VERSION} main" >> /etc/apt/sources.list \
|
||||||
|
&& wget --progress=dot:giga -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
clang-tidy-${LLVM_TOOLS_VERSION} \
|
||||||
|
clang-tools-${LLVM_TOOLS_VERSION} \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG GCC_MAJOR_VERSION=invalid
|
||||||
|
|
||||||
|
# Install custom-built gcc and make ldconfig aware of the new libstdc++ location (for gcc)
|
||||||
# Note: Clang is using libc++ instead
|
# Note: Clang is using libc++ instead
|
||||||
COPY --from=rippleci/clio_gcc:12.3.0 /gcc12.deb /
|
COPY --from=clio-gcc /gcc${GCC_MAJOR_VERSION}.deb /
|
||||||
RUN apt update && apt-get install -y binutils libc6-dev \
|
RUN apt-get update \
|
||||||
&& dpkg -i /gcc12.deb \
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
&& rm -rf /gcc12.deb \
|
binutils \
|
||||||
|
libc6-dev \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& dpkg -i /gcc${GCC_MAJOR_VERSION}.deb \
|
||||||
|
&& rm -rf /gcc${GCC_MAJOR_VERSION}.deb \
|
||||||
&& ldconfig
|
&& ldconfig
|
||||||
|
|
||||||
# Rewire to use gcc-12 as default compiler
|
# Rewire to use our custom-built gcc as default compiler
|
||||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
|
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
|
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
|
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
|
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
|
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
|
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${GCC_MAJOR_VERSION} 100 \
|
||||||
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
|
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${GCC_MAJOR_VERSION} 100
|
||||||
|
|
||||||
WORKDIR /tmp
|
COPY --from=clio-tools \
|
||||||
|
/usr/local/bin/mold \
|
||||||
# Install ccache from source
|
/usr/local/bin/ld.mold \
|
||||||
RUN wget "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
|
/usr/local/bin/ccache \
|
||||||
&& tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
|
/usr/local/bin/doxygen \
|
||||||
&& cd "ccache-${CCACHE_VERSION}" \
|
/usr/local/bin/ClangBuildAnalyzer \
|
||||||
&& mkdir build && cd build \
|
/usr/local/bin/git-cliff \
|
||||||
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
/usr/local/bin/gh \
|
||||||
&& cmake --build . --target install \
|
/usr/local/bin/gdb \
|
||||||
&& rm -rf /tmp/* /var/tmp/*
|
/usr/local/bin/
|
||||||
|
|
||||||
# Install doxygen from source
|
|
||||||
RUN wget "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
|
||||||
&& tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
|
||||||
&& cd "doxygen-${DOXYGEN_VERSION}" \
|
|
||||||
&& mkdir build && cd build \
|
|
||||||
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
|
||||||
&& cmake --build . --target install \
|
|
||||||
&& rm -rf /tmp/* /var/tmp/*
|
|
||||||
|
|
||||||
# Install ClangBuildAnalyzer
|
|
||||||
RUN wget "https://github.com/aras-p/ClangBuildAnalyzer/releases/download/v${CLANG_BUILD_ANALYZER_VERSION}/ClangBuildAnalyzer-linux" \
|
|
||||||
&& chmod +x ClangBuildAnalyzer-linux \
|
|
||||||
&& mv ClangBuildAnalyzer-linux /usr/bin/ClangBuildAnalyzer \
|
|
||||||
&& rm -rf /tmp/* /var/tmp/*
|
|
||||||
|
|
||||||
# Install git-cliff
|
|
||||||
RUN wget "https://github.com/orhun/git-cliff/releases/download/v${GIT_CLIFF_VERSION}/git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
|
|
||||||
&& tar xf git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz \
|
|
||||||
&& mv git-cliff-${GIT_CLIFF_VERSION}/git-cliff /usr/bin/git-cliff \
|
|
||||||
&& rm -rf /tmp/* /var/tmp/*
|
|
||||||
|
|
||||||
# Install gh
|
|
||||||
RUN wget "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz" \
|
|
||||||
&& tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
|
|
||||||
&& mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/bin/gh \
|
|
||||||
&& rm -rf /tmp/* /var/tmp/*
|
|
||||||
|
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
|
|
||||||
# Setup conan
|
# Setup conan
|
||||||
RUN conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
RUN conan remote add --index 0 xrplf https://conan.ripplex.io
|
||||||
|
|
||||||
# Note: intentionally leaving cppstd=20
|
WORKDIR /root/.conan2
|
||||||
RUN conan profile new gcc --detect \
|
COPY conan/global.conf ./global.conf
|
||||||
&& conan profile update settings.compiler=gcc gcc \
|
|
||||||
&& conan profile update settings.compiler.version=12 gcc \
|
|
||||||
&& conan profile update settings.compiler.cppstd=20 gcc \
|
|
||||||
&& conan profile update settings.compiler.libcxx=libstdc++11 gcc \
|
|
||||||
&& conan profile update env.CC=/usr/bin/gcc-12 gcc \
|
|
||||||
&& conan profile update env.CXX=/usr/bin/g++-12 gcc \
|
|
||||||
&& conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/gcc-12\", \"cpp\": \"/usr/bin/g++-12\"}" gcc
|
|
||||||
|
|
||||||
RUN conan profile new clang --detect \
|
WORKDIR /root/.conan2/profiles
|
||||||
&& conan profile update settings.compiler=clang clang \
|
|
||||||
&& conan profile update settings.compiler.version=16 clang \
|
|
||||||
&& conan profile update settings.compiler.cppstd=20 clang \
|
|
||||||
&& conan profile update settings.compiler.libcxx=libc++ clang \
|
|
||||||
&& conan profile update env.CC=/usr/bin/clang-16 clang \
|
|
||||||
&& conan profile update env.CXX=/usr/bin/clang++-16 clang \
|
|
||||||
&& conan profile update env.CXXFLAGS="-DBOOST_ASIO_DISABLE_CONCEPTS" clang \
|
|
||||||
&& conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/clang-16\", \"cpp\": \"/usr/bin/clang++-16\"}" clang
|
|
||||||
|
|
||||||
RUN echo "include(gcc)" >> .conan/profiles/default
|
COPY conan/clang.profile ./clang
|
||||||
|
COPY conan/sanitizer_template.profile ./clang.asan
|
||||||
|
COPY conan/sanitizer_template.profile ./clang.tsan
|
||||||
|
COPY conan/sanitizer_template.profile ./clang.ubsan
|
||||||
|
|
||||||
COPY conan/gcc.asan /root/.conan/profiles
|
COPY conan/gcc.profile ./gcc
|
||||||
COPY conan/gcc.tsan /root/.conan/profiles
|
COPY conan/sanitizer_template.profile ./gcc.asan
|
||||||
COPY conan/gcc.ubsan /root/.conan/profiles
|
COPY conan/sanitizer_template.profile ./gcc.tsan
|
||||||
COPY conan/clang.asan /root/.conan/profiles
|
COPY conan/sanitizer_template.profile ./gcc.ubsan
|
||||||
COPY conan/clang.tsan /root/.conan/profiles
|
|
||||||
COPY conan/clang.ubsan /root/.conan/profiles
|
WORKDIR /root
|
||||||
|
|||||||
@@ -5,13 +5,20 @@ It is used in [Clio Github Actions](https://github.com/XRPLF/clio/actions) but c
|
|||||||
|
|
||||||
The image is based on Ubuntu 20.04 and contains:
|
The image is based on Ubuntu 20.04 and contains:
|
||||||
|
|
||||||
- clang 16.0.6
|
- ccache 4.11.3
|
||||||
- gcc 12.3
|
- Clang 19
|
||||||
- doxygen 1.12
|
- ClangBuildAnalyzer 1.6.0
|
||||||
- gh 2.40
|
- Conan 2.20.1
|
||||||
- ccache 4.10.2
|
- Doxygen 1.12
|
||||||
- conan 1.62
|
- GCC 15.2.0
|
||||||
|
- GDB 16.3
|
||||||
|
- gh 2.74
|
||||||
|
- git-cliff 2.9.1
|
||||||
|
- mold 2.40.1
|
||||||
|
- Python 3.13
|
||||||
- and some other useful tools
|
- and some other useful tools
|
||||||
|
|
||||||
Conan is set up to build Clio without any additional steps. There are two preset conan profiles: `clang` and `gcc` to use corresponding compiler. By default conan is setup to use `gcc`.
|
Conan is set up to build Clio without any additional steps.
|
||||||
Sanitizer builds for `ASAN`, `TSAN` and `UBSAN` are enabled via conan profiles for each of the supported compilers. These can be selected using the following pattern (all lowercase): `[compiler].[sanitizer]` (e.g. `--profile gcc.tsan`).
|
There are two preset conan profiles: `clang` and `gcc` to use corresponding compiler.
|
||||||
|
`ASan`, `TSan` and `UBSan` sanitizer builds are enabled via conan profiles for each of the supported compilers.
|
||||||
|
These can be selected using the following pattern (all lowercase): `[compiler].[sanitizer]` (e.g. `--profile:all gcc.tsan`).
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
include(clang)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=address\" linkflags=\"-fsanitize=address\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=address"
|
|
||||||
CXXFLAGS="-fsanitize=address"
|
|
||||||
LDFLAGS="-fsanitize=address"
|
|
||||||
12
docker/ci/conan/clang.profile
Normal file
12
docker/ci/conan/clang.profile
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[settings]
|
||||||
|
arch={{detect_api.detect_arch()}}
|
||||||
|
build_type=Release
|
||||||
|
compiler=clang
|
||||||
|
compiler.cppstd=20
|
||||||
|
compiler.libcxx=libc++
|
||||||
|
compiler.version=19
|
||||||
|
os=Linux
|
||||||
|
|
||||||
|
[conf]
|
||||||
|
tools.build:compiler_executables={"c": "/usr/bin/clang-19", "cpp": "/usr/bin/clang++-19"}
|
||||||
|
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
include(clang)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=thread\" linkflags=\"-fsanitize=thread\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=thread"
|
|
||||||
CXXFLAGS="-fsanitize=thread"
|
|
||||||
LDFLAGS="-fsanitize=thread"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
include(clang)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=undefined\" linkflags=\"-fsanitize=undefined\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=undefined"
|
|
||||||
CXXFLAGS="-fsanitize=undefined"
|
|
||||||
LDFLAGS="-fsanitize=undefined"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
include(gcc)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=address\" linkflags=\"-fsanitize=address\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=address"
|
|
||||||
CXXFLAGS="-fsanitize=address"
|
|
||||||
LDFLAGS="-fsanitize=address"
|
|
||||||
11
docker/ci/conan/gcc.profile
Normal file
11
docker/ci/conan/gcc.profile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[settings]
|
||||||
|
arch={{detect_api.detect_arch()}}
|
||||||
|
build_type=Release
|
||||||
|
compiler=gcc
|
||||||
|
compiler.cppstd=20
|
||||||
|
compiler.libcxx=libstdc++11
|
||||||
|
compiler.version=15
|
||||||
|
os=Linux
|
||||||
|
|
||||||
|
[conf]
|
||||||
|
tools.build:compiler_executables={"c": "/usr/bin/gcc-15", "cpp": "/usr/bin/g++-15"}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
include(gcc)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=thread\" linkflags=\"-fsanitize=thread\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=thread"
|
|
||||||
CXXFLAGS="-fsanitize=thread"
|
|
||||||
LDFLAGS="-fsanitize=thread"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
include(gcc)
|
|
||||||
|
|
||||||
[options]
|
|
||||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=undefined\" linkflags=\"-fsanitize=undefined\""
|
|
||||||
boost:without_stacktrace=True
|
|
||||||
[env]
|
|
||||||
CFLAGS="-fsanitize=undefined"
|
|
||||||
CXXFLAGS="-fsanitize=undefined"
|
|
||||||
LDFLAGS="-fsanitize=undefined"
|
|
||||||
2
docker/ci/conan/global.conf
Normal file
2
docker/ci/conan/global.conf
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
core.download:parallel={{os.cpu_count()}}
|
||||||
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
23
docker/ci/conan/sanitizer_template.profile
Normal file
23
docker/ci/conan/sanitizer_template.profile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{% set compiler, sani = profile_name.split('.') %}
|
||||||
|
|
||||||
|
{% set sanitizer_opt_map = {"asan": "address", "tsan": "thread", "ubsan": "undefined"} %}
|
||||||
|
{% set sanitizer = sanitizer_opt_map[sani] %}
|
||||||
|
|
||||||
|
{% set sanitizer_build_flags_str = "-fsanitize=" ~ sanitizer ~ " -g -O1 -fno-omit-frame-pointer" %}
|
||||||
|
{% set sanitizer_build_flags = sanitizer_build_flags_str.split(' ') %}
|
||||||
|
{% set sanitizer_link_flags_str = "-fsanitize=" ~ sanitizer %}
|
||||||
|
{% set sanitizer_link_flags = sanitizer_link_flags_str.split(' ') %}
|
||||||
|
|
||||||
|
include({{ compiler }})
|
||||||
|
|
||||||
|
[options]
|
||||||
|
boost/*:extra_b2_flags="cxxflags=\"{{ sanitizer_build_flags_str }}\" linkflags=\"{{ sanitizer_link_flags_str }}\""
|
||||||
|
boost/*:without_stacktrace=True
|
||||||
|
|
||||||
|
[conf]
|
||||||
|
tools.build:cflags+={{ sanitizer_build_flags }}
|
||||||
|
tools.build:cxxflags+={{ sanitizer_build_flags }}
|
||||||
|
tools.build:exelinkflags+={{ sanitizer_link_flags }}
|
||||||
|
tools.build:sharedlinkflags+={{ sanitizer_link_flags }}
|
||||||
|
|
||||||
|
tools.info.package_id:confs+=["tools.build:cflags", "tools.build:cxxflags", "tools.build:exelinkflags", "tools.build:sharedlinkflags"]
|
||||||
@@ -1,15 +1,20 @@
|
|||||||
FROM ubuntu:22.04
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
libatomic1 \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN groupadd -g 10001 clio \
|
||||||
|
&& useradd -u 10000 -g 10001 -s /bin/bash clio
|
||||||
|
|
||||||
COPY ./clio_server /opt/clio/bin/clio_server
|
COPY ./clio_server /opt/clio/bin/clio_server
|
||||||
|
|
||||||
RUN ln -s /opt/clio/bin/clio_server /usr/local/bin/clio_server && \
|
RUN ln -s /opt/clio/bin/clio_server /usr/local/bin/clio_server \
|
||||||
mkdir -p /opt/clio/etc/ && \
|
&& mkdir -p /opt/clio/etc/ \
|
||||||
mkdir -p /opt/clio/log/ && \
|
&& mkdir -p /opt/clio/log/ \
|
||||||
groupadd -g 10001 clio && \
|
&& chown clio:clio /opt/clio/log
|
||||||
useradd -u 10000 -g 10001 -s /bin/bash clio && \
|
|
||||||
chown clio:clio /opt/clio/log && \
|
|
||||||
apt update && \
|
|
||||||
apt install -y libatomic1
|
|
||||||
|
|
||||||
USER clio
|
USER clio
|
||||||
ENTRYPOINT ["/opt/clio/bin/clio_server"]
|
ENTRYPOINT ["/opt/clio/bin/clio_server"]
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ Clio repository provides an [example](https://github.com/XRPLF/clio/blob/develop
|
|||||||
|
|
||||||
Config file recommendations:
|
Config file recommendations:
|
||||||
|
|
||||||
- Set `log_to_console` to `false` if you want to avoid logs being written to `stdout`.
|
- Set `log.enable_console` to `false` if you want to avoid logs being written to `stdout`.
|
||||||
- Set `log_directory` to `/opt/clio/log` to store logs in a volume.
|
- Set `log.directory` to `/opt/clio/log` to store logs in a volume.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
FROM ubuntu:focal
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
ARG TARGETARCH
|
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-c"]
|
|
||||||
|
|
||||||
# hadolint ignore=DL3002
|
|
||||||
USER root
|
|
||||||
WORKDIR /root
|
|
||||||
|
|
||||||
ENV CLANG_VERSION=16
|
|
||||||
|
|
||||||
RUN apt update -qq \
|
|
||||||
&& apt install -qq -y --no-install-recommends --no-install-suggests \
|
|
||||||
wget software-properties-common gnupg
|
|
||||||
|
|
||||||
RUN wget https://apt.llvm.org/llvm.sh \
|
|
||||||
&& chmod +x llvm.sh \
|
|
||||||
&& ./llvm.sh ${CLANG_VERSION} \
|
|
||||||
&& rm -rf llvm.sh \
|
|
||||||
&& apt-get install -y libc++-16-dev libc++abi-16-dev
|
|
||||||
32
docker/compilers/clang/Dockerfile
Normal file
32
docker/compilers/clang/Dockerfile
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
|
||||||
|
# hadolint ignore=DL3002
|
||||||
|
USER root
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
wget \
|
||||||
|
software-properties-common \
|
||||||
|
gnupg \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG CLANG_MAJOR_VERSION=invalid
|
||||||
|
# Bump this version to force rebuild of the image
|
||||||
|
ARG BUILD_VERSION=1
|
||||||
|
|
||||||
|
RUN wget --progress=dot:giga https://apt.llvm.org/llvm.sh \
|
||||||
|
&& chmod +x llvm.sh \
|
||||||
|
&& ./llvm.sh ${CLANG_MAJOR_VERSION} \
|
||||||
|
&& rm -rf llvm.sh \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
libc++-${CLANG_MAJOR_VERSION}-dev \
|
||||||
|
libc++abi-${CLANG_MAJOR_VERSION}-dev \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
3
docker/compilers/clang/README.md
Normal file
3
docker/compilers/clang/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Clang compiler
|
||||||
|
|
||||||
|
This image contains clang compiler to build <https://github.com/XRPLF/clio>.
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
FROM ubuntu:focal as build
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
ARG TARGETARCH
|
|
||||||
ARG UBUNTU_VERSION=20.04
|
|
||||||
ARG GCC_VERSION=12.3.0
|
|
||||||
ARG BUILD_VERSION=1
|
|
||||||
|
|
||||||
RUN apt update && apt install -y wget build-essential file flex libz-dev libzstd-dev
|
|
||||||
RUN wget https://gcc.gnu.org/pub/gcc/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz \
|
|
||||||
&& tar xf gcc-$GCC_VERSION.tar.gz \
|
|
||||||
&& cd /gcc-$GCC_VERSION && ./contrib/download_prerequisites
|
|
||||||
|
|
||||||
RUN mkdir /${TARGETARCH}-gcc-12
|
|
||||||
WORKDIR /${TARGETARCH}-gcc-12
|
|
||||||
RUN /gcc-$GCC_VERSION/configure \
|
|
||||||
--with-pkgversion="clio-build-$BUILD_VERSION https://github.com/XRPLF/clio" \
|
|
||||||
--enable-languages=c,c++ \
|
|
||||||
--prefix=/usr \
|
|
||||||
--with-gcc-major-version-only \
|
|
||||||
--program-suffix=-12 \
|
|
||||||
--enable-shared \
|
|
||||||
--enable-linker-build-id \
|
|
||||||
--libexecdir=/usr/lib \
|
|
||||||
--without-included-gettext \
|
|
||||||
--enable-threads=posix \
|
|
||||||
--libdir=/usr/lib \
|
|
||||||
--disable-nls \
|
|
||||||
--enable-clocale=gnu \
|
|
||||||
--enable-libstdcxx-backtrace=yes \
|
|
||||||
--enable-libstdcxx-debug \
|
|
||||||
--enable-libstdcxx-time=yes \
|
|
||||||
--with-default-libstdcxx-abi=new \
|
|
||||||
--enable-gnu-unique-object \
|
|
||||||
--disable-vtable-verify \
|
|
||||||
--enable-plugin \
|
|
||||||
--enable-default-pie \
|
|
||||||
--with-system-zlib \
|
|
||||||
--enable-libphobos-checking=release \
|
|
||||||
--with-target-system-zlib=auto \
|
|
||||||
--disable-werror \
|
|
||||||
--enable-cet \
|
|
||||||
--disable-multilib \
|
|
||||||
--without-cuda-driver \
|
|
||||||
--enable-checking=release \
|
|
||||||
&& make -j "$(nproc)" \
|
|
||||||
&& make install-strip DESTDIR=/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION \
|
|
||||||
&& mkdir -p /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64 \
|
|
||||||
&& mv /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/lib64/libstdc++.so.6.0.30-gdb.py /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.30-gdb.py
|
|
||||||
|
|
||||||
# Generate deb
|
|
||||||
WORKDIR /
|
|
||||||
COPY control.m4 /
|
|
||||||
COPY ld.so.conf /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/etc/ld.so.conf.d/1-gcc-12.conf
|
|
||||||
|
|
||||||
RUN mkdir /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN \
|
|
||||||
&& m4 -P -DUBUNTU_VERSION=$UBUNTU_VERSION -DVERSION=$GCC_VERSION-$BUILD_VERSION -DTARGETARCH=$TARGETARCH control.m4 > /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN/control \
|
|
||||||
&& dpkg-deb --build --root-owner-group /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION /gcc12.deb
|
|
||||||
|
|
||||||
# Create final image
|
|
||||||
FROM ubuntu:focal as gcc
|
|
||||||
COPY --from=build /gcc12.deb /
|
|
||||||
|
|
||||||
# Make gcc-12 available but also leave gcc12.deb for others to copy if needed
|
|
||||||
RUN apt update && apt-get install -y binutils libc6-dev \
|
|
||||||
&& dpkg -i /gcc12.deb
|
|
||||||
|
|
||||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
|
|
||||||
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
Package: gcc-12-ubuntu-UBUNTUVERSION
|
|
||||||
Version: VERSION
|
|
||||||
Architecture: TARGETARCH
|
|
||||||
Maintainer: Alex Kremer <akremer@ripple.com>
|
|
||||||
Description: Gcc VERSION build for ubuntu UBUNTUVERSION
|
|
||||||
Depends: binutils, libc6-dev
|
|
||||||
119
docker/compilers/gcc/Dockerfile
Normal file
119
docker/compilers/gcc/Dockerfile
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
ARG UBUNTU_VERSION=20.04
|
||||||
|
|
||||||
|
ARG GCC_MAJOR_VERSION=invalid
|
||||||
|
|
||||||
|
FROM ubuntu:$UBUNTU_VERSION AS build
|
||||||
|
|
||||||
|
ARG UBUNTU_VERSION
|
||||||
|
|
||||||
|
ARG GCC_MAJOR_VERSION
|
||||||
|
|
||||||
|
ARG BUILD_VERSION=1
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
build-essential \
|
||||||
|
file \
|
||||||
|
flex \
|
||||||
|
libz-dev \
|
||||||
|
libzstd-dev \
|
||||||
|
software-properties-common \
|
||||||
|
wget \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG GCC_VERSION
|
||||||
|
|
||||||
|
WORKDIR /
|
||||||
|
RUN wget --progress=dot:giga https://gcc.gnu.org/pub/gcc/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz \
|
||||||
|
&& tar xf gcc-$GCC_VERSION.tar.gz
|
||||||
|
|
||||||
|
WORKDIR /gcc-$GCC_VERSION
|
||||||
|
RUN ./contrib/download_prerequisites
|
||||||
|
|
||||||
|
RUN mkdir /gcc-build
|
||||||
|
WORKDIR /gcc-build
|
||||||
|
RUN /gcc-$GCC_VERSION/configure \
|
||||||
|
--with-pkgversion="clio-build-$BUILD_VERSION https://github.com/XRPLF/clio" \
|
||||||
|
--enable-languages=c,c++ \
|
||||||
|
--prefix=/usr \
|
||||||
|
--with-gcc-major-version-only \
|
||||||
|
--program-suffix=-${GCC_MAJOR_VERSION} \
|
||||||
|
--enable-shared \
|
||||||
|
--enable-linker-build-id \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--without-included-gettext \
|
||||||
|
--enable-threads=posix \
|
||||||
|
--libdir=/usr/lib \
|
||||||
|
--disable-nls \
|
||||||
|
--enable-clocale=gnu \
|
||||||
|
--enable-libstdcxx-backtrace=yes \
|
||||||
|
--enable-libstdcxx-debug \
|
||||||
|
--enable-libstdcxx-time=yes \
|
||||||
|
--with-default-libstdcxx-abi=new \
|
||||||
|
--enable-gnu-unique-object \
|
||||||
|
--disable-vtable-verify \
|
||||||
|
--enable-plugin \
|
||||||
|
--enable-default-pie \
|
||||||
|
--with-system-zlib \
|
||||||
|
--enable-libphobos-checking=release \
|
||||||
|
--with-target-system-zlib=auto \
|
||||||
|
--disable-werror \
|
||||||
|
--enable-cet \
|
||||||
|
--disable-multilib \
|
||||||
|
--without-cuda-driver \
|
||||||
|
--enable-checking=release
|
||||||
|
|
||||||
|
RUN make -j "$(nproc)"
|
||||||
|
RUN make install-strip DESTDIR=/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION
|
||||||
|
|
||||||
|
RUN export GDB_AUTOLOAD_DIR="/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64" \
|
||||||
|
&& mkdir -p "$GDB_AUTOLOAD_DIR" \
|
||||||
|
&& mv \
|
||||||
|
/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/lib64/libstdc++.so.*-gdb.py \
|
||||||
|
$GDB_AUTOLOAD_DIR/
|
||||||
|
|
||||||
|
# Generate deb
|
||||||
|
WORKDIR /
|
||||||
|
COPY control.m4 /
|
||||||
|
COPY ld.so.conf /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/etc/ld.so.conf.d/1-gcc-${GCC_MAJOR_VERSION}.conf
|
||||||
|
|
||||||
|
RUN mkdir /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN \
|
||||||
|
&& m4 \
|
||||||
|
-P \
|
||||||
|
-DUBUNTU_VERSION=$UBUNTU_VERSION \
|
||||||
|
-DVERSION=$GCC_VERSION-$BUILD_VERSION \
|
||||||
|
-DTARGETARCH=$TARGETARCH \
|
||||||
|
control.m4 > /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN/control \
|
||||||
|
&& dpkg-deb \
|
||||||
|
--build \
|
||||||
|
--root-owner-group \
|
||||||
|
/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION \
|
||||||
|
/gcc${GCC_MAJOR_VERSION}.deb
|
||||||
|
|
||||||
|
# Create final image
|
||||||
|
FROM ubuntu:$UBUNTU_VERSION
|
||||||
|
|
||||||
|
ARG GCC_MAJOR_VERSION
|
||||||
|
|
||||||
|
COPY --from=build /gcc${GCC_MAJOR_VERSION}.deb /
|
||||||
|
|
||||||
|
# Install gcc-${GCC_MAJOR_VERSION}, but also leave gcc${GCC_MAJOR_VERSION}.deb for others to copy if needed
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
binutils \
|
||||||
|
libc6-dev \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& dpkg -i /gcc${GCC_MAJOR_VERSION}.deb
|
||||||
|
|
||||||
|
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${GCC_MAJOR_VERSION} 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${GCC_MAJOR_VERSION} 100
|
||||||
3
docker/compilers/gcc/README.md
Normal file
3
docker/compilers/gcc/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# GCC compiler
|
||||||
|
|
||||||
|
This image contains GCC compiler to build <https://github.com/XRPLF/clio>.
|
||||||
7
docker/compilers/gcc/control.m4
Normal file
7
docker/compilers/gcc/control.m4
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Package: gcc-15-ubuntu-UBUNTUVERSION
|
||||||
|
Version: VERSION
|
||||||
|
Architecture: TARGETARCH
|
||||||
|
Maintainer: Alex Kremer <akremer@ripple.com>
|
||||||
|
Uploaders: Ayaz Salikhov <asalikhov@ripple.com>
|
||||||
|
Description: GCC VERSION build for ubuntu UBUNTUVERSION
|
||||||
|
Depends: binutils, libc6-dev
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
services:
|
services:
|
||||||
clio_develop:
|
clio_develop:
|
||||||
image: ghcr.io/xrplf/clio-ci:latest
|
image: ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
volumes:
|
volumes:
|
||||||
- clio_develop_conan_data:/root/.conan/data
|
- clio_develop_conan_data:/root/.conan2/p
|
||||||
- clio_develop_ccache:/root/.ccache
|
- clio_develop_ccache:/root/.ccache
|
||||||
- ../../:/root/clio
|
- ../../:/root/clio
|
||||||
- clio_develop_build:/root/clio/build_docker
|
- clio_develop_build:/root/clio/build_docker
|
||||||
|
|||||||
104
docker/tools/Dockerfile
Normal file
104
docker/tools/Dockerfile
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
ARG GHCR_REPO=invalid
|
||||||
|
ARG GCC_VERSION=invalid
|
||||||
|
|
||||||
|
FROM ${GHCR_REPO}/clio-gcc:${GCC_VERSION}
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
|
ARG BUILD_VERSION=2
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
ninja-build \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
software-properties-common \
|
||||||
|
wget \
|
||||||
|
&& pip3 install -q --no-cache-dir \
|
||||||
|
cmake \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /tmp
|
||||||
|
|
||||||
|
ARG MOLD_VERSION=2.40.1
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/rui314/mold/archive/refs/tags/v${MOLD_VERSION}.tar.gz" \
|
||||||
|
&& tar xf "v${MOLD_VERSION}.tar.gz" \
|
||||||
|
&& cd "mold-${MOLD_VERSION}" \
|
||||||
|
&& mkdir build \
|
||||||
|
&& cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& ninja install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
ARG CCACHE_VERSION=4.11.3
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
|
||||||
|
&& tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
|
||||||
|
&& cd "ccache-${CCACHE_VERSION}" \
|
||||||
|
&& mkdir build \
|
||||||
|
&& cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTING=False .. \
|
||||||
|
&& ninja install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
bison \
|
||||||
|
flex \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG DOXYGEN_VERSION=1.12.0
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
||||||
|
&& tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
||||||
|
&& cd "doxygen-${DOXYGEN_VERSION}" \
|
||||||
|
&& mkdir build \
|
||||||
|
&& cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& ninja install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
ARG CLANG_BUILD_ANALYZER_VERSION=1.6.0
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/aras-p/ClangBuildAnalyzer/archive/refs/tags/v${CLANG_BUILD_ANALYZER_VERSION}.tar.gz" \
|
||||||
|
&& tar xf "v${CLANG_BUILD_ANALYZER_VERSION}.tar.gz" \
|
||||||
|
&& cd "ClangBuildAnalyzer-${CLANG_BUILD_ANALYZER_VERSION}" \
|
||||||
|
&& mkdir build \
|
||||||
|
&& cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& ninja install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
ARG GIT_CLIFF_VERSION=2.9.1
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/orhun/git-cliff/releases/download/v${GIT_CLIFF_VERSION}/git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
|
||||||
|
&& tar xf git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz \
|
||||||
|
&& mv git-cliff-${GIT_CLIFF_VERSION}/git-cliff /usr/local/bin/git-cliff \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
ARG GH_VERSION=2.74.0
|
||||||
|
RUN wget --progress=dot:giga "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz" \
|
||||||
|
&& tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
|
||||||
|
&& mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/local/bin/gh \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
|
libgmp-dev \
|
||||||
|
libmpfr-dev \
|
||||||
|
libncurses-dev \
|
||||||
|
make \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG GDB_VERSION=16.3
|
||||||
|
RUN wget --progress=dot:giga "https://sourceware.org/pub/gdb/releases/gdb-${GDB_VERSION}.tar.gz" \
|
||||||
|
&& tar xf "gdb-${GDB_VERSION}.tar.gz" \
|
||||||
|
&& cd "gdb-${GDB_VERSION}" \
|
||||||
|
&& ./configure --prefix=/usr/local \
|
||||||
|
&& make -j "$(nproc)" \
|
||||||
|
&& make install-gdb \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
WORKDIR /root
|
||||||
@@ -22,6 +22,7 @@ WARNINGS = ${LINT}
|
|||||||
WARN_NO_PARAMDOC = ${LINT}
|
WARN_NO_PARAMDOC = ${LINT}
|
||||||
WARN_IF_INCOMPLETE_DOC = ${LINT}
|
WARN_IF_INCOMPLETE_DOC = ${LINT}
|
||||||
WARN_IF_UNDOCUMENTED = ${LINT}
|
WARN_IF_UNDOCUMENTED = ${LINT}
|
||||||
|
WARN_AS_ERROR = ${WARN_AS_ERROR}
|
||||||
|
|
||||||
GENERATE_LATEX = NO
|
GENERATE_LATEX = NO
|
||||||
GENERATE_HTML = YES
|
GENERATE_HTML = YES
|
||||||
|
|||||||
@@ -6,54 +6,83 @@
|
|||||||
## Minimum Requirements
|
## Minimum Requirements
|
||||||
|
|
||||||
- [Python 3.7](https://www.python.org/downloads/)
|
- [Python 3.7](https://www.python.org/downloads/)
|
||||||
- [Conan 1.55, <2.0](https://conan.io/downloads.html)
|
- [Conan 2.20.1](https://conan.io/downloads.html)
|
||||||
- [CMake 3.20, <4.0](https://cmake.org/download/)
|
- [CMake 3.20](https://cmake.org/download/)
|
||||||
- [**Optional**] [GCovr](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html): needed for code coverage generation
|
- [**Optional**] [GCovr](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html): needed for code coverage generation
|
||||||
- [**Optional**] [CCache](https://ccache.dev/): speeds up compilation if you are going to compile Clio often
|
- [**Optional**] [CCache](https://ccache.dev/): speeds up compilation if you are going to compile Clio often
|
||||||
|
|
||||||
|
We use our Docker image `ghcr.io/XRPLF/clio-ci` to build `Clio`, see [Building Clio with Docker](#building-clio-with-docker).
|
||||||
|
You can find information about exact compiler versions and tools in the [image's README](https://github.com/XRPLF/clio/blob/develop/docker/ci/README.md).
|
||||||
|
|
||||||
|
The following compiler version are guaranteed to work.
|
||||||
|
Any compiler with lower version may not be able to build Clio:
|
||||||
|
|
||||||
| Compiler | Version |
|
| Compiler | Version |
|
||||||
| ----------- | ------- |
|
| ----------- | ------- |
|
||||||
| GCC | 12.3 |
|
| GCC | 15.2 |
|
||||||
| Clang | 16 |
|
| Clang | 19 |
|
||||||
| Apple Clang | 15 |
|
| Apple Clang | 17 |
|
||||||
|
|
||||||
### Conan Configuration
|
### Conan Configuration
|
||||||
|
|
||||||
Clio requires `compiler.cppstd=20` in your Conan profile (`~/.conan/profiles/default`).
|
By default, Conan uses `~/.conan2` as it's home folder.
|
||||||
|
You can change it by using `$CONAN_HOME` env variable.
|
||||||
|
[More info about Conan home](https://docs.conan.io/2/reference/environment.html#conan-home).
|
||||||
|
|
||||||
> [!NOTE]
|
> [!TIP]
|
||||||
> Although Clio is built using C++23, it's required to set `compiler.cppstd=20` for the time being as some of Clio's dependencies are not yet capable of building under C++23.
|
> To setup Conan automatically, you can run `.github/scripts/conan/init.sh`.
|
||||||
|
> This will delete Conan home directory (if it exists), set up profiles and add Artifactory remote.
|
||||||
|
|
||||||
**Mac example**:
|
The instruction below assumes that `$CONAN_HOME` is not set.
|
||||||
|
|
||||||
|
#### Profiles
|
||||||
|
|
||||||
|
The default profile is the file in `~/.conan2/profiles/default`.
|
||||||
|
|
||||||
|
Here are some examples of possible profiles:
|
||||||
|
|
||||||
|
**Mac apple-clang 17 example**:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
[settings]
|
[settings]
|
||||||
os=Macos
|
arch={{detect_api.detect_arch()}}
|
||||||
os_build=Macos
|
|
||||||
arch=armv8
|
|
||||||
arch_build=armv8
|
|
||||||
compiler=apple-clang
|
|
||||||
compiler.version=15
|
|
||||||
compiler.libcxx=libc++
|
|
||||||
build_type=Release
|
build_type=Release
|
||||||
|
compiler=apple-clang
|
||||||
compiler.cppstd=20
|
compiler.cppstd=20
|
||||||
|
compiler.libcxx=libc++
|
||||||
|
compiler.version=17
|
||||||
|
os=Macos
|
||||||
|
|
||||||
[conf]
|
[conf]
|
||||||
tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]
|
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
|
||||||
```
|
```
|
||||||
|
|
||||||
**Linux example**:
|
**Linux gcc-12 example**:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
[settings]
|
[settings]
|
||||||
os=Linux
|
arch={{detect_api.detect_arch()}}
|
||||||
os_build=Linux
|
|
||||||
arch=x86_64
|
|
||||||
arch_build=x86_64
|
|
||||||
compiler=gcc
|
|
||||||
compiler.version=12
|
|
||||||
compiler.libcxx=libstdc++11
|
|
||||||
build_type=Release
|
build_type=Release
|
||||||
|
compiler=gcc
|
||||||
compiler.cppstd=20
|
compiler.cppstd=20
|
||||||
|
compiler.libcxx=libstdc++11
|
||||||
|
compiler.version=12
|
||||||
|
os=Linux
|
||||||
|
|
||||||
|
[conf]
|
||||||
|
tools.build:compiler_executables={"c": "/usr/bin/gcc-12", "cpp": "/usr/bin/g++-12"}
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Although Clio is built using C++23, it's required to set `compiler.cppstd=20` in your profile for the time being as some of Clio's dependencies are not yet capable of building under C++23.
|
||||||
|
|
||||||
|
#### global.conf file
|
||||||
|
|
||||||
|
To increase the speed of downloading and uploading packages, add the following to the `~/.conan2/global.conf` file:
|
||||||
|
|
||||||
|
```text
|
||||||
|
core.download:parallel={{os.cpu_count()}}
|
||||||
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Artifactory
|
#### Artifactory
|
||||||
@@ -61,84 +90,114 @@ compiler.cppstd=20
|
|||||||
Make sure artifactory is setup with Conan.
|
Make sure artifactory is setup with Conan.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
conan remote add --index 0 xrplf https://conan.ripplex.io
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you should be able to download the prebuilt `xrpl` package on some platforms.
|
Now you should be able to download the prebuilt dependencies (including `xrpl` package) on supported platforms.
|
||||||
|
|
||||||
|
#### Conan lockfile
|
||||||
|
|
||||||
|
To achieve reproducible dependencies, we use [Conan lockfile](https://docs.conan.io/2/tutorial/versioning/lockfiles.html).
|
||||||
|
|
||||||
|
The `conan.lock` file in the repository contains a "snapshot" of the current dependencies.
|
||||||
|
It is implicitly used when running `conan` commands, you don't need to specify it.
|
||||||
|
|
||||||
|
You have to update this file every time you add a new dependency or change a revision or version of an existing dependency.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> You may need to edit the `~/.conan/remotes.json` file to ensure that this newly added artifactory is listed last. Otherwise, you could see compilation errors when building the project with gcc version 13 (or newer).
|
> Conan uses local cache by default when creating a lockfile.
|
||||||
|
>
|
||||||
|
> To ensure, that lockfile creation works the same way on all developer machines, you should clear the local cache before creating a new lockfile.
|
||||||
|
|
||||||
Remove old packages you may have cached.
|
To create a new lockfile, run the following commands in the repository root:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
conan remove -f xrpl
|
conan remove '*' --confirm
|
||||||
|
rm conan.lock
|
||||||
|
# This ensure that xrplf remote is the first to be consulted
|
||||||
|
conan remote add --force --index 0 xrplf https://conan.ripplex.io
|
||||||
|
conan lock create .
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> If some dependencies are exclusive for some OS, you may need to run the last command for them adding `--profile:all <PROFILE>`.
|
||||||
|
|
||||||
## Building Clio
|
## Building Clio
|
||||||
|
|
||||||
Navigate to Clio's root directory and run:
|
1. Navigate to Clio's root directory and run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True
|
```
|
||||||
# You can also add -GNinja to use Ninja build system instead of Make
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!TIP]
|
2. Install dependencies through conan.
|
||||||
> You can omit the `-o tests=True` if you don't want to build `clio_tests`.
|
|
||||||
|
|
||||||
If successful, `conan install` will find the required packages and `cmake` will do the rest. You should see `clio_server` and `clio_tests` in the `build` directory (the current directory).
|
```sh
|
||||||
|
conan install .. --output-folder . --build missing --settings build_type=Release
|
||||||
|
```
|
||||||
|
|
||||||
> [!TIP]
|
> You can add `--profile:all <PROFILE_NAME>` to choose a specific conan profile.
|
||||||
> To generate a Code Coverage report, include `-o coverage=True` in the `conan install` command above, along with `-o tests=True` to enable tests. After running the `cmake` commands, execute `make clio_tests-ccov`. The coverage report will be found at `clio_tests-llvm-cov/index.html`.
|
|
||||||
|
|
||||||
<!-- markdownlint-disable-line MD028 -->
|
3. Configure and generate build files with CMake.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
```
|
||||||
|
|
||||||
|
> You can add `-GNinja` to use the Ninja build system (instead of Make).
|
||||||
|
|
||||||
|
4. Now, you can build all targets or specific ones:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# builds all targets
|
||||||
|
cmake --build . --parallel 8
|
||||||
|
# builds only clio_server target
|
||||||
|
cmake --build . --parallel 8 --target clio_server
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see `clio_server` and `clio_tests` in the current directory.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> If you've built Clio before and the build is now failing, it's likely due to updated dependencies. Try deleting the build folder and then rerunning the Conan and CMake commands mentioned above.
|
> If you've built Clio before and the build is now failing, it's likely due to updated dependencies. Try deleting the build folder and then rerunning the Conan and CMake commands mentioned above.
|
||||||
|
|
||||||
|
### CMake options
|
||||||
|
|
||||||
|
There are several CMake options you can use to customize the build:
|
||||||
|
|
||||||
|
| CMake Option | Default | CMake Target | Description |
|
||||||
|
| --------------------- | ------- | -------------------------------------------------------- | ------------------------------------- |
|
||||||
|
| `-Dcoverage` | OFF | `clio_tests-ccov` | Enables code coverage generation |
|
||||||
|
| `-Dtests` | OFF | `clio_tests` | Enables unit tests |
|
||||||
|
| `-Dintegration_tests` | OFF | `clio_integration_tests` | Enables integration tests |
|
||||||
|
| `-Dbenchmark` | OFF | `clio_benchmark` | Enables benchmark executable |
|
||||||
|
| `-Ddocs` | OFF | `docs` | Enables API documentation generation |
|
||||||
|
| `-Dlint` | OFF | See [#clang-tidy](#using-clang-tidy-for-static-analysis) | Enables `clang-tidy` static analysis |
|
||||||
|
| `-Dsan` | N/A | N/A | Enables Sanitizer (asan, tsan, ubsan) |
|
||||||
|
| `-Dpackage` | OFF | N/A | Creates a debian package |
|
||||||
|
|
||||||
### Generating API docs for Clio
|
### Generating API docs for Clio
|
||||||
|
|
||||||
The API documentation for Clio is generated by [Doxygen](https://www.doxygen.nl/index.html). If you want to generate the API documentation when building Clio, make sure to install Doxygen 1.12.0 on your system.
|
The API documentation for Clio is generated by [Doxygen](https://www.doxygen.nl/index.html). If you want to generate the API documentation when building Clio, make sure to install Doxygen 1.12.0 on your system.
|
||||||
|
|
||||||
To generate the API docs:
|
To generate the API docs, please use CMake option `-Ddocs=ON` as described above and build the `docs` target.
|
||||||
|
|
||||||
1. First, include `-o docs=True` in the conan install command. For example:
|
To view the generated files, go to `build/docs/html`.
|
||||||
|
Open the `index.html` file in your browser to see the documentation pages.
|
||||||
|
|
||||||
```sh
|

|
||||||
mkdir build && cd build
|
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o docs=True
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Once that has completed successfully, run the `cmake` command and add the `--target docs` option:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
cmake --build . --parallel 8 --target docs
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Go to `build/docs/html` to view the generated files.
|
|
||||||
|
|
||||||
Open the `index.html` file in your browser to see the documentation pages.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Building Clio with Docker
|
## Building Clio with Docker
|
||||||
|
|
||||||
It is also possible to build Clio using [Docker](https://www.docker.com/) if you don't want to install all the dependencies on your machine.
|
It is also possible to build Clio using [Docker](https://www.docker.com/) if you don't want to install all the dependencies on your machine.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run -it ghcr.io/xrplf/clio-ci:latest
|
docker run -it ghcr.io/xrplf/clio-ci:384e79cd32f5f6c0ab9be3a1122ead41c5a7e67d
|
||||||
git clone https://github.com/XRPLF/clio
|
git clone https://github.com/XRPLF/clio
|
||||||
mkdir build && cd build
|
cd clio
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Follow the same steps in the [Building Clio](#building-clio) section. You can use `--profile:all gcc` or `--profile:all clang` with the `conan install` command to choose the desired compiler.
|
||||||
|
|
||||||
## Developing against `rippled` in standalone mode
|
## Developing against `rippled` in standalone mode
|
||||||
|
|
||||||
If you wish to develop against a `rippled` instance running in standalone mode there are a few quirks of both Clio and `rippled` that you need to keep in mind. You must:
|
If you wish to develop against a `rippled` instance running in standalone mode there are a few quirks of both Clio and `rippled` that you need to keep in mind. You must:
|
||||||
@@ -150,24 +209,24 @@ If you wish to develop against a `rippled` instance running in standalone mode t
|
|||||||
|
|
||||||
Sometimes, during development, you need to build against a custom version of `libxrpl`. (For example, you may be developing compatibility for a proposed amendment that is not yet merged to the main `rippled` codebase.) To build Clio with compatibility for a custom fork or branch of `rippled`, follow these steps:
|
Sometimes, during development, you need to build against a custom version of `libxrpl`. (For example, you may be developing compatibility for a proposed amendment that is not yet merged to the main `rippled` codebase.) To build Clio with compatibility for a custom fork or branch of `rippled`, follow these steps:
|
||||||
|
|
||||||
1. First, pull/clone the appropriate `rippled` fork and switch to the branch you want to build.
|
1. First, pull/clone the appropriate `rippled` version and switch to the branch you want to build.
|
||||||
The following example uses an in-development build with [XLS-33d Multi-Purpose Tokens](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens):
|
The following example uses a `2.5.0-rc1` tag of rippled in the main branch:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone https://github.com/shawnxie999/rippled/
|
git clone https://github.com/XRPLF/rippled/
|
||||||
cd rippled
|
cd rippled
|
||||||
git switch mpt-1.1
|
git checkout 2.5.0-rc1
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Export a custom package to your local Conan store using a user/channel:
|
2. Export a custom package to your local Conan store using a user/channel:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
conan export . my/feature
|
conan export . --user=my --channel=feature
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Patch your local Clio build to use the right package.
|
3. Patch your local Clio build to use the right package.
|
||||||
|
|
||||||
Edit `conanfile.py` (from the Clio repository root). Replace the `xrpl` requirement with the custom package version from the previous step. This must also include the current version number from your `rippled` branch. For example:
|
Edit `conanfile.py` in the Clio repository root. Replace the `xrpl` requirement with the custom package version from the previous step. This must also include the current version number from your `rippled` branch. For example:
|
||||||
|
|
||||||
```py
|
```py
|
||||||
# ... (excerpt from conanfile.py)
|
# ... (excerpt from conanfile.py)
|
||||||
@@ -178,7 +237,7 @@ Sometimes, during development, you need to build against a custom version of `li
|
|||||||
'protobuf/3.21.9',
|
'protobuf/3.21.9',
|
||||||
'grpc/1.50.1',
|
'grpc/1.50.1',
|
||||||
'openssl/1.1.1v',
|
'openssl/1.1.1v',
|
||||||
'xrpl/2.3.0-b1@my/feature', # Update this line
|
'xrpl/2.5.0-rc1@my/feature', # Use your exported version here
|
||||||
'zlib/1.3.1',
|
'zlib/1.3.1',
|
||||||
'libbacktrace/cci.20210118'
|
'libbacktrace/cci.20210118'
|
||||||
]
|
]
|
||||||
@@ -190,17 +249,16 @@ Sometimes, during development, you need to build against a custom version of `li
|
|||||||
|
|
||||||
## Using `clang-tidy` for static analysis
|
## Using `clang-tidy` for static analysis
|
||||||
|
|
||||||
The minimum [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) version required is 19.0.
|
Clang-tidy can be run by CMake when building the project.
|
||||||
|
To achieve this, you just need to provide the option `-Dlint=ON` when generating CMake files:
|
||||||
Clang-tidy can be run by CMake when building the project. To achieve this, you just need to provide the option `-o lint=True` for the `conan install` command:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o lint=True
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dlint=ON ..
|
||||||
```
|
```
|
||||||
|
|
||||||
By default CMake will try to find `clang-tidy` automatically in your system.
|
By default CMake will try to find `clang-tidy` automatically in your system.
|
||||||
To force CMake to use your desired binary, set the `CLIO_CLANG_TIDY_BIN` environment variable to the path of the `clang-tidy` binary. For example:
|
To force CMake to use your desired binary, set the `CLIO_CLANG_TIDY_BIN` environment variable to the path of the `clang-tidy` binary. For example:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export CLIO_CLANG_TIDY_BIN=/opt/homebrew/opt/llvm@19/bin/clang-tidy
|
export CLIO_CLANG_TIDY_BIN=/opt/homebrew/opt/llvm/bin/clang-tidy
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
This document provides a list of all available Clio configuration properties in detail.
|
This document provides a list of all available Clio configuration properties in detail.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Dot notation in configuration key names represents nested fields. For example, **database.scylladb** refers to the _scylladb_ field inside the _database_ object. If a key name includes "[]", it indicates that the nested field is an array (e.g., etl_sources.[]).
|
> Dot notation in configuration key names represents nested fields.
|
||||||
|
> For example, **database.scylladb** refers to the _scylladb_ field inside the _database_ object.
|
||||||
|
> If a key name includes "[]", it indicates that the nested field is an array (e.g., etl_sources.[]).
|
||||||
|
|
||||||
## Configuration Details
|
## Configuration Details
|
||||||
|
|
||||||
@@ -155,7 +157,7 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: boolean
|
- **Type**: boolean
|
||||||
- **Default value**: `True`
|
- **Default value**: `False`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: If set to `True`, allows Clio to start without any ETL source.
|
- **Description**: If set to `True`, allows Clio to start without any ETL source.
|
||||||
|
|
||||||
@@ -327,11 +329,27 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
||||||
- **Description**: Maximum queue size for sending subscription data to clients. This queue buffers data when a client is slow to receive it, ensuring delivery once the client is ready.
|
- **Description**: Maximum queue size for sending subscription data to clients. This queue buffers data when a client is slow to receive it, ensuring delivery once the client is ready.
|
||||||
|
|
||||||
|
### server.proxy.ips.[]
|
||||||
|
|
||||||
|
- **Required**: True
|
||||||
|
- **Type**: string
|
||||||
|
- **Default value**: None
|
||||||
|
- **Constraints**: None
|
||||||
|
- **Description**: List of proxy ip addresses. When Clio receives a request from proxy it will use `Forwarded` value (if any) as client ip. When this option is used together with `server.proxy.tokens` Clio will identify proxy by ip or by token.
|
||||||
|
|
||||||
|
### server.proxy.tokens.[]
|
||||||
|
|
||||||
|
- **Required**: True
|
||||||
|
- **Type**: string
|
||||||
|
- **Default value**: None
|
||||||
|
- **Constraints**: None
|
||||||
|
- **Description**: List of tokens in identifying request as a request from proxy. Token should be provided in `X-Proxy-Token` header, e.g. `X-Proxy-Token: <very_secret_token>'. When Clio receives a request from proxy it will use 'Forwarded` value (if any) to get client ip. When this option is used together with 'server.proxy.ips' Clio will identify proxy by ip or by token.
|
||||||
|
|
||||||
### prometheus.enabled
|
### prometheus.enabled
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: boolean
|
- **Type**: boolean
|
||||||
- **Default value**: `False`
|
- **Default value**: `True`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: Enables or disables Prometheus metrics.
|
- **Description**: Enables or disables Prometheus metrics.
|
||||||
|
|
||||||
@@ -339,7 +357,7 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: boolean
|
- **Type**: boolean
|
||||||
- **Default value**: `False`
|
- **Default value**: `True`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: Enables or disables compression of Prometheus responses.
|
- **Description**: Enables or disables compression of Prometheus responses.
|
||||||
|
|
||||||
@@ -415,7 +433,7 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
- **Constraints**: The value must be one of the following: `sync`, `async`, `none`.
|
- **Constraints**: The value must be one of the following: `sync`, `async`, `none`.
|
||||||
- **Description**: The strategy used for Cache loading.
|
- **Description**: The strategy used for Cache loading.
|
||||||
|
|
||||||
### log_channels.[].channel
|
### log.channels.[].channel
|
||||||
|
|
||||||
- **Required**: False
|
- **Required**: False
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
@@ -423,39 +441,63 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
- **Constraints**: The value must be one of the following: `General`, `WebServer`, `Backend`, `RPC`, `ETL`, `Subscriptions`, `Performance`, `Migration`.
|
- **Constraints**: The value must be one of the following: `General`, `WebServer`, `Backend`, `RPC`, `ETL`, `Subscriptions`, `Performance`, `Migration`.
|
||||||
- **Description**: The name of the log channel.
|
- **Description**: The name of the log channel.
|
||||||
|
|
||||||
### log_channels.[].log_level
|
### log.channels.[].level
|
||||||
|
|
||||||
- **Required**: False
|
- **Required**: False
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
- **Default value**: None
|
- **Default value**: None
|
||||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`, `count`.
|
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`.
|
||||||
- **Description**: The log level for the specific log channel.
|
- **Description**: The log level for the specific log channel.
|
||||||
|
|
||||||
### log_level
|
### log.level
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
- **Default value**: `info`
|
- **Default value**: `info`
|
||||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`, `count`.
|
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`.
|
||||||
- **Description**: The general logging level of Clio. This level is applied to all log channels that do not have an explicitly defined logging level.
|
- **Description**: The general logging level of Clio. This level is applied to all log channels that do not have an explicitly defined logging level.
|
||||||
|
|
||||||
### log_format
|
### log.format
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
- **Default value**: `%TimeStamp% (%SourceLocation%) [%ThreadID%] %Channel%:%Severity% %Message%`
|
- **Default value**: `%Y-%m-%d %H:%M:%S.%f %^%3!l:%n%$ - %v`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: The format string for log messages. The format is described here: <https://www.boost.org/doc/libs/1_83_0/libs/log/doc/html/log/tutorial/formatters.html>.
|
- **Description**: The format string for log messages using spdlog format patterns.
|
||||||
|
|
||||||
### log_to_console
|
Each of the variables expands like so:
|
||||||
|
|
||||||
|
- `%Y-%m-%d %H:%M:%S.%f`: The full date and time of the log entry with microsecond precision
|
||||||
|
- `%^`: Start color range
|
||||||
|
- `%3!l`: The severity (aka log level) the entry was sent at stripped to 3 characters
|
||||||
|
- `%n`: The logger name (channel) that this log entry was sent to
|
||||||
|
- `%$`: End color range
|
||||||
|
- `%v`: The actual log message
|
||||||
|
|
||||||
|
Some additional variables that might be useful:
|
||||||
|
|
||||||
|
- `%@`: A partial path to the C++ file and the line number in the said file (`src/file/path:linenumber`)
|
||||||
|
- `%t`: The ID of the thread the log entry is written from
|
||||||
|
|
||||||
|
Documentation can be found at: <https://github.com/gabime/spdlog/wiki/Custom-formatting>.
|
||||||
|
|
||||||
|
### log.is_async
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: boolean
|
- **Type**: boolean
|
||||||
- **Default value**: `True`
|
- **Default value**: `True`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
|
- **Description**: Whether spdlog is asynchronous or not.
|
||||||
|
|
||||||
|
### log.enable_console
|
||||||
|
|
||||||
|
- **Required**: True
|
||||||
|
- **Type**: boolean
|
||||||
|
- **Default value**: `False`
|
||||||
|
- **Constraints**: None
|
||||||
- **Description**: Enables or disables logging to the console.
|
- **Description**: Enables or disables logging to the console.
|
||||||
|
|
||||||
### log_directory
|
### log.directory
|
||||||
|
|
||||||
- **Required**: False
|
- **Required**: False
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
@@ -463,7 +505,7 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: The directory path for the log files.
|
- **Description**: The directory path for the log files.
|
||||||
|
|
||||||
### log_rotation_size
|
### log.rotation_size
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: int
|
- **Type**: int
|
||||||
@@ -471,23 +513,15 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
||||||
- **Description**: The log rotation size in megabytes. When the log file reaches this particular size, a new log file starts.
|
- **Description**: The log rotation size in megabytes. When the log file reaches this particular size, a new log file starts.
|
||||||
|
|
||||||
### log_directory_max_size
|
### log.directory_max_files
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: int
|
- **Type**: int
|
||||||
- **Default value**: `51200`
|
- **Default value**: `25`
|
||||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
||||||
- **Description**: The maximum size of the log directory in megabytes.
|
- **Description**: The maximum number of log files in the directory.
|
||||||
|
|
||||||
### log_rotation_hour_interval
|
### log.tag_style
|
||||||
|
|
||||||
- **Required**: True
|
|
||||||
- **Type**: int
|
|
||||||
- **Default value**: `12`
|
|
||||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
|
|
||||||
- **Description**: Represents the interval (in hours) for log rotation. If the current log file reaches this value in logging, a new log file starts.
|
|
||||||
|
|
||||||
### log_tag_style
|
|
||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: string
|
- **Type**: string
|
||||||
@@ -507,7 +541,7 @@ This document provides a list of all available Clio configuration properties in
|
|||||||
|
|
||||||
- **Required**: True
|
- **Required**: True
|
||||||
- **Type**: boolean
|
- **Type**: boolean
|
||||||
- **Default value**: `True`
|
- **Default value**: `False`
|
||||||
- **Constraints**: None
|
- **Constraints**: None
|
||||||
- **Description**: Indicates if the server is allowed to write data to the database.
|
- **Description**: Indicates if the server is allowed to write data to the database.
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
Clio needs access to a `rippled` server in order to work. The following configurations are required for Clio and `rippled` to communicate:
|
Clio needs access to a `rippled` server in order to work. The following configurations are required for Clio and `rippled` to communicate:
|
||||||
|
|
||||||
1. In the Clio config file, provide the following:
|
1. In the Clio config file, provide the following:
|
||||||
|
|
||||||
- The IP of the `rippled` server
|
- The IP of the `rippled` server
|
||||||
|
|
||||||
- The port on which `rippled` is accepting unencrypted WebSocket connections
|
- The port on which `rippled` is accepting unencrypted WebSocket connections
|
||||||
@@ -13,7 +12,6 @@ Clio needs access to a `rippled` server in order to work. The following configur
|
|||||||
- The port on which `rippled` is handling gRPC requests
|
- The port on which `rippled` is handling gRPC requests
|
||||||
|
|
||||||
2. In the `rippled` config file, you need to open:
|
2. In the `rippled` config file, you need to open:
|
||||||
|
|
||||||
- A port to accept unencrypted WebSocket connections
|
- A port to accept unencrypted WebSocket connections
|
||||||
|
|
||||||
- A port to handle gRPC requests, with the IP(s) of Clio specified in the `secure_gateway` entry
|
- A port to handle gRPC requests, with the IP(s) of Clio specified in the `secure_gateway` entry
|
||||||
@@ -90,13 +88,15 @@ Exactly equal password gains admin rights for the request or a websocket connect
|
|||||||
Clio can cache requests to ETL sources to reduce the load on the ETL source.
|
Clio can cache requests to ETL sources to reduce the load on the ETL source.
|
||||||
Only following commands are cached: `server_info`, `server_state`, `server_definitions`, `fee`, `ledger_closed`.
|
Only following commands are cached: `server_info`, `server_state`, `server_definitions`, `fee`, `ledger_closed`.
|
||||||
By default the forwarding cache is off.
|
By default the forwarding cache is off.
|
||||||
To enable the caching for a source, `forwarding_cache_timeout` value should be added to the configuration file, e.g.:
|
To enable the caching for a source, `forwarding.cache_timeout` value should be added to the configuration file, e.g.:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
"forwarding_cache_timeout": 0.250,
|
"forwarding": {
|
||||||
|
"cache_timeout": 0.250,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`forwarding_cache_timeout` defines for how long (in seconds) a cache entry will be valid after being placed into the cache.
|
`forwarding.cache_timeout` defines for how long (in seconds) a cache entry will be valid after being placed into the cache.
|
||||||
Zero value turns off the cache feature.
|
Zero value turns off the cache feature.
|
||||||
|
|
||||||
## Graceful shutdown (not fully implemented yet)
|
## Graceful shutdown (not fully implemented yet)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
"etl_sources": [
|
"etl_sources": [
|
||||||
{
|
{
|
||||||
"ip": "127.0.0.1",
|
"ip": "127.0.0.1",
|
||||||
"ws_port": "6005",
|
"ws_port": "6006",
|
||||||
"grpc_port": "50051"
|
"grpc_port": "50051"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -76,38 +76,60 @@
|
|||||||
"parallel_requests_limit": 10, // Optional parameter, used only if "processing_strategy" is "parallel". It limits the number of requests for one client connection processed in parallel. Infinite if not specified.
|
"parallel_requests_limit": 10, // Optional parameter, used only if "processing_strategy" is "parallel". It limits the number of requests for one client connection processed in parallel. Infinite if not specified.
|
||||||
// Max number of responses to queue up before sent successfully. If a client's waiting queue is too long, the server will close the connection.
|
// Max number of responses to queue up before sent successfully. If a client's waiting queue is too long, the server will close the connection.
|
||||||
"ws_max_sending_queue_size": 1500,
|
"ws_max_sending_queue_size": 1500,
|
||||||
"__ng_web_server": false // Use ng web server. This is a temporary setting which will be deleted after switching to ng web server
|
"__ng_web_server": false, // Use ng web server. This is a temporary setting which will be deleted after switching to ng web server
|
||||||
|
"proxy": {
|
||||||
|
"ips": [],
|
||||||
|
"tokens": []
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// Time in seconds for graceful shutdown. Defaults to 10 seconds. Not fully implemented yet.
|
// Time in seconds for graceful shutdown. Defaults to 10 seconds. Not fully implemented yet.
|
||||||
"graceful_period": 10.0,
|
"graceful_period": 10.0,
|
||||||
// Overrides log level on a per logging channel.
|
"log": {
|
||||||
// Defaults to global "log_level" for each unspecified channel.
|
// Overrides log level on a per logging channel.
|
||||||
"log_channels": [
|
// Defaults to global "log.level" for each unspecified channel.
|
||||||
{
|
"channels": [
|
||||||
"channel": "Backend",
|
{
|
||||||
"log_level": "fatal"
|
"channel": "Backend",
|
||||||
},
|
"level": "fatal"
|
||||||
{
|
},
|
||||||
"channel": "WebServer",
|
{
|
||||||
"log_level": "info"
|
"channel": "WebServer",
|
||||||
},
|
"level": "info"
|
||||||
{
|
},
|
||||||
"channel": "Subscriptions",
|
{
|
||||||
"log_level": "info"
|
"channel": "Subscriptions",
|
||||||
},
|
"level": "info"
|
||||||
{
|
},
|
||||||
"channel": "RPC",
|
{
|
||||||
"log_level": "error"
|
"channel": "RPC",
|
||||||
},
|
"level": "error"
|
||||||
{
|
},
|
||||||
"channel": "ETL",
|
{
|
||||||
"log_level": "debug"
|
"channel": "ETL",
|
||||||
},
|
"level": "debug"
|
||||||
{
|
},
|
||||||
"channel": "Performance",
|
{
|
||||||
"log_level": "trace"
|
"channel": "Performance",
|
||||||
}
|
"level": "trace"
|
||||||
],
|
}
|
||||||
|
],
|
||||||
|
// The general logging level of Clio. This level is applied to all log channels that do not have an explicitly defined logging level.
|
||||||
|
"level": "info",
|
||||||
|
// Log format using spdlog format patterns (this is the default format)
|
||||||
|
"format": "%Y-%m-%d %H:%M:%S.%f %^%3!l:%n%$ - %v",
|
||||||
|
// Whether spdlog is asynchronous or not.
|
||||||
|
"is_async": true,
|
||||||
|
// Enables or disables logging to the console.
|
||||||
|
"enable_console": true,
|
||||||
|
// Clio logs to file in the specified directory only if "log.directory" is set
|
||||||
|
// "directory": "./clio_log",
|
||||||
|
// The log rotation size in megabytes. When the log file reaches this particular size, a new log file starts.
|
||||||
|
"rotation_size": 2048,
|
||||||
|
// The maximum number of log files in the directory.
|
||||||
|
"directory_max_files": 25,
|
||||||
|
// Log tags style to use
|
||||||
|
"tag_style": "uint"
|
||||||
|
},
|
||||||
"cache": {
|
"cache": {
|
||||||
// Configure this to use either "num_diffs", "num_cursors_from_diff", or "num_cursors_from_account". By default, Clio uses "num_diffs".
|
// Configure this to use either "num_diffs", "num_cursors_from_diff", or "num_cursors_from_account". By default, Clio uses "num_diffs".
|
||||||
"num_diffs": 32, // Generate the cursors from the latest ledger diff, then use the cursors to partition the ledger to load concurrently. The cursors number is affected by the busyness of the network.
|
"num_diffs": 32, // Generate the cursors from the latest ledger diff, then use the cursors to partition the ledger to load concurrently. The cursors number is affected by the busyness of the network.
|
||||||
@@ -121,16 +143,6 @@
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"compress_reply": true
|
"compress_reply": true
|
||||||
},
|
},
|
||||||
"log_level": "info",
|
|
||||||
// Log format (this is the default format)
|
|
||||||
"log_format": "%TimeStamp% (%SourceLocation%) [%ThreadID%] %Channel%:%Severity% %Message%",
|
|
||||||
"log_to_console": true,
|
|
||||||
// Clio logs to file in the specified directory only if "log_directory" is set
|
|
||||||
// "log_directory": "./clio_log",
|
|
||||||
"log_rotation_size": 2048,
|
|
||||||
"log_directory_max_size": 51200,
|
|
||||||
"log_rotation_hour_interval": 12,
|
|
||||||
"log_tag_style": "uint",
|
|
||||||
"extractor_threads": 8,
|
"extractor_threads": 8,
|
||||||
"read_only": false,
|
"read_only": false,
|
||||||
// "start_sequence": [integer] the ledger index to start from,
|
// "start_sequence": [integer] the ledger index to start from,
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
# Logging
|
|
||||||
|
|
||||||
Clio provides several logging options, which all are configurable via the config file. These are detailed in the following sections.
|
|
||||||
|
|
||||||
## `log_level`
|
|
||||||
|
|
||||||
The minimum level of severity at which the log message will be outputted by default. Severity options are `trace`, `debug`, `info`, `warning`, `error`, `fatal`. Defaults to `info`.
|
|
||||||
|
|
||||||
## `log_format`
|
|
||||||
|
|
||||||
The format of log lines produced by Clio. Defaults to `"%TimeStamp% (%SourceLocation%) [%ThreadID%] %Channel%:%Severity% %Message%"`.
|
|
||||||
|
|
||||||
Each of the variables expands like so:
|
|
||||||
|
|
||||||
- `TimeStamp`: The full date and time of the log entry
|
|
||||||
- `SourceLocation`: A partial path to the c++ file and the line number in said file (`source/file/path:linenumber`)
|
|
||||||
- `ThreadID`: The ID of the thread the log entry is written from
|
|
||||||
- `Channel`: The channel that this log entry was sent to
|
|
||||||
- `Severity`: The severity (aka log level) the entry was sent at
|
|
||||||
- `Message`: The actual log message
|
|
||||||
|
|
||||||
## `log_channels`
|
|
||||||
|
|
||||||
An array of JSON objects, each overriding properties for a logging `channel`.
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> At the time of writing, only `log_level` can be overridden using this mechanism.
|
|
||||||
|
|
||||||
Each object is of this format:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"channel": "Backend",
|
|
||||||
"log_level": "fatal"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
If no override is present for a given channel, that channel will log at the severity specified by the global `log_level`.
|
|
||||||
|
|
||||||
The log channels that can be overridden are: `Backend`, `WebServer`, `Subscriptions`, `RPC`, `ETL` and `Performance`.
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> See [example-config.json](../docs/examples/config/example-config.json) for more details.
|
|
||||||
|
|
||||||
## `log_to_console`
|
|
||||||
|
|
||||||
Enable or disable log output to console. Options are `true`/`false`. This option defaults to `true`.
|
|
||||||
|
|
||||||
## `log_directory`
|
|
||||||
|
|
||||||
Path to the directory where log files are stored. If such directory doesn't exist, Clio will create it.
|
|
||||||
|
|
||||||
If the option is not specified, the logs are not written to a file.
|
|
||||||
|
|
||||||
## `log_rotation_size`
|
|
||||||
|
|
||||||
The max size of the log file in **megabytes** before it will rotate into a smaller file. Defaults to 2GB.
|
|
||||||
|
|
||||||
## `log_directory_max_size`
|
|
||||||
|
|
||||||
The max size of the log directory in **megabytes** before old log files will be deleted to free up space. Defaults to 50GB.
|
|
||||||
|
|
||||||
## `log_rotation_hour_interval`
|
|
||||||
|
|
||||||
The time interval in **hours** after the last log rotation to automatically rotate the current log file. Defaults to 12 hours.
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Log rotation based on time occurs in conjunction with size-based log rotation. For example, if a size-based log rotation occurs, the timer for the time-based rotation will reset.
|
|
||||||
|
|
||||||
## `log_tag_style`
|
|
||||||
|
|
||||||
Tag implementation to use. Must be one of:
|
|
||||||
|
|
||||||
- `uint`: Lock free and threadsafe but outputs just a simple unsigned integer
|
|
||||||
- `uuid`: Threadsafe and outputs a UUID tag
|
|
||||||
- `none`: Doesn't use tagging at all
|
|
||||||
@@ -61,6 +61,7 @@ pushd ${DOCDIR} > /dev/null 2>&1
|
|||||||
cat ${ROOT}/docs/Doxyfile | \
|
cat ${ROOT}/docs/Doxyfile | \
|
||||||
sed \
|
sed \
|
||||||
-e "s/\${LINT}/YES/" \
|
-e "s/\${LINT}/YES/" \
|
||||||
|
-e "s/\${WARN_AS_ERROR}/NO/" \
|
||||||
-e "s!\${SOURCE}!${ROOT}!" \
|
-e "s!\${SOURCE}!${ROOT}!" \
|
||||||
-e "s/\${USE_DOT}/NO/" \
|
-e "s/\${USE_DOT}/NO/" \
|
||||||
-e "s/\${EXCLUDES}/impl/" \
|
-e "s/\${EXCLUDES}/impl/" \
|
||||||
|
|||||||
118
pre-commit-hooks/json_in_cpp.py
Executable file
118
pre-commit-hooks/json_in_cpp.py
Executable file
@@ -0,0 +1,118 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
PATTERN = r'R"JSON\((.*?)\)JSON"'
|
||||||
|
|
||||||
|
|
||||||
|
def use_uppercase(cpp_content: str) -> str:
|
||||||
|
return cpp_content.replace('R"json(', 'R"JSON(').replace(')json"', ')JSON"')
|
||||||
|
|
||||||
|
|
||||||
|
def fix_json_style(cpp_content: str) -> str:
|
||||||
|
def replace_json(match):
|
||||||
|
raw_json = match.group(1)
|
||||||
|
|
||||||
|
raw_json = (
|
||||||
|
raw_json.replace(" :", ":")
|
||||||
|
.replace(" ,", ",")
|
||||||
|
.replace(" null", "null")
|
||||||
|
.replace(':"', ': "')
|
||||||
|
.replace(',"', ', "')
|
||||||
|
.replace('":{', '": {')
|
||||||
|
.replace('":[', '": [')
|
||||||
|
.replace('":true', '": true')
|
||||||
|
.replace('":false', '": false')
|
||||||
|
.replace('":null', '": null')
|
||||||
|
)
|
||||||
|
for digit in range(10):
|
||||||
|
raw_json = raw_json.replace(f'":{digit}', f'": {digit}')
|
||||||
|
return f'R"JSON({raw_json})JSON"'
|
||||||
|
|
||||||
|
return re.sub(PATTERN, replace_json, cpp_content, flags=re.DOTALL)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_colon_spacing(cpp_content: str) -> str:
|
||||||
|
def replace_json(match):
|
||||||
|
raw_json = match.group(1)
|
||||||
|
raw_json = re.sub(r'":\n\s*(\[|\{)', r'": \1', raw_json)
|
||||||
|
return f'R"JSON({raw_json})JSON"'
|
||||||
|
return re.sub(PATTERN, replace_json, cpp_content, flags=re.DOTALL)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_indentation(cpp_content: str) -> str:
|
||||||
|
lines = cpp_content.splitlines()
|
||||||
|
|
||||||
|
def find_indentation(line: str) -> int:
|
||||||
|
return len(line) - len(line.lstrip())
|
||||||
|
|
||||||
|
for (line_num, (line, next_line)) in enumerate(zip(lines[:-1], lines[1:])):
|
||||||
|
if "JSON(" in line and ")JSON" not in line:
|
||||||
|
indent = find_indentation(line)
|
||||||
|
next_indent = find_indentation(next_line)
|
||||||
|
|
||||||
|
by_how_much = next_indent - (indent + 4)
|
||||||
|
if by_how_much != 0:
|
||||||
|
print(
|
||||||
|
f"Indentation error at line: {line_num + 2}: expected {indent + 4} spaces, found {next_indent} spaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in range(line_num + 1, len(lines)):
|
||||||
|
if ")JSON" in lines[i]:
|
||||||
|
lines[i] = " " * indent + lines[i].lstrip()
|
||||||
|
break
|
||||||
|
lines[i] = lines[i][by_how_much:] if by_how_much > 0 else " " * (-by_how_much) + lines[i]
|
||||||
|
|
||||||
|
return "\n".join(lines) + "\n"
|
||||||
|
|
||||||
|
|
||||||
|
def process_file(file_path: Path, dry_run: bool) -> bool:
|
||||||
|
content = file_path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
new_content = content
|
||||||
|
new_content = use_uppercase(new_content)
|
||||||
|
new_content = fix_json_style(new_content)
|
||||||
|
new_content = fix_colon_spacing(new_content)
|
||||||
|
new_content = fix_indentation(new_content)
|
||||||
|
|
||||||
|
if new_content != content:
|
||||||
|
print(f"Processing file: {file_path}")
|
||||||
|
if dry_run:
|
||||||
|
print("Dry run: changes won't be written to the file.")
|
||||||
|
else:
|
||||||
|
print("Writing changes to file.")
|
||||||
|
file_path.write_text(new_content, encoding="utf-8")
|
||||||
|
return new_content == content
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Fix JSON style in C++ files",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--dry-run",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="Don't modify files, just print what would be changed",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"files",
|
||||||
|
nargs="*",
|
||||||
|
help="Specific files to process",
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
success = True
|
||||||
|
for file in args.files:
|
||||||
|
success = success and process_file(Path(file), dry_run=args.dry_run)
|
||||||
|
if not success:
|
||||||
|
print("Errors occurred while processing files.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -10,4 +10,5 @@ target_link_libraries(
|
|||||||
clio_web
|
clio_web
|
||||||
clio_rpc
|
clio_rpc
|
||||||
clio_migration
|
clio_migration
|
||||||
|
PRIVATE Boost::program_options
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "util/build/Build.hpp"
|
#include "util/build/Build.hpp"
|
||||||
#include "util/config/ConfigDescription.hpp"
|
#include "util/config/ConfigDescription.hpp"
|
||||||
|
|
||||||
|
#include <boost/program_options/errors.hpp>
|
||||||
#include <boost/program_options/options_description.hpp>
|
#include <boost/program_options/options_description.hpp>
|
||||||
#include <boost/program_options/parsers.hpp>
|
#include <boost/program_options/parsers.hpp>
|
||||||
#include <boost/program_options/positional_options.hpp>
|
#include <boost/program_options/positional_options.hpp>
|
||||||
@@ -56,21 +57,31 @@ CliArgs::parse(int argc, char const* argv[])
|
|||||||
po::positional_options_description positional;
|
po::positional_options_description positional;
|
||||||
positional.add("conf", 1);
|
positional.add("conf", 1);
|
||||||
|
|
||||||
po::variables_map parsed;
|
auto const printHelp = [&description]() {
|
||||||
po::store(po::command_line_parser(argc, argv).options(description).positional(positional).run(), parsed);
|
|
||||||
po::notify(parsed);
|
|
||||||
|
|
||||||
if (parsed.count("help") != 0u) {
|
|
||||||
std::cout << "Clio server " << util::build::getClioFullVersionString() << "\n\n" << description;
|
std::cout << "Clio server " << util::build::getClioFullVersionString() << "\n\n" << description;
|
||||||
|
};
|
||||||
|
|
||||||
|
po::variables_map parsed;
|
||||||
|
try {
|
||||||
|
po::store(po::command_line_parser(argc, argv).options(description).positional(positional).run(), parsed);
|
||||||
|
po::notify(parsed);
|
||||||
|
} catch (po::error const& e) {
|
||||||
|
std::cerr << "Error: " << e.what() << std::endl << std::endl;
|
||||||
|
printHelp();
|
||||||
|
return Action{Action::Exit{EXIT_FAILURE}};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsed.contains("help")) {
|
||||||
|
printHelp();
|
||||||
return Action{Action::Exit{EXIT_SUCCESS}};
|
return Action{Action::Exit{EXIT_SUCCESS}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parsed.count("version") != 0u) {
|
if (parsed.contains("version")) {
|
||||||
std::cout << util::build::getClioFullVersionString() << '\n';
|
std::cout << util::build::getClioFullVersionString() << '\n';
|
||||||
return Action{Action::Exit{EXIT_SUCCESS}};
|
return Action{Action::Exit{EXIT_SUCCESS}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parsed.count("config-description") != 0u) {
|
if (parsed.contains("config-description")) {
|
||||||
std::filesystem::path const filePath = parsed["config-description"].as<std::string>();
|
std::filesystem::path const filePath = parsed["config-description"].as<std::string>();
|
||||||
|
|
||||||
auto const res = util::config::ClioConfigDescription::generateConfigDescriptionToFile(filePath);
|
auto const res = util::config::ClioConfigDescription::generateConfigDescriptionToFile(filePath);
|
||||||
@@ -83,18 +94,17 @@ CliArgs::parse(int argc, char const* argv[])
|
|||||||
|
|
||||||
auto configPath = parsed["conf"].as<std::string>();
|
auto configPath = parsed["conf"].as<std::string>();
|
||||||
|
|
||||||
if (parsed.count("migrate") != 0u) {
|
if (parsed.contains("migrate")) {
|
||||||
auto const opt = parsed["migrate"].as<std::string>();
|
auto const opt = parsed["migrate"].as<std::string>();
|
||||||
if (opt == "status")
|
if (opt == "status")
|
||||||
return Action{Action::Migrate{.configPath = std::move(configPath), .subCmd = MigrateSubCmd::status()}};
|
return Action{Action::Migrate{.configPath = std::move(configPath), .subCmd = MigrateSubCmd::status()}};
|
||||||
return Action{Action::Migrate{.configPath = std::move(configPath), .subCmd = MigrateSubCmd::migration(opt)}};
|
return Action{Action::Migrate{.configPath = std::move(configPath), .subCmd = MigrateSubCmd::migration(opt)}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parsed.count("verify") != 0u)
|
if (parsed.contains("verify"))
|
||||||
return Action{Action::VerifyConfig{.configPath = std::move(configPath)}};
|
return Action{Action::VerifyConfig{.configPath = std::move(configPath)}};
|
||||||
|
|
||||||
return Action{Action::Run{.configPath = std::move(configPath), .useNgWebServer = parsed.count("ng-web-server") != 0}
|
return Action{Action::Run{.configPath = std::move(configPath), .useNgWebServer = parsed.contains("ng-web-server")}};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
|||||||
@@ -36,10 +36,11 @@
|
|||||||
#include "rpc/RPCEngine.hpp"
|
#include "rpc/RPCEngine.hpp"
|
||||||
#include "rpc/WorkQueue.hpp"
|
#include "rpc/WorkQueue.hpp"
|
||||||
#include "rpc/common/impl/HandlerProvider.hpp"
|
#include "rpc/common/impl/HandlerProvider.hpp"
|
||||||
|
#include "util/Random.hpp"
|
||||||
|
#include "util/async/context/BasicExecutionContext.hpp"
|
||||||
#include "util/build/Build.hpp"
|
#include "util/build/Build.hpp"
|
||||||
#include "util/config/ConfigDefinition.hpp"
|
#include "util/config/ConfigDefinition.hpp"
|
||||||
#include "util/log/Logger.hpp"
|
#include "util/log/Logger.hpp"
|
||||||
#include "util/prometheus/Prometheus.hpp"
|
|
||||||
#include "web/AdminVerificationStrategy.hpp"
|
#include "web/AdminVerificationStrategy.hpp"
|
||||||
#include "web/RPCServerHandler.hpp"
|
#include "web/RPCServerHandler.hpp"
|
||||||
#include "web/Server.hpp"
|
#include "web/Server.hpp"
|
||||||
@@ -89,7 +90,6 @@ ClioApplication::ClioApplication(util::config::ClioConfigDefinition const& confi
|
|||||||
: config_(config), signalsHandler_{config_}
|
: config_(config), signalsHandler_{config_}
|
||||||
{
|
{
|
||||||
LOG(util::LogService::info()) << "Clio version: " << util::build::getClioFullVersionString();
|
LOG(util::LogService::info()) << "Clio version: " << util::build::getClioFullVersionString();
|
||||||
PrometheusService::init(config);
|
|
||||||
signalsHandler_.subscribeToStop([this]() { appStopper_.stop(); });
|
signalsHandler_.subscribeToStop([this]() { appStopper_.stop(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,6 +103,10 @@ ClioApplication::run(bool const useNgWebServer)
|
|||||||
// This is not the only io context in the application.
|
// This is not the only io context in the application.
|
||||||
boost::asio::io_context ioc{threads};
|
boost::asio::io_context ioc{threads};
|
||||||
|
|
||||||
|
// Similarly we need a context to run ETLng on
|
||||||
|
// In the future we can remove the raw ioc and use ctx instead
|
||||||
|
util::async::CoroExecutionContext ctx{threads};
|
||||||
|
|
||||||
// Rate limiter, to prevent abuse
|
// Rate limiter, to prevent abuse
|
||||||
auto whitelistHandler = web::dosguard::WhitelistHandler{config_};
|
auto whitelistHandler = web::dosguard::WhitelistHandler{config_};
|
||||||
auto const dosguardWeights = web::dosguard::Weights::make(config_);
|
auto const dosguardWeights = web::dosguard::Weights::make(config_);
|
||||||
@@ -139,14 +143,19 @@ ClioApplication::run(bool const useNgWebServer)
|
|||||||
// The server uses the balancer to forward RPCs to a rippled node.
|
// The server uses the balancer to forward RPCs to a rippled node.
|
||||||
// The balancer itself publishes to streams (transactions_proposed and accounts_proposed)
|
// The balancer itself publishes to streams (transactions_proposed and accounts_proposed)
|
||||||
auto balancer = [&] -> std::shared_ptr<etlng::LoadBalancerInterface> {
|
auto balancer = [&] -> std::shared_ptr<etlng::LoadBalancerInterface> {
|
||||||
if (config_.get<bool>("__ng_etl"))
|
if (config_.get<bool>("__ng_etl")) {
|
||||||
return etlng::LoadBalancer::makeLoadBalancer(config_, ioc, backend, subscriptions, ledgers);
|
return etlng::LoadBalancer::makeLoadBalancer(
|
||||||
|
config_, ioc, backend, subscriptions, std::make_unique<util::MTRandomGenerator>(), ledgers
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return etl::LoadBalancer::makeLoadBalancer(config_, ioc, backend, subscriptions, ledgers);
|
return etl::LoadBalancer::makeLoadBalancer(
|
||||||
|
config_, ioc, backend, subscriptions, std::make_unique<util::MTRandomGenerator>(), ledgers
|
||||||
|
);
|
||||||
}();
|
}();
|
||||||
|
|
||||||
// ETL is responsible for writing and publishing to streams. In read-only mode, ETL only publishes
|
// ETL is responsible for writing and publishing to streams. In read-only mode, ETL only publishes
|
||||||
auto etl = etl::ETLService::makeETLService(config_, ioc, backend, subscriptions, balancer, ledgers);
|
auto etl = etl::ETLService::makeETLService(config_, ioc, ctx, backend, subscriptions, balancer, ledgers);
|
||||||
|
|
||||||
auto workQueue = rpc::WorkQueue::makeWorkQueue(config_);
|
auto workQueue = rpc::WorkQueue::makeWorkQueue(config_);
|
||||||
auto counters = rpc::Counters::makeCounters(workQueue);
|
auto counters = rpc::Counters::makeCounters(workQueue);
|
||||||
@@ -169,7 +178,9 @@ ClioApplication::run(bool const useNgWebServer)
|
|||||||
}
|
}
|
||||||
auto const adminVerifier = std::move(expectedAdminVerifier).value();
|
auto const adminVerifier = std::move(expectedAdminVerifier).value();
|
||||||
|
|
||||||
auto httpServer = web::ng::makeServer(config_, OnConnectCheck{dosGuard}, DisconnectHook{dosGuard}, ioc);
|
auto httpServer = web::ng::makeServer(
|
||||||
|
config_, OnConnectCheck{dosGuard}, IpChangeHook{dosGuard}, DisconnectHook{dosGuard}, ioc
|
||||||
|
);
|
||||||
|
|
||||||
if (not httpServer.has_value()) {
|
if (not httpServer.has_value()) {
|
||||||
LOG(util::LogService::error()) << "Error creating web server: " << httpServer.error();
|
LOG(util::LogService::error()) << "Error creating web server: " << httpServer.error();
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include "app/Stopper.hpp"
|
#include "app/Stopper.hpp"
|
||||||
|
|
||||||
|
#include "util/Spawn.hpp"
|
||||||
|
|
||||||
#include <boost/asio/spawn.hpp>
|
#include <boost/asio/spawn.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@@ -36,7 +38,7 @@ Stopper::~Stopper()
|
|||||||
void
|
void
|
||||||
Stopper::setOnStop(std::function<void(boost::asio::yield_context)> cb)
|
Stopper::setOnStop(std::function<void(boost::asio::yield_context)> cb)
|
||||||
{
|
{
|
||||||
boost::asio::spawn(ctx_, std::move(cb));
|
util::spawn(ctx_, std::move(cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ public:
|
|||||||
|
|
||||||
ioc.stop();
|
ioc.stop();
|
||||||
LOG(util::LogService::info()) << "io_context stopped";
|
LOG(util::LogService::info()) << "io_context stopped";
|
||||||
|
|
||||||
|
util::LogService::shutdown();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ parseConfig(std::string_view configPath)
|
|||||||
std::cerr << "Error parsing json from config: " << configPath << "\n" << json.error().error << std::endl;
|
std::cerr << "Error parsing json from config: " << configPath << "\n" << json.error().error << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto const errors = gClioConfig.parse(json.value());
|
auto const errors = getClioConfig().parse(json.value());
|
||||||
if (errors.has_value()) {
|
if (errors.has_value()) {
|
||||||
for (auto const& err : errors.value()) {
|
for (auto const& err : errors.value()) {
|
||||||
std::cerr << "Issues found in provided config '" << configPath << "':\n";
|
std::cerr << "Issues found in provided config '" << configPath << "':\n";
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace app {
|
namespace app {
|
||||||
@@ -54,6 +55,17 @@ OnConnectCheck::operator()(web::ng::Connection const& connection)
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IpChangeHook::IpChangeHook(web::dosguard::DOSGuardInterface& dosguard) : dosguard_(dosguard)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
IpChangeHook::operator()(std::string const& oldIp, std::string const& newIp)
|
||||||
|
{
|
||||||
|
dosguard_.get().decrement(oldIp);
|
||||||
|
dosguard_.get().increment(newIp);
|
||||||
|
}
|
||||||
|
|
||||||
DisconnectHook::DisconnectHook(web::dosguard::DOSGuardInterface& dosguard) : dosguard_{dosguard}
|
DisconnectHook::DisconnectHook(web::dosguard::DOSGuardInterface& dosguard) : dosguard_{dosguard}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -97,7 +109,7 @@ HealthCheckHandler::operator()(
|
|||||||
boost::asio::yield_context
|
boost::asio::yield_context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
static auto constexpr kHEALTH_CHECK_HTML = R"html(
|
static constexpr auto kHEALTH_CHECK_HTML = R"html(
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head><title>Test page for Clio</title></head>
|
<head><title>Test page for Clio</title></head>
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include <exception>
|
#include <exception>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace app {
|
namespace app {
|
||||||
@@ -64,6 +65,31 @@ public:
|
|||||||
operator()(web::ng::Connection const& connection);
|
operator()(web::ng::Connection const& connection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A function object that is called when the IP of a connection changes (usually if proxy detected).
|
||||||
|
* This is used to update the DOS guard.
|
||||||
|
*/
|
||||||
|
class IpChangeHook {
|
||||||
|
std::reference_wrapper<web::dosguard::DOSGuardInterface> dosguard_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Construct a new IpChangeHook object.
|
||||||
|
*
|
||||||
|
* @param dosguard The DOS guard to use.
|
||||||
|
*/
|
||||||
|
IpChangeHook(web::dosguard::DOSGuardInterface& dosguard);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The call of the function object.
|
||||||
|
*
|
||||||
|
* @param oldIp The old IP of the connection.
|
||||||
|
* @param newIp The new IP of the connection.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
operator()(std::string const& oldIp, std::string const& newIp);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A function object to be called when a connection is disconnected.
|
* @brief A function object to be called when a connection is disconnected.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -21,10 +21,16 @@
|
|||||||
|
|
||||||
#include "cluster/ClioNode.hpp"
|
#include "cluster/ClioNode.hpp"
|
||||||
#include "data/BackendInterface.hpp"
|
#include "data/BackendInterface.hpp"
|
||||||
|
#include "util/Assert.hpp"
|
||||||
|
#include "util/Spawn.hpp"
|
||||||
#include "util/log/Logger.hpp"
|
#include "util/log/Logger.hpp"
|
||||||
|
|
||||||
|
#include <boost/asio/bind_cancellation_slot.hpp>
|
||||||
|
#include <boost/asio/cancellation_type.hpp>
|
||||||
|
#include <boost/asio/error.hpp>
|
||||||
#include <boost/asio/spawn.hpp>
|
#include <boost/asio/spawn.hpp>
|
||||||
#include <boost/asio/steady_timer.hpp>
|
#include <boost/asio/steady_timer.hpp>
|
||||||
|
#include <boost/asio/use_future.hpp>
|
||||||
#include <boost/json/parse.hpp>
|
#include <boost/json/parse.hpp>
|
||||||
#include <boost/json/serialize.hpp>
|
#include <boost/json/serialize.hpp>
|
||||||
#include <boost/json/value.hpp>
|
#include <boost/json/value.hpp>
|
||||||
@@ -35,11 +41,16 @@
|
|||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <latch>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr auto kTOTAL_WORKERS = 2uz; // 1 reading and 1 writing worker (coroutines)
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace cluster {
|
namespace cluster {
|
||||||
|
|
||||||
ClusterCommunicationService::ClusterCommunicationService(
|
ClusterCommunicationService::ClusterCommunicationService(
|
||||||
@@ -50,6 +61,7 @@ ClusterCommunicationService::ClusterCommunicationService(
|
|||||||
: backend_(std::move(backend))
|
: backend_(std::move(backend))
|
||||||
, readInterval_(readInterval)
|
, readInterval_(readInterval)
|
||||||
, writeInterval_(writeInterval)
|
, writeInterval_(writeInterval)
|
||||||
|
, finishedCountdown_(kTOTAL_WORKERS)
|
||||||
, selfData_{ClioNode{
|
, selfData_{ClioNode{
|
||||||
.uuid = std::make_shared<boost::uuids::uuid>(boost::uuids::random_generator{}()),
|
.uuid = std::make_shared<boost::uuids::uuid>(boost::uuids::random_generator{}()),
|
||||||
.updateTime = std::chrono::system_clock::time_point{}
|
.updateTime = std::chrono::system_clock::time_point{}
|
||||||
@@ -62,22 +74,42 @@ ClusterCommunicationService::ClusterCommunicationService(
|
|||||||
void
|
void
|
||||||
ClusterCommunicationService::run()
|
ClusterCommunicationService::run()
|
||||||
{
|
{
|
||||||
boost::asio::spawn(strand_, [this](boost::asio::yield_context yield) {
|
ASSERT(not running_ and not stopped_, "Can only be ran once");
|
||||||
|
running_ = true;
|
||||||
|
|
||||||
|
util::spawn(strand_, [this](boost::asio::yield_context yield) {
|
||||||
boost::asio::steady_timer timer(yield.get_executor());
|
boost::asio::steady_timer timer(yield.get_executor());
|
||||||
while (true) {
|
boost::system::error_code ec;
|
||||||
|
|
||||||
|
while (running_) {
|
||||||
timer.expires_after(readInterval_);
|
timer.expires_after(readInterval_);
|
||||||
timer.async_wait(yield);
|
auto token = cancelSignal_.slot();
|
||||||
|
timer.async_wait(boost::asio::bind_cancellation_slot(token, yield[ec]));
|
||||||
|
|
||||||
|
if (ec == boost::asio::error::operation_aborted or not running_)
|
||||||
|
break;
|
||||||
|
|
||||||
doRead(yield);
|
doRead(yield);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
finishedCountdown_.count_down(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
boost::asio::spawn(strand_, [this](boost::asio::yield_context yield) {
|
util::spawn(strand_, [this](boost::asio::yield_context yield) {
|
||||||
boost::asio::steady_timer timer(yield.get_executor());
|
boost::asio::steady_timer timer(yield.get_executor());
|
||||||
while (true) {
|
boost::system::error_code ec;
|
||||||
|
|
||||||
|
while (running_) {
|
||||||
doWrite();
|
doWrite();
|
||||||
timer.expires_after(writeInterval_);
|
timer.expires_after(writeInterval_);
|
||||||
timer.async_wait(yield);
|
auto token = cancelSignal_.slot();
|
||||||
|
timer.async_wait(boost::asio::bind_cancellation_slot(token, yield[ec]));
|
||||||
|
|
||||||
|
if (ec == boost::asio::error::operation_aborted or not running_)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
finishedCountdown_.count_down(1);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,9 +124,19 @@ ClusterCommunicationService::stop()
|
|||||||
if (stopped_)
|
if (stopped_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ctx_.stop();
|
|
||||||
ctx_.join();
|
|
||||||
stopped_ = true;
|
stopped_ = true;
|
||||||
|
|
||||||
|
// for ASAN to see through concurrency correctly we need to exit all coroutines before joining the ctx
|
||||||
|
running_ = false;
|
||||||
|
|
||||||
|
// cancelSignal_ is not thread safe so we execute emit on the same strand
|
||||||
|
boost::asio::spawn(
|
||||||
|
strand_, [this](auto&&) { cancelSignal_.emit(boost::asio::cancellation_type::all); }, boost::asio::use_future
|
||||||
|
)
|
||||||
|
.wait();
|
||||||
|
finishedCountdown_.wait();
|
||||||
|
|
||||||
|
ctx_.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<boost::uuids::uuid>
|
std::shared_ptr<boost::uuids::uuid>
|
||||||
@@ -108,7 +150,7 @@ ClioNode
|
|||||||
ClusterCommunicationService::selfData() const
|
ClusterCommunicationService::selfData() const
|
||||||
{
|
{
|
||||||
ClioNode result{};
|
ClioNode result{};
|
||||||
boost::asio::spawn(strand_, [this, &result](boost::asio::yield_context) { result = selfData_; });
|
util::spawn(strand_, [this, &result](boost::asio::yield_context) { result = selfData_; });
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +161,7 @@ ClusterCommunicationService::clusterData() const
|
|||||||
return std::unexpected{"Service is not healthy"};
|
return std::unexpected{"Service is not healthy"};
|
||||||
}
|
}
|
||||||
std::vector<ClioNode> result;
|
std::vector<ClioNode> result;
|
||||||
boost::asio::spawn(strand_, [this, &result](boost::asio::yield_context) {
|
util::spawn(strand_, [this, &result](boost::asio::yield_context) {
|
||||||
result = otherNodesData_;
|
result = otherNodesData_;
|
||||||
result.push_back(selfData_);
|
result.push_back(selfData_);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -27,12 +27,15 @@
|
|||||||
#include "util/prometheus/Gauge.hpp"
|
#include "util/prometheus/Gauge.hpp"
|
||||||
#include "util/prometheus/Prometheus.hpp"
|
#include "util/prometheus/Prometheus.hpp"
|
||||||
|
|
||||||
|
#include <boost/asio/cancellation_signal.hpp>
|
||||||
#include <boost/asio/spawn.hpp>
|
#include <boost/asio/spawn.hpp>
|
||||||
#include <boost/asio/strand.hpp>
|
#include <boost/asio/strand.hpp>
|
||||||
#include <boost/asio/thread_pool.hpp>
|
#include <boost/asio/thread_pool.hpp>
|
||||||
#include <boost/uuid/uuid.hpp>
|
#include <boost/uuid/uuid.hpp>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <latch>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -65,11 +68,14 @@ class ClusterCommunicationService : public ClusterCommunicationServiceInterface
|
|||||||
std::chrono::steady_clock::duration readInterval_;
|
std::chrono::steady_clock::duration readInterval_;
|
||||||
std::chrono::steady_clock::duration writeInterval_;
|
std::chrono::steady_clock::duration writeInterval_;
|
||||||
|
|
||||||
|
boost::asio::cancellation_signal cancelSignal_;
|
||||||
|
std::latch finishedCountdown_;
|
||||||
|
std::atomic_bool running_ = false;
|
||||||
|
bool stopped_ = false;
|
||||||
|
|
||||||
ClioNode selfData_;
|
ClioNode selfData_;
|
||||||
std::vector<ClioNode> otherNodesData_;
|
std::vector<ClioNode> otherNodesData_;
|
||||||
|
|
||||||
bool stopped_ = false;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static constexpr std::chrono::milliseconds kDEFAULT_READ_INTERVAL{2100};
|
static constexpr std::chrono::milliseconds kDEFAULT_READ_INTERVAL{2100};
|
||||||
static constexpr std::chrono::milliseconds kDEFAULT_WRITE_INTERVAL{1200};
|
static constexpr std::chrono::milliseconds kDEFAULT_WRITE_INTERVAL{1200};
|
||||||
|
|||||||
@@ -78,17 +78,20 @@ WritingAmendmentKey::WritingAmendmentKey(std::string amendmentName) : AmendmentK
|
|||||||
|
|
||||||
} // namespace impl
|
} // namespace impl
|
||||||
|
|
||||||
AmendmentKey::operator std::string const&() const
|
AmendmentKey::
|
||||||
|
operator std::string const&() const
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
AmendmentKey::operator std::string_view() const
|
AmendmentKey::
|
||||||
|
operator std::string_view() const
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
AmendmentKey::operator ripple::uint256() const
|
AmendmentKey::
|
||||||
|
operator ripple::uint256() const
|
||||||
{
|
{
|
||||||
return Amendment::getAmendmentId(name);
|
return Amendment::getAmendmentId(name);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ struct Amendments {
|
|||||||
|
|
||||||
/** @cond */
|
/** @cond */
|
||||||
// NOLINTBEGIN(readability-identifier-naming)
|
// NOLINTBEGIN(readability-identifier-naming)
|
||||||
REGISTER(OwnerPaysFee);
|
|
||||||
REGISTER(Flow);
|
REGISTER(Flow);
|
||||||
REGISTER(FlowCross);
|
REGISTER(FlowCross);
|
||||||
REGISTER(fix1513);
|
REGISTER(fix1513);
|
||||||
@@ -139,6 +138,15 @@ struct Amendments {
|
|||||||
REGISTER(DeepFreeze);
|
REGISTER(DeepFreeze);
|
||||||
REGISTER(PermissionDelegation);
|
REGISTER(PermissionDelegation);
|
||||||
REGISTER(fixPayChanCancelAfter);
|
REGISTER(fixPayChanCancelAfter);
|
||||||
|
REGISTER(Batch);
|
||||||
|
REGISTER(PermissionedDEX);
|
||||||
|
REGISTER(SingleAssetVault);
|
||||||
|
REGISTER(TokenEscrow);
|
||||||
|
REGISTER(fixAMMv1_3);
|
||||||
|
REGISTER(fixEnforceNFTokenTrustlineV2);
|
||||||
|
REGISTER(fixAMMClawbackRounding);
|
||||||
|
REGISTER(fixMPTDeliveredAmount);
|
||||||
|
REGISTER(fixPriceOracleOrder);
|
||||||
|
|
||||||
// Obsolete but supported by libxrpl
|
// Obsolete but supported by libxrpl
|
||||||
REGISTER(CryptoConditionsSuite);
|
REGISTER(CryptoConditionsSuite);
|
||||||
@@ -147,6 +155,7 @@ struct Amendments {
|
|||||||
REGISTER(fixNFTokenNegOffer);
|
REGISTER(fixNFTokenNegOffer);
|
||||||
|
|
||||||
// Retired amendments
|
// Retired amendments
|
||||||
|
REGISTER(OwnerPaysFee); // Removed in xrpl 2.6.0 (https://github.com/XRPLF/rippled/pull/5435)
|
||||||
REGISTER(MultiSign);
|
REGISTER(MultiSign);
|
||||||
REGISTER(TrustSetAuth);
|
REGISTER(TrustSetAuth);
|
||||||
REGISTER(FeeEscalation);
|
REGISTER(FeeEscalation);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user