mirror of
				https://github.com/XRPLF/clio.git
				synced 2025-11-04 03:45:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
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
 | 
						|
 | 
						|
      disable_cache:
 | 
						|
        description: Whether ccache should be disabled
 | 
						|
        required: false
 | 
						|
        type: boolean
 | 
						|
 | 
						|
      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@v4
 | 
						|
        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@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
						|
        with:
 | 
						|
          disable_ccache: ${{ inputs.disable_cache }}
 | 
						|
 | 
						|
      - name: Setup conan on macOS
 | 
						|
        if: runner.os == 'macOS'
 | 
						|
        shell: bash
 | 
						|
        run: ./.github/scripts/conan/init.sh
 | 
						|
 | 
						|
      - name: Restore cache
 | 
						|
        if: ${{ !inputs.disable_cache }}
 | 
						|
        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@v4
 | 
						|
        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.disable_cache }}
 | 
						|
        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@v4
 | 
						|
        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@v4
 | 
						|
        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@v4
 | 
						|
        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@v4
 | 
						|
        with:
 | 
						|
          name: clio_deb_package_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
						|
          path: build/*.deb
 | 
						|
 | 
						|
      - name: Save cache
 | 
						|
        if: ${{ !inputs.disable_cache && 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
 | 
						|
        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
 | 
						|
  # 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/upload_coverage_report.yml
 | 
						|
    secrets:
 | 
						|
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
 |