Skip to content

Merge pull request #50 from GoCodeAlone/dependabot/go_modules/github.… #151

Merge pull request #50 from GoCodeAlone/dependabot/go_modules/github.…

Merge pull request #50 from GoCodeAlone/dependabot/go_modules/github.… #151

Workflow file for this run

name: Modules CI
on:
push:
branches: [ main ]
paths:
- 'modules/**'
- 'go.*'
- '.github/workflows/modules-ci.yml'
pull_request:
branches: [ main ]
paths:
- 'modules/**'
- 'go.*'
- '.github/workflows/modules-ci.yml'
# Allow manual trigger
workflow_dispatch:
env:
GO_VERSION: '^1.23.5'
jobs:
# This job identifies which modules have been modified
detect-modules:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
modules: ${{ steps.set-matrix.outputs.modules }}
steps:
- name: Checkout code
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Get modified modules
id: set-matrix
run: |
# Get all module directories
ALL_MODULES=$(find modules -maxdepth 1 -mindepth 1 -type d -exec basename {} \; | sort)
# Default to running all modules on main branch or if workflow_dispatch is used
if [[ "${{ github.event_name }}" == "workflow_dispatch" || "${{ github.ref }}" == "refs/heads/main" ]]; then
MODIFIED_MODULES=$ALL_MODULES
else
# For pull requests, check which modules were modified
BASE_SHA=$(git merge-base origin/main HEAD)
# Get modified files
MODIFIED_FILES=$(git diff --name-only $BASE_SHA HEAD)
# Check if go.mod or go.sum were modified
if echo "$MODIFIED_FILES" | grep -E '^go\.(mod|sum)$'; then
# Run all modules if go.mod or go.sum were modified
MODIFIED_MODULES=$ALL_MODULES
else
# Otherwise, determine which modules were modified
MODIFIED_MODULES=""
for MODULE in $ALL_MODULES; do
if echo "$MODIFIED_FILES" | grep -q "^modules/$MODULE/"; then
MODIFIED_MODULES="$MODIFIED_MODULES $MODULE"
fi
done
# If no specific modules were modified, run for all modules
if [ -z "$MODIFIED_MODULES" ]; then
MODIFIED_MODULES=$ALL_MODULES
fi
fi
fi
# Format for matrix - filter out empty entries
MODULES_JSON=$(echo "$MODIFIED_MODULES" | tr ' ' '\n' | grep -v '^$' | jq -R . | jq -s .)
{
echo "matrix<<EOF"
echo "{\"module\":$MODULES_JSON}"
echo "EOF"
} >> $GITHUB_OUTPUT
{
echo "modules<<EOF"
echo "$MODULES_JSON"
echo "EOF"
} >> $GITHUB_OUTPUT
echo "Modules to test: $MODULES_JSON"
# This job runs the tests for each module
test-modules:
needs: detect-modules
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.detect-modules.outputs.matrix)}}
continue-on-error: true
name: Test ${{ matrix.module }}
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
check-latest: true
cache: true
- name: Get dependencies
working-directory: modules/${{ matrix.module }}
run: |
go mod download
go mod verify
- name: Run tests for ${{ matrix.module }}
id: test
working-directory: modules/${{ matrix.module }}
continue-on-error: true
run: |
if go test -v ./... -coverprofile=${{ matrix.module }}-coverage.txt -covermode=atomic; then
echo "result=success" >> $GITHUB_OUTPUT
echo "::notice title=Test Result for ${{ matrix.module }}::Tests passed"
else
echo "result=failure" >> $GITHUB_OUTPUT
echo "::error title=Test Result for ${{ matrix.module }}::Tests failed"
exit 1
fi
- name: Run BDD tests explicitly for ${{ matrix.module }}
working-directory: modules/${{ matrix.module }}
continue-on-error: true
run: |
echo "Running BDD tests for ${{ matrix.module }} module..."
go test -v -run ".*BDD|.*Module" . || echo "No BDD tests found for ${{ matrix.module }}"
- name: Upload coverage for ${{ matrix.module }}
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: GoCodeAlone/modular
directory: modules/${{ matrix.module }}/
files: ${{ matrix.module }}-coverage.txt
flags: ${{ matrix.module }}
# This job ensures each module can build properly
verify-modules:
needs: detect-modules
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.detect-modules.outputs.matrix)}}
continue-on-error: true
name: Verify ${{ matrix.module }}
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
check-latest: true
cache: true
- name: Get dependencies
working-directory: modules/${{ matrix.module }}
run: |
go mod download
go mod verify
- name: Verify ${{ matrix.module }}
id: verify
continue-on-error: true
working-directory: modules/${{ matrix.module }}
run: |
if go list -e ./... && go vet ./...; then
echo "result=success" >> $GITHUB_OUTPUT
echo "::notice title=Verify Result for ${{ matrix.module }}::Verification passed"
else
echo "result=failure" >> $GITHUB_OUTPUT
echo "::error title=Verify Result for ${{ matrix.module }}::Verification failed"
exit 1
fi
# Lint runs on all modules together for efficiency
lint-modules:
runs-on: ubuntu-latest
needs: detect-modules
strategy:
fail-fast: false
matrix: ${{fromJson(needs.detect-modules.outputs.matrix)}}
continue-on-error: true
name: Lint ${{ matrix.module }}
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache-dependency-path: modules/${{ matrix.module }}/go.sum
- name: golangci-lint
id: lint
continue-on-error: true
uses: golangci/golangci-lint-action@v8
with:
version: latest
only-new-issues: true
working-directory: modules/${{ matrix.module }}
args: -c ../../.golangci.github.yml
- name: Set lint result
run: |
if [ "${{ steps.lint.outcome }}" = "success" ]; then
echo "result=success" >> $GITHUB_OUTPUT
echo "::notice title=Lint Result for ${{ matrix.module }}::Linting passed"
else
echo "result=failure" >> $GITHUB_OUTPUT
echo "::error title=Lint Result for ${{ matrix.module }}::Linting failed"
fi
# This job summarizes the results
modules-summary:
needs: [test-modules, verify-modules, lint-modules, detect-modules]
if: always()
runs-on: ubuntu-latest
steps:
- name: Summary
run: |
echo "# Module Test Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
test_result="${{ needs.test-modules.result }}"
verify_result="${{ needs.verify-modules.result }}"
lint_result="${{ needs.lint-modules.result }}"
# Show overall status
echo "## Overall Status" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Job Type | Status |" >> $GITHUB_STEP_SUMMARY
echo "|----------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Tests | $test_result |" >> $GITHUB_STEP_SUMMARY
echo "| Verification | $verify_result |" >> $GITHUB_STEP_SUMMARY
echo "| Linting | $lint_result |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Show modules tested
echo "**Modules processed:** $(echo '${{ needs.detect-modules.outputs.modules }}' | jq -r '. | join(", ")')" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Provide guidance
echo "## How to Interpret Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "$test_result" != "success" ] || [ "$verify_result" != "success" ] || [ "$lint_result" != "success" ]; then
echo "❌ **Some checks failed.** Check the individual job logs above to see which specific modules failed." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- Look for jobs with ❌ or red status indicators" >> $GITHUB_STEP_SUMMARY
echo "- Click on failed jobs to see detailed error messages" >> $GITHUB_STEP_SUMMARY
echo "- Each module is tested independently" >> $GITHUB_STEP_SUMMARY
else
echo "✅ **All checks passed!** All modules successfully completed testing, verification, and linting." >> $GITHUB_STEP_SUMMARY
fi
# Comprehensive BDD test execution across all modules
bdd-tests:
needs: detect-modules
runs-on: ubuntu-latest
name: BDD Tests Summary
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
check-latest: true
cache: true
- name: Run comprehensive BDD tests
run: |
echo "# BDD Test Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Module | BDD Tests Status |" >> $GITHUB_STEP_SUMMARY
echo "|--------|------------------|" >> $GITHUB_STEP_SUMMARY
modules=$(echo '${{ needs.detect-modules.outputs.modules }}' | jq -r '.[]')
for module in $modules; do
cd "modules/$module"
echo "=== Running BDD tests for $module ==="
if go test -v -run ".*BDD|.*Module" . >/dev/null 2>&1; then
echo "| $module | ✅ PASS |" >> $GITHUB_STEP_SUMMARY
else
echo "| $module | ❌ FAIL |" >> $GITHUB_STEP_SUMMARY
fi
cd ../..
done