Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bda6c7b
Forkde to my account - Added repository line to download executables
martinrichtersupervag Aug 30, 2026
0257865
interoperability.yml - fail-fast: false
martinrichtersupervag Aug 30, 2026
d9ddc9a
Fix indentation in1_run_interoperability_tests.yml file
martinrichtersupervag Aug 30, 2026
ad7738a
upload process to use Rclone
martinrichtersupervag Aug 30, 2026
da0af67
Disable base64 encoding for rclone upload
martinrichtersupervag Aug 30, 2026
03c7a4c
Add batch run and compare workflow for reports
martinrichtersupervag Aug 31, 2026
e9d8c8a
batch run and compare reports workflow ntimes
martinrichtersupervag Aug 31, 2026
33cdd54
batch_run_and_compare2.yml
martinrichtersupervag Aug 31, 2026
6cd208e
Rename workflow to 'Batch Run and Compare Reports'
martinrichtersupervag Aug 31, 2026
3fa9f8a
Add files via upload
martinrichtersupervag Sep 14, 2026
ae3182c
1_run_interoperability_tests_local.yml
martinrichtersupervag Sep 14, 2026
55f16d6
2_upload_artifact_local.yml
martinrichtersupervag Sep 14, 2026
ba7553e
2 - Upload Local Test Results to Drive
martinrichtersupervag Sep 14, 2026
e0ac97e
Remove Python setup steps from workflow 1 local
martinrichtersupervag Sep 14, 2026
064dda3
Modify pip install in Test Interperability workflow Local
martinrichtersupervag Sep 14, 2026
904eb17
lxml version to >=5.2.0
martinrichtersupervag Sep 14, 2026
e4f4454
Add comprehensive interoperability fixes analysis
martinrichtersupervag Sep 15, 2026
296e8a3
fix: invoke junitparser via python3 -m to bypass missing PATH
Sep 16, 2026
26b9d26
¨Merge remote-tracking branch 'origin/master'
martinrichtersupervag Sep 16, 2026
beec99d
Enhanced Error Diagnostics & Vendor Compatibility Handling
martinrichtersupervag Sep 16, 2026
4fa3d0f
Merge branch 'master' of github.com:martinrichtersupervag/dds-rtps
martinrichtersupervag Sep 16, 2026
8c65cff
generate_report.sh, uprava upload_local.yml
martinrichtersupervag Sep 19, 2026
92456b1
upload_local.yml process corrected
martinrichtersupervag Sep 19, 2026
e2119e2
docker isolation
martinrichtersupervag Sep 19, 2026
2fa969d
chmod run_in_docker.sh
martinrichtersupervag Sep 19, 2026
47478a0
script created
martinrichtersupervag Sep 19, 2026
0b24160
version nodejs
martinrichtersupervag Sep 19, 2026
5e55ea5
Improve 1_run_interoperability_tests.yml resilience and runner flexib…
martinrichtersupervag Sep 21, 2026
996d0b5
Auto-switch to isolated Docker runner on self-hosted runners and docu…
martinrichtersupervag Sep 21, 2026
36ae32e
Add Contributor License Agreement (CLA) for Martin Richter
martinrichtersupervag Sep 21, 2026
0bafb0b
Fix self-hosted runner permissions and Python setup on Debian 13
martinrichtersupervag Sep 22, 2026
4f6bcf8
rpts discovery report
martinrichtersupervag Sep 22, 2026
6c2baa1
Unify 2_upload_artifact.yml for cross-runner and fork support and rem…
martinrichtersupervag Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.git
.github
.venv
__pycache__
*.pyc
*.xml
*.xlsx
*.html
*.zip
OpenDDS-durable-data-dir
zipped_executables
archive_reports
123 changes: 123 additions & 0 deletions .github/workflows/.github/1_run_interoperability_tests_local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: 1 - Run Interoperability Tests Local
run-name: Run Interoperability Tests Local
on:
workflow_dispatch:
inputs:
publishers:
description: Publishers to use
type: string
default: '["connext_dds","dust_dds","eprosima_fastdds","intercom_dds","opendds","toc_coredx_dds", "hdds", "eclipse_cyclone", "zzdds"]'
subscribers:
description: Subscribers to use
type: string
default: '["connext_dds","dust_dds","eprosima_fastdds","intercom_dds","opendds","toc_coredx_dds", "hdds", "eclipse_cyclone", "zzdds"]'
jobs:
generate_timestamp:
runs-on: self-hosted
steps:
- name: Generate timestamp file
run: date '+%Y-%m-%d-%H_%M_%S' > timestamp
- name: Upload timestamp file
uses: actions/upload-artifact@v7
with:
name: timestamp
path: |
./timestamp

run_tests:
runs-on: self-hosted
needs: generate_timestamp
strategy:
fail-fast: false
matrix:
publisher: ${{ fromJson(github.event.inputs.publishers) }}
subscriber: ${{ fromJson(github.event.inputs.subscribers) }}

steps:
- name: Checkout sources
uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.11.4'
- name: Download shape_main executables
uses: robinraju/release-downloader@v1.13
with:
repository: "omg-dds/dds-rtps" # <-- PŘIDEJTE TENTO ŘÁDEK
latest: true
fileName: "*"
out-file-path: zipped_executables
preRelease: false
- name: Unzip executables
run: unzip 'zipped_executables/*.zip' -d executables
- name: Install Python requirements
run: pip install --requirement requirements.txt
- name: Run Interoperability script
timeout-minutes: 120
continue-on-error: true
run: |
publisher_exe=executables/${{ matrix.publisher }}*shape_main_linux
subscriber_exe=executables/${{ matrix.subscriber }}*shape_main_linux
output_file=junit_report-${{ matrix.publisher }}-${{ matrix.subscriber }}.xml
extra_args=""
# Check if publisher executable exists
if ! ls $publisher_exe 1> /dev/null 2>&1; then
echo "ERROR: Publisher executable not found: $publisher_exe"
exit 1
fi
# Check if subscriber executable exists
if ! ls $subscriber_exe 1> /dev/null 2>&1; then
echo "ERROR: Subscriber executable not found: $subscriber_exe"
exit 1
fi
if [[ "${subscriber_exe,,}" == *opendds* && "${publisher_exe,,}" == *connext_dds* ]]; then
extra_args="--periodic-announcement 5000"
fi
python3 interoperability_report.py --publisher $publisher_exe --subscriber $subscriber_exe --output-name $output_file $extra_args
- name: Download timestamp
uses: actions/download-artifact@v8
with:
name: timestamp
- name: Upload report
uses: actions/upload-artifact@v7
with:
name: junit_report-${{ matrix.publisher }}-${{ matrix.subscriber }}
path: |
./junit_report-${{ matrix.publisher }}-${{ matrix.subscriber }}.xml
./timestamp

generate_report:
runs-on: self-hosted
needs: run_tests
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Download artifacts
uses: actions/download-artifact@v8
with:
pattern: junit_report-*
merge-multiple: true
- uses: actions/setup-python@v6
with:
python-version: '3.11.4'
- name: Install Python requirements
run: pip install --requirement requirements.txt
- name: merge reports
run: junitparser merge *.xml junit_interoperability_report.xml
- name: Generate xlsx report
run: python3 generate_xlsx_report.py --input junit_interoperability_report.xml --output interoperability_report.xlsx
- name: XUnit
run: npx xunit-viewer --results=./junit_interoperability_report.xml --output=./index.html
- name: Download timestamp
uses: actions/download-artifact@v8
with:
name: timestamp
- name: Attach the report
if: always()
uses: actions/upload-artifact@v7
with:
name: interoperability_report_complete
path: |
./index.html
./junit_interoperability_report.xml
./interoperability_report.xlsx
./timestamp
129 changes: 129 additions & 0 deletions .github/workflows/.github/workflows/batch_run_and_compare.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
name: 3 - Batch Run and Compare Reports
run-name: Batch Run (${{ github.event.inputs.iterations }}x) & Compare Reports
on:
workflow_dispatch:
inputs:
iterations:
description: 'Number of repetitions (N)'
required: true
default: '3'
type: number
publishers:
description: 'Publishers to use'
type: string
default: '["connext_dds","dust_dds","eprosima_fastdds","intercom_dds","opendds","toc_coredx_dds", "hdds", "eclipse_cyclone", "zzdds"]'
subscribers:
description: 'Subscribers to use'
type: string
default: '["connext_dds","dust_dds","eprosima_fastdds","intercom_dds","opendds","toc_coredx_dds", "hdds", "eclipse_cyclone", "zzdds"]'

permissions:
actions: write
contents: read

jobs:
run_batches:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Run N iterations of Workflow 1 and Workflow 2
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
ITERATIONS: ${{ github.event.inputs.iterations }}
PUBLISHERS: ${{ github.event.inputs.publishers }}
SUBSCRIBERS: ${{ github.event.inputs.subscribers }}
run: |
echo "Running $ITERATIONS ..."

for i in $(seq 1 $ITERATIONS); do
echo "=========================================="
echo " Running ITERACI $i of $ITERATIONS"
echo "=========================================="

# 1. Run Workflow 1
echo "Running 1 - Run Interoperability Tests..."
gh workflow run "1 - Run Interoperability Tests" \
--repo "$REPO" \
-f publishers="$PUBLISHERS" \
-f subscribers="$SUBSCRIBERS"

sleep 10

# Get ID of last run Workflow 1
RUN_1_ID=$(gh run list --workflow="1 - Run Interoperability Tests" --repo "$REPO" --limit 1 --json databaseId -q '.[0].databaseId')
echo "Waiting for Workflow 1 (Run ID: $RUN_1_ID)..."
gh run watch "$RUN_1_ID" --repo "$REPO" --exit-status

# 2. Run Workflow 2
echo "Running 2 - Upload Test Results to Drive..."
gh workflow run "2 - Upload Test Results to Drive" --repo "$REPO"

sleep 10

# Get ID Workflow 2
RUN_2_ID=$(gh run list --workflow="2 - Upload Test Results to Drive" --repo "$REPO" --limit 1 --json databaseId -q '.[0].databaseId')
echo "Waiting for Workflow 2 (Run ID: $RUN_2_ID)..."
gh run watch "$RUN_2_ID" --repo "$REPO" --exit-status

echo "✓ Iteration $i successfully ended."
done

- name: Setup Rclone
uses: AnimMouse/setup-rclone@v1
with:
rclone_config: |
[mygdrive]
type = drive
token = ${{ secrets.RCLONE_TOKEN }}
disable_base64: true

- name: Download zip reports from Google Drive
run: |
mkdir -p gdrive_download/zips
mkdir -p xml_reports

echo "Downloading report folder from Google Drive..."
rclone copy mygdrive: gdrive_download/ --drive-root-folder-id ${{ secrets.DRIVE_FOLDER_ID }} --include "report_*/**.zip" -v

echo "Extracting junit XML files ..."
find gdrive_download -type f -name "*.zip" -exec unzip -o {} -d xml_reports/ \;

echo "List of XML files:"
ls -la xml_reports/

- name: Run comparison script
run: |
# 1. download compare script
curl -sSL -o compare_junit_reports.py \
https://raw.githubusercontent.com/martinrichtersupervag/compare_junit_reports/main/compare_junit_reports/test_compare_junit_reports.py

# 2. run comparison
python3 compare_junit_reports.py --directory ./xml_reports --compare-all --show-difference | tee comparison_output.txt

- name: Publish Summary to GitHub Actions
if: always()
run: |
if [ -f comparison_output.txt ]; then
echo "## Comparison results (--compare-all --show-difference)" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
cat comparison_output.txt >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
fi

- name: Upload Comparison Artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: comparison_results
path: |
./comparison_output.txt
./xml_reports/*.txt
./xml_reports/junit_*.xml
39 changes: 29 additions & 10 deletions .github/workflows/1_run_interoperability_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@ on:
description: Subscribers to use
type: string
default: '["connext_dds","dust_dds","eprosima_fastdds","intercom_dds","opendds","toc_coredx_dds", "hdds", "eclipse_cyclone", "zzdds"]'
runner:
description: Runner to use
type: string
default: 'ubuntu-latest'
jobs:
generate_timestamp:
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
steps:
- name: Generate timestamp file
run: date '+%Y-%m-%d-%H_%M_%S' > timestamp
Expand All @@ -25,9 +29,10 @@ jobs:
./timestamp

run_tests:
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
needs: generate_timestamp
strategy:
fail-fast: false
matrix:
publisher: ${{ fromJson(github.event.inputs.publishers) }}
subscriber: ${{ fromJson(github.event.inputs.subscribers) }}
Expand All @@ -36,18 +41,21 @@ jobs:
- name: Checkout sources
uses: actions/checkout@v6
- uses: actions/setup-python@v6
if: runner.environment != 'self-hosted'
with:
python-version: '3.11.4'
- name: Download shape_main executables
uses: robinraju/release-downloader@v1.13
with:
repository: "omg-dds/dds-rtps"
latest: true
fileName: "*"
out-file-path: zipped_executables
preRelease: false
- name: Unzip executables
run: unzip 'zipped_executables/*.zip' -d executables
- name: Install Python requirements
if: runner.environment != 'self-hosted'
run: pip install --requirement requirements.txt
- name: Run Interoperability script
timeout-minutes: 120
Expand All @@ -70,7 +78,13 @@ jobs:
if [[ "${subscriber_exe,,}" == *opendds* && "${publisher_exe,,}" == *connext_dds* ]]; then
extra_args="--periodic-announcement 5000"
fi
python3 interoperability_report.py --publisher $publisher_exe --subscriber $subscriber_exe --output-name $output_file $extra_args
if [ "$RUNNER_ENVIRONMENT" = "self-hosted" ]; then
echo "Running on self-hosted runner: executing inside isolated Docker container..."
./run_in_docker.sh python3 interoperability_report.py --publisher $publisher_exe --subscriber $subscriber_exe --output-name $output_file $extra_args
else
echo "Running in GitHub-hosted environment: executing directly..."
python3 interoperability_report.py --publisher $publisher_exe --subscriber $subscriber_exe --output-name $output_file $extra_args
fi
- name: Download timestamp
uses: actions/download-artifact@v8
with:
Expand All @@ -84,7 +98,7 @@ jobs:
./timestamp

generate_report:
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
needs: run_tests
steps:
- name: Checkout
Expand All @@ -95,16 +109,21 @@ jobs:
pattern: junit_report-*
merge-multiple: true
- uses: actions/setup-python@v6
if: runner.environment != 'self-hosted'
with:
python-version: '3.11.4'
- name: Install Python requirements
if: runner.environment != 'self-hosted'
run: pip install --requirement requirements.txt
- name: merge reports
run: junitparser merge *.xml junit_interoperability_report.xml
- name: Generate xlsx report
run: python3 generate_xlsx_report.py --input junit_interoperability_report.xml --output interoperability_report.xlsx
- name: XUnit
run: npx xunit-viewer --results=./junit_interoperability_report.xml --output=./index.html
- name: Generate report files
run: |
if [ "$RUNNER_ENVIRONMENT" = "self-hosted" ]; then
./run_in_docker.sh ./generate_reports.sh
else
python3 -m junitparser merge *.xml junit_interoperability_report.xml
python3 generate_xlsx_report.py --input junit_interoperability_report.xml --output interoperability_report.xlsx
npx xunit-viewer --results=./junit_interoperability_report.xml --output=./index.html
fi
- name: Download timestamp
uses: actions/download-artifact@v8
with:
Expand Down
Loading