Merge pull request #74 from folio-org/UIREQMED-62 #2
Workflow file for this run
This file contains 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
# This workflow will do a clean install of node dependencies, build the source code, | |
# run unit tests, and perform a SonarCloud scan ONLY on a `release`. | |
# For more information see: | |
# https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions | |
# Common FOLIO configurable env: | |
# - YARN_TEST_OPTIONS (options to pass to 'yarn test') | |
# - SQ_ROOT_DIR (where to scan relative to top-level directory) | |
# - FOLIO_NAME | |
# - PUBLISH_MOD_DESCRIPTOR (boolean 'true' or 'false') | |
# - COMPILE_TRANSLATION_FILES (boolean 'true' or 'false') | |
name: buildNPM Release | |
on: | |
push: | |
tags: | |
- 'v[0-9]+.[0-9]+.[0-9]+*' | |
workflow_dispatch: | |
jobs: | |
build-npm-release: | |
if : ${{ startsWith(github.ref, 'refs/tags/v') }} | |
env: | |
YARN_TEST_OPTIONS: '--ci --coverage --colors' | |
SQ_ROOT_DIR: './src' | |
PUBLISH_MOD_DESCRIPTOR: 'true' | |
COMPILE_TRANSLATION_FILES: 'true' | |
FOLIO_NPM_REGISTRY: 'https://repository.folio.org/repository/npm-folio/' | |
FOLIO_NPM_REGISTRY_AUTH: '//repository.folio.org/repository/npm-folio/' | |
FOLIO_MD_REGISTRY: 'https://folio-registry.dev.folio.org' | |
NODEJS_VERSION: '18' | |
JEST_JUNIT_OUTPUT_DIR: 'artifacts/jest-junit' | |
JEST_COVERAGE_REPORT_DIR: 'artifacts/coverage-jest/lcov-report/' | |
OKAPI_PULL: '{ "urls" : [ "https://folio-registry.dev.folio.org" ] }' | |
SQ_LCOV_REPORT: 'artifacts/coverage-jest/lcov.info' | |
SQ_EXCLUSIONS: '**/platform/alias-service.js,**/docs/**,**/node_modules/**,**/examples/**,**/artifacts/**,**/ci/**,Jenkinsfile,**/LICENSE,**/*.css,**/*.md,**/*.json,**/tests/**,**/stories/*.js,**/test/**,**/.stories.js,**/resources/bigtest/interactors/**,**/resources/bigtest/network/**,**/*-test.js,**/*.test.js,**/*-spec.js,**/karma.conf.js,**/jest.config.js' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: folio-org/checkout@v2 | |
with: | |
fetch-depth: 0 | |
# Runs a single command using the runners shell | |
- name: Print tag info | |
run: echo "Building release tag, ${GITHUB_REF}" | |
- name: Set TAG_VERSION | |
run: echo "TAG_VERSION=$(echo ${GITHUB_REF#refs/tags/v})" >> $GITHUB_ENV | |
- name: Get version from package.json | |
id: package_version | |
uses: notiz-dev/github-action-json-property@release | |
with: | |
path: 'package.json' | |
prop_path: 'version' | |
- name: Check matching tag and version in package.json | |
if: ${{ env.TAG_VERSION != steps.package_version.outputs.prop }} | |
run: | | |
echo "Tag version, ${TAG_VERSION}, does not match package.json version, ${PACKAGE_VERSION}." | |
exit 1 | |
env: | |
PACKAGE_VERSION: ${{ steps.package_version.outputs.prop }} | |
- name: Setup kernel for react native, increase watchers | |
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ env.NODEJS_VERSION }} | |
check-latest: true | |
always-auth: true | |
- name: Set yarn config | |
run: yarn config set @folio:registry $FOLIO_NPM_REGISTRY | |
- name: Run yarn install | |
run: yarn install --ignore-scripts | |
- name: Run yarn list | |
run: yarn list --pattern @folio | |
- name: Run yarn lint | |
run: yarn lint | |
continue-on-error: true | |
- name: Get number of CPU cores | |
id: cpu-cores | |
uses: SimenB/github-actions-cpu-cores@v1 | |
- name: Run yarn test | |
run: xvfb-run --server-args="-screen 0 1024x768x24" yarn test $YARN_TEST_OPTIONS --max-workers ${{ steps.cpu-cores.outputs.count }} | |
- name: Run yarn formatjs-compile | |
if : ${{ env.COMPILE_TRANSLATION_FILES == 'true' }} | |
run: yarn formatjs-compile | |
- name: Generate FOLIO module descriptor | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
run: yarn build-mod-descriptor | |
- name: Print FOLIO module descriptor | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
run: cat module-descriptor.json | |
- name: Read module descriptor | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
id: moduleDescriptor | |
uses: juliangruber/read-file-action@v1 | |
with: | |
path: ./module-descriptor.json | |
- name: Docker registry login | |
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login https://docker.io/v2/ -u "${{ secrets.DOCKER_USER }}" --password-stdin | |
- name: Start a local instance of Okapi | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
run: | | |
docker pull folioorg/okapi:latest | |
docker run --name okapi -t -detach folioorg/okapi:latest dev | |
echo "OKAPI_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' okapi)" >> $GITHUB_ENV | |
sleep 10 | |
- name: Pull all Module descriptors to local Okapi instance | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
uses: fjogeleit/http-request-action@master | |
with: | |
url: http://${{ env.OKAPI_IP }}:9130/_/proxy/pull/modules | |
method: 'POST' | |
contentType: 'application/json; charset=utf-8' | |
customHeaders: '{ "Accept": "application/json; charset=utf-8" }' | |
data: ${{ env.OKAPI_PULL }} | |
timeout: 60000 | |
- name: Perform local Okapi dependency check | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
uses: fjogeleit/http-request-action@master | |
with: | |
url: http://${{ env.OKAPI_IP }}:9130/_/proxy/modules?preRelease=false&npmSnapshot=false | |
method: 'POST' | |
contentType: 'application/json; charset=utf-8' | |
customHeaders: '{ "Accept": "application/json; charset=utf-8" }' | |
data: ${{ steps.moduleDescriptor.outputs.content }} | |
- name: Upload event file | |
uses: actions/upload-artifact@v3 | |
with: | |
name: Event File | |
path: ${{ github.event_path }} | |
retention-days: 30 | |
- name: Upload Jest results | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: jest-test-results | |
path: ${{ env.JEST_JUNIT_OUTPUT_DIR }}/*.xml | |
retention-days: 30 | |
- name: Publish Jest coverage report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: jest-coverage-report | |
path: ${{ env.JEST_COVERAGE_REPORT_DIR }} | |
retention-days: 30 | |
- name: Set default branch as env variable | |
run: echo "DEFAULT_BRANCH=${{ github.event.repository.default_branch }}" >> $GITHUB_ENV | |
- name: Fetch branches for SonarCloud | |
run: git fetch --no-tags ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY} +refs/heads/${{ env.DEFAULT_BRANCH }}:refs/remotes/origin/${{ env.DEFAULT_BRANCH }} | |
- name: Run SonarCloud scan | |
uses: sonarsource/sonarcloud-github-action@master | |
with: | |
args: > | |
-Dsonar.organization=folio-org | |
-Dsonar.projectKey=org.folio:${{ github.event.repository.name }} | |
-Dsonar.projectName=${{ github.event.repository.name }} | |
-Dsonar.sources=${{ env.SQ_ROOT_DIR }} | |
-Dsonar.language=js | |
-Dsonar.javascript.lcov.reportPaths=${{ env.SQ_LCOV_REPORT }} | |
-Dsonar.exclusions=${{ env.SQ_EXCLUSIONS }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
- name: Set up NPM environment for publishing | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ env.NODEJS_VERSION }} | |
check-latest: true | |
always-auth: true | |
- name: Set _auth in .npmrc | |
run: | | |
npm config set @folio:registry $FOLIO_NPM_REGISTRY | |
npm config set $FOLIO_NPM_REGISTRY_AUTH:_auth $NODE_AUTH_TOKEN | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Exclude some CI-generated artifacts in package | |
run: | | |
echo "artifacts" >> .npmignore | |
echo ".github" >> .npmignore | |
echo ".scannerwork" >> .npmignore | |
cat .npmignore | |
- name: Publish NPM to FOLIO NPM registry | |
run: npm publish | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Publish module descriptor to FOLIO registry | |
if: ${{ env.PUBLISH_MOD_DESCRIPTOR == 'true' }} | |
id: modDescriptorPost | |
uses: fjogeleit/http-request-action@master | |
with: | |
url: ${{ env.FOLIO_MD_REGISTRY }}/_/proxy/modules | |
method: 'POST' | |
contentType: 'application/json; charset=utf-8' | |
customHeaders: '{ "Accept": "application/json; charset=utf-8" }' | |
data: ${{ steps.moduleDescriptor.outputs.content }} | |
username: ${{ secrets.FOLIO_REGISTRY_USERNAME }} | |
password: ${{ secrets.FOLIO_REGISTRY_PASSWORD }} | |