diff --git a/.github/workflows/static-analysis-js.yml b/.github/workflows/static-analysis-js.yml new file mode 100644 index 00000000..bf0dc626 --- /dev/null +++ b/.github/workflows/static-analysis-js.yml @@ -0,0 +1,96 @@ +name: Static code analysis JavaScript + +on: + workflow_call: + inputs: + NPM_REGISTRY_DOMAIN: + description: Domain of the private npm registry. + default: https://npm.pkg.github.com/ + required: false + type: string + NODE_VERSION: + description: Node version with which the static analysis is to be executed. + default: 18 + required: false + type: string + NODE_OPTIONS: + description: Space-separated list of command-line Node options. + type: string + default: '' + required: false + secrets: + NPM_REGISTRY_TOKEN: + description: Authentication for the private npm registry. + required: false + GITHUB_USER_EMAIL: + description: Email address for the GitHub user configuration. + required: false + GITHUB_USER_NAME: + description: Username for the GitHub user configuration. + required: false + GITHUB_USER_SSH_KEY: + description: Private SSH key associated with the GitHub user passed as `GITHUB_USER_NAME`. + required: false + ENV_VARS: + description: Additional environment variables as a JSON formatted object. + required: false + +jobs: + static-analysis-js: + timeout-minutes: 5 + runs-on: ubuntu-latest + env: + NODE_OPTIONS: ${{ inputs.NODE_OPTIONS }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_REGISTRY_TOKEN }} + NODE_CACHE_MODE: '' + GITHUB_USER_EMAIL: ${{ secrets.GITHUB_USER_EMAIL }} + GITHUB_USER_NAME: ${{ secrets.GITHUB_USER_NAME }} + GITHUB_USER_SSH_KEY: ${{ secrets.GITHUB_USER_SSH_KEY }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up custom environment variables + env: + ENV_VARS: ${{ secrets.ENV_VARS }} + if: ${{ env.ENV_VARS }} + uses: actions/github-script@v7 + with: + script: | + JSON + .parse(process.env.ENV_VARS) + .forEach(envVar => core.exportVariable(envVar.name, envVar.value)); + + - name: Set up SSH + if: ${{ env.GITHUB_USER_SSH_KEY != '' }} + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ env.GITHUB_USER_SSH_KEY }} + + - name: Set up Git + run: | + git config --global user.email "${{ env.GITHUB_USER_EMAIL }}" + git config --global user.name "${{ env.GITHUB_USER_NAME }}" + + - name: Set up node cache mode + run: | + if [ -f "${GITHUB_WORKSPACE}/package-lock.json" ] || [ -f "${GITHUB_WORKSPACE}/npm-shrinkwrap.json" ]; then + echo "NODE_CACHE_MODE=npm" >> $GITHUB_ENV + else + echo "No lock files found" + fi + + - name: Set up node + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.NODE_VERSION }} + registry-url: ${{ inputs.NPM_REGISTRY_DOMAIN }} + cache: ${{ env.NODE_CACHE_MODE }} + + - name: Install dependencies + env: + ARGS: ${{ env.NODE_CACHE_MODE == 'npm' && 'ci' || 'install' }} + run: ${{ format('npm {0}', env.ARGS) }} + + - name: Run tsc + run: ./node_modules/.bin/tsc --noEmit --skipLibCheck --pretty false diff --git a/docs/js.md b/docs/js.md index 67cadb43..e663b2cd 100644 --- a/docs/js.md +++ b/docs/js.md @@ -1,3 +1,5 @@ + + # Reusable workflows – JavaScript ## Unit tests JavaScript @@ -56,3 +58,58 @@ jobs: NODE_VERSION: 14 JEST_ARGS: 'my-test --reporters=jest-junit --coverage' ``` + +## Static analysis JavaScript + +This workflow runs +the [TypeScript compiler](https://www.typescriptlang.org/docs/handbook/compiler-options.html) with +the `--noEmit` argument. It does so by executing the `tsc` binary in the `./node_modules/.bin/` +folder. + +**Simplest possible example:** + +```yml +name: Static code analysis JavaScript +on: + push: +jobs: + static-analysis-js: + uses: inpsyde/reusable-workflows/.github/workflows/static-analysis-js.yml@main +``` + +### Configuration parameters + +#### Inputs + +| Name | Default | Description | +|-----------------------|---------------------------------|-----------------------------------------------------| +| `NODE_OPTIONS` | `''` | Space-separated list of command-line Node options | +| `NODE_VERSION` | `18` | Node version with which the assets will be compiled | +| `NPM_REGISTRY_DOMAIN` | `'https://npm.pkg.github.com/'` | Domain of the private npm registry | + +#### Secrets + +| Name | Description | +|-----------------------|------------------------------------------------------------------------------| +| `NPM_REGISTRY_TOKEN` | Authentication for the private npm registry | +| `GITHUB_USER_EMAIL` | Email address for the GitHub user configuration | +| `GITHUB_USER_NAME` | Username for the GitHub user configuration | +| `GITHUB_USER_SSH_KEY` | Private SSH key associated with the GitHub user passed as `GITHUB_USER_NAME` | +| `ENV_VARS` | Additional environment variables as a JSON formatted object | + +**Example with configuration parameters:** + +```yml +name: Static code analysis JavaScript +on: + pull_request: +jobs: + static-analysis-js: + uses: inpsyde/reusable-workflows/.github/workflows/static-analysis-js.yml@main + secrets: + NPM_REGISTRY_TOKEN: ${{ secrets.NPM_REGISTRY_TOKEN }} + ENV_VARS: >- + [{"name":"EXAMPLE_USERNAME", "value":"${{ secrets.USERNAME }}"}] + with: + NODE_VERSION: 18 +```