Add Cache, Scheduler, and EventBus modules for enhanced application capabilities #42
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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@v4 | |
| 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 | |
| MODULES_JSON=$(echo "$MODIFIED_MODULES" | tr ' ' '\n' | 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)}} | |
| name: Test ${{ matrix.module }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - 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 }} | |
| working-directory: modules/${{ matrix.module }} | |
| run: | | |
| go test -v ./... -coverprofile=${{ matrix.module }}-coverage.txt -covermode=atomic | |
| - 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)}} | |
| name: Verify ${{ matrix.module }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - 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 }} | |
| working-directory: modules/${{ matrix.module }} | |
| run: | | |
| # Verify package can be resolved | |
| go list -e ./... | |
| # Run vet to check for issues | |
| go vet ./... | |
| # 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)}} | |
| name: Lint ${{ matrix.module }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-go@v5 | |
| with: | |
| go-version: ${{ env.GO_VERSION }} | |
| cache-dependency-path: modules/${{ matrix.module }}/go.sum | |
| - name: golangci-lint | |
| uses: golangci/golangci-lint-action@v8 | |
| with: | |
| version: latest | |
| only-new-issues: true | |
| working-directory: modules/${{ matrix.module }} | |
| args: -c ../../.golangci.github.yml | |
| # This job summarizes the results | |
| modules-summary: | |
| needs: [test-modules, verify-modules, lint-modules] | |
| if: always() | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Summary | |
| run: | | |
| echo "# Module Test Results" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| Module | Test | Verify | Lint |" >> $GITHUB_STEP_SUMMARY | |
| echo "|--------|------|--------|------|" >> $GITHUB_STEP_SUMMARY | |
| modules=$(echo '${{ needs.detect-modules.outputs.modules }}' | jq -r '.[]') | |
| for module in $modules; do | |
| test_result="${{ needs.test-modules.result }}" | |
| verify_result="${{ needs.verify-modules.result }}" | |
| lint_result="${{ needs.lint-modules.result }}" | |
| echo "| $module | $test_result | $verify_result | $lint_result |" >> $GITHUB_STEP_SUMMARY | |
| done |