Pārlūkot izejas kodu

add new build workflow

Martin Melik Merkumians 1 mēnesi atpakaļ
vecāks
revīzija
3e0999ecf2
1 mainītis faili ar 149 papildinājumiem un 0 dzēšanām
  1. 149 0
      .github/workflows/build.yml

+ 149 - 0
.github/workflows/build.yml

@@ -0,0 +1,149 @@
+name: Build, Lint & Coverage
+
+on:
+  push:
+    branches: [ "master" ]
+  pull_request:
+    branches: [ "master" ]
+
+env:
+  BUILD_TYPE: Release
+
+jobs:
+  # Linting job with MegaLinter
+  megalinter:
+    name: MegaLinter
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      issues: write
+      pull-requests: write
+    
+    steps:
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3
+        with:
+          fetch-depth: 0
+
+      - name: MegaLinter
+        uses: oxsecurity/megalinter@62c799d895af9bcbca5eacfebca29d527f125a57
+        env:
+          VALIDATE_ALL_CODEBASE: true
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          # Use C/C++ flavor for faster execution
+          MEGALINTER_FLAVOR: c_cpp
+          # Enable specific linters you want
+          ENABLE_LINTERS: C_CPPLINT,C_CPPCHECK,C_CLANG_FORMAT
+          # Optional: disable linters you don't need
+          DISABLE_LINTERS: SPELL_CSPELL
+          # Fail on errors (set to false if you want warnings only)
+          DISABLE_ERRORS: false
+
+      - name: Archive MegaLinter reports
+        if: always()
+        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
+        with:
+          name: megalinter-reports
+          path: |
+            megalinter-reports
+            mega-linter.log
+
+  # Build, test and coverage job
+  build-and-test:
+    name: Build, Test & Coverage
+    runs-on: ubuntu-latest
+    needs: megalinter
+    if: success() || failure()
+
+    steps:
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3
+        with:
+          fetch-depth: 0
+
+      - name: Install dependencies
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y \
+            libcap-dev \
+            lcov \
+            cpputest
+
+      - name: Set up Python for gcovr
+        uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548
+        with: 
+          python-version: '3.11'
+
+      - name: Install gcovr
+        run: pip install gcovr==5.0
+
+      - name: Configure CMake
+        run: |
+          cmake -S ${{github.workspace}}/source \
+            -B ${{github.workspace}}/build \
+            -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
+            -DOpENer_PLATFORM:STRING="POSIX" \
+            -DBUILD_SHARED_LIBS:BOOL=OFF \
+            -DOpENer_TRACES:BOOL=OFF \
+            -DOpENer_TESTS:BOOL=ON \
+            -DCPPUTEST_HOME:PATH=/usr
+
+      - name: Build
+        run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
+
+      - name: Test
+        working-directory: ${{github.workspace}}/build
+        run: ctest -C ${{env.BUILD_TYPE}} --output-on-failure
+
+      - name: Generate coverage reports
+        run: |
+          # Generate HTML report for human viewing
+          gcovr --html-details --output coverage-report.html
+          
+          # Generate Cobertura XML for tools/badges
+          gcovr --cobertura --output coverage.xml
+          
+          # Generate text summary for console
+          gcovr --print-summary > coverage-summary.txt
+          
+          # Print summary to console
+          echo "Coverage Summary:"
+          cat coverage-summary.txt
+
+      - name: Upload coverage reports
+        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
+        with:
+          name: coverage-report
+          path: |
+            coverage-report.html
+            coverage-report.*.html
+            coverage.xml
+            coverage-summary.txt
+
+      - name: Create coverage summary comment
+        if: github.event_name == 'pull_request'
+        uses: actions/github-script@v7
+        with:
+          script: |
+            const fs = require('fs');
+            const summary = fs.readFileSync('coverage-summary.txt', 'utf8');
+            const comment = `## 📊 Coverage Report\n\n\`\`\`\n${summary}\n\`\`\`\n\nDownload the [detailed HTML report](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) from the artifacts.`;
+            
+            github.rest.issues.createComment({
+              issue_number: context.issue.number,
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              body: comment
+            });
+
+      - name: Generate coverage badge
+        if: github.ref == 'refs/heads/master'
+        run: |
+          # Extract coverage percentage
+          COVERAGE=$(gcovr --print-summary | grep 'lines:' | awk '{print $2}')
+          echo "COVERAGE_PERCENTAGE=$COVERAGE" >> $GITHUB_ENV
+          echo "Coverage: $COVERAGE"
+
+      - name: Upload build artifacts
+        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
+        with:
+          name: build-artifacts
+          path: ${{github.workspace}}/build