name: CI on: [push, pull_request] permissions: contents: read jobs: test: name: Test runs-on: ubuntu-22.04 container: catthehacker/ubuntu:act-latest steps: - uses: actions/checkout@v3 - name: Set up Node uses: actions/setup-node@v4 with: node-version: "20" - run: npm ci - run: npm run typecheck - run: npm run lint - run: npm test - run: npm run build - run: npm pack --dry-run # Публикация только по тегу v*. Тег обязан совпадать с версией в # package.json: иначе в npm уехала бы версия, которой нет в истории тегов. publish: name: Publish to npm needs: test if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-22.04 container: catthehacker/ubuntu:act-latest steps: - uses: actions/checkout@v3 - name: Set up Node uses: actions/setup-node@v4 with: node-version: "20" - run: npm ci - name: Check tag matches package.json version env: REF_NAME: ${{ github.ref_name }} run: | set -eu pkg_version="$(node -p 'require("./package.json").version')" tag_version="${REF_NAME#v}" if [ "$pkg_version" != "$tag_version" ]; then echo "версия package.json ($pkg_version) не совпадает с тегом ($REF_NAME)" >&2 exit 1 fi - run: npm run build # Токен подставляется через env шага, а не в текст команды: подстановка # в run попадает в командную строку процесса и разбирается shell. # Одинарные кавычки — в ~/.npmrc пишется литерал ${NPM_TOKEN}, npm # раскрывает его из окружения сам, и значение не попадает на диск. - name: Publish env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: | set -eu trap 'rm -f ~/.npmrc' EXIT printf '%s\n' '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > ~/.npmrc npm publish --access public - name: Cleanup if: always() run: rm -f ~/.npmrc