diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml new file mode 100644 index 0000000..dbc122d --- /dev/null +++ b/.github/actions/setup/action.yaml @@ -0,0 +1,36 @@ +name: Setup action +description: Reusable action to setup node and install packages + +runs: + using: "composite" + steps: + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - uses: pnpm/action-setup@v3 + name: Install pnpm + id: pnpm-install + with: + version: 9 + run_install: false + + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT + shell: bash + + - uses: actions/cache@v4 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: pnpm-store-${{ hashFiles('**/package.json') }} + restore-keys: | + pnpm-store- + + - name: Install dependencies + run: pnpm install + shell: bash diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..3befeee --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,101 @@ +name: build +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +on: + pull_request: + types: + - closed + - opened + - reopened + - synchronize +jobs: + build: + name: Build + runs-on: ubuntu-latest + outputs: + affectedPackages: ${{ steps.get-affected-packages.outputs.packages }} + if: "!(github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == false)" + steps: + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: ./.github/actions/setup + + - name: Get affected packages + id: get-affected-packages + run: echo "packages=$(pnpm exec foundation-get-affected-project-chunks test:js origin/${{github.base_ref}} 4)" >> $GITHUB_OUTPUT + + - name: Compile source files + run: pnpm run build + + - name: Lint affected source files + run: pnpm run lint --filter=[origin/${{github.base_ref}}] + + - name: Get current git commit hash + id: get-git-commit-hash + run: | + echo "gitCommitHash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + + - uses: actions/cache@v4 + id: ts-build-cache + with: + path: | + ./packages/container/libraries/* + ./packages/foundation/tools/* + key: ts-build-${{ steps.get-git-commit-hash.outputs.gitCommitHash }} + restore-keys: | + ts-build-${{ steps.get-git-commit-hash.outputs.gitCommitHash }} + + test-package: + name: Test package + needs: build + runs-on: ubuntu-latest + if: ${{ needs.build.outputs.affectedPackages != '[]' }} + strategy: + matrix: + packages: ${{fromJSON(needs.build.outputs.affectedPackages)}} + steps: + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: ./.github/actions/setup + + - name: Get current git commit hash + id: get-git-commit-hash + run: | + echo "gitCommitHash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + + - uses: actions/cache@v4 + id: ts-build-cache + with: + path: | + ./packages/container/libraries/* + ./packages/foundation/tools/* + key: ts-build-${{ steps.get-git-commit-hash.outputs.gitCommitHash }} + restore-keys: | + ts-build-${{ steps.get-git-commit-hash.outputs.gitCommitHash }} + + - name: Build on cache miss + run: pnpm run build --filter ${{ join(matrix.packages, ' --filter ') }} + if: ${{ !steps.ts-build-cache.outputs.cache-hit }} + + - name: Launch Unit Tests + run: pnpm run test:unit:js --filter ${{ join(matrix.packages, ' --filter ') }} --only + + - name: Launch Integration Tests + run: pnpm run test:integration:js --filter ${{ join(matrix.packages, ' --filter ') }} --only + + done: + name: Done + needs: + - test-package + runs-on: ubuntu-latest + steps: + - run: 'echo "Done!"'