name: Reusable build on: workflow_call: inputs: runs_on: description: Runner to run the job on required: true type: string container: description: "The container object as a JSON string (leave empty to run natively)" required: true type: string conan_profile: description: Conan profile to use required: true type: string build_type: description: Build type required: true type: string download_ccache: description: Whether to download ccache from the cache required: false type: boolean default: true upload_ccache: description: Whether to upload ccache to the cache required: false type: boolean default: false code_coverage: description: Whether to enable code coverage required: true type: boolean static: description: Whether to build static binaries required: true type: boolean upload_clio_server: description: Whether to upload clio_server required: true type: boolean targets: description: Space-separated build target names required: true type: string analyze_build_time: description: Whether to enable build time analysis required: true 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: CODECOV_TOKEN: required: false jobs: build: name: Build runs-on: ${{ inputs.runs_on }} container: ${{ inputs.container != '' && fromJson(inputs.container) || null }} steps: - name: Cleanup workspace if: ${{ runner.os == 'macOS' }} uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: 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 uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a with: disable_ccache: ${{ !inputs.download_ccache }} - name: Setup conan on macOS if: ${{ runner.os == 'macOS' }} shell: bash run: ./.github/scripts/conan/init.sh - name: Restore cache if: ${{ inputs.download_ccache }} uses: ./.github/actions/restore-cache id: restore_cache with: conan_profile: ${{ inputs.conan_profile }} ccache_dir: ${{ env.CCACHE_DIR }} build_type: ${{ inputs.build_type }} code_coverage: ${{ inputs.code_coverage }} - name: Run conan uses: ./.github/actions/conan with: conan_profile: ${{ inputs.conan_profile }} build_type: ${{ inputs.build_type }} - name: Run CMake uses: ./.github/actions/cmake with: conan_profile: ${{ inputs.conan_profile }} build_type: ${{ inputs.build_type }} code_coverage: ${{ inputs.code_coverage }} static: ${{ inputs.static }} time_trace: ${{ inputs.analyze_build_time }} package: ${{ inputs.package }} - name: Build Clio uses: ./.github/actions/build-clio with: targets: ${{ inputs.targets }} - name: Show build time analyze report if: ${{ inputs.analyze_build_time }} run: | ClangBuildAnalyzer --all build/ build_time_report.bin ClangBuildAnalyzer --analyze build_time_report.bin > build_time_report.txt cat build_time_report.txt shell: bash - name: Upload build time analyze report if: ${{ inputs.analyze_build_time }} uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: build_time_report_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }} path: build_time_report.txt - name: Show ccache's statistics if: ${{ inputs.download_ccache }} shell: bash id: ccache_stats run: | ccache -s > /tmp/ccache.stats miss_rate=$(cat /tmp/ccache.stats | grep 'Misses' | head -n1 | sed 's/.*(\(.*\)%).*/\1/') echo "miss_rate=${miss_rate}" >> $GITHUB_OUTPUT cat /tmp/ccache.stats - name: Strip unit_tests if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }} run: strip build/clio_tests - name: Strip integration_tests if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }} run: strip build/clio_integration_tests - name: Upload clio_server if: ${{ inputs.upload_clio_server && !inputs.code_coverage && !inputs.analyze_build_time }} uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: clio_server_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }} path: build/clio_server - name: Upload clio_tests if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }} uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }} path: build/clio_tests - name: Upload clio_integration_tests if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }} uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }} path: build/clio_integration_tests - name: Upload Clio Linux package if: ${{ inputs.package }} uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: clio_deb_package_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }} path: build/*.deb - name: Save cache if: ${{ inputs.upload_ccache && github.ref == 'refs/heads/develop' }} uses: ./.github/actions/save-cache with: conan_profile: ${{ inputs.conan_profile }} ccache_dir: ${{ env.CCACHE_DIR }} build_type: ${{ inputs.build_type }} code_coverage: ${{ inputs.code_coverage }} 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: # - source code # - conan packages # - .gcno files in build directory # # It's all available in the build job, but not in the test job - name: Run code coverage if: ${{ inputs.code_coverage }} uses: ./.github/actions/code-coverage - name: Verify expected version if: ${{ inputs.expected_version != '' }} shell: bash env: INPUT_EXPECTED_VERSION: ${{ inputs.expected_version }} run: | set -e EXPECTED_VERSION="clio-${INPUT_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 # To prevent this from happening, we run this action in a separate workflow # # More info: https://github.com/XRPLF/clio/pull/2066 upload_coverage_report: if: ${{ inputs.code_coverage }} name: Codecov needs: build uses: ./.github/workflows/reusable-upload-coverage-report.yml secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}