Skip to content

UIIN-2860: Include mod-search permissions to "Inventory: Module is en… #101

UIIN-2860: Include mod-search permissions to "Inventory: Module is en…

UIIN-2860: Include mod-search permissions to "Inventory: Module is en… #101

# This workflow will do a clean install of node dependencies, build the source code,
# run unit tests, perform a SonarCloud scan and publish NPM package ONLY on a tagged 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 (root SQ directory to scan relative to top-level directory)
# - 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:
github-actions-ci:
if : ${{ startsWith(github.ref, 'refs/tags/v') }}
env:
YARN_TEST_OPTIONS: ''
SQ_ROOT_DIR: './src'
COMPILE_TRANSLATION_FILES: 'true'
PUBLISH_MOD_DESCRIPTOR: '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/'
BIGTEST_JUNIT_OUTPUT_DIR: 'artifacts/runTest'
BIGTEST_COVERAGE_REPORT_DIR: 'artifacts/coverage/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@v2
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: Publish Jest unit test results
uses: docker://ghcr.io/enricomi/publish-unit-test-result-action:v1
if: always()
with:
github_token: ${{ github.token }}
files: "${{ env.JEST_JUNIT_OUTPUT_DIR }}/*.xml"
check_name: Jest Unit Test Results
comment_mode: update last
comment_title: Jest Unit Test Statistics
- name: Publish Jest coverage report
uses: actions/upload-artifact@v2
if: always()
with:
name: jest-coverage-report
path: ${{ env.JEST_COVERAGE_REPORT_DIR }}
retention-days: 30
- name: Publish BigTest unit test results
uses: docker://ghcr.io/enricomi/publish-unit-test-result-action:v1
if: always()
with:
github_token: ${{ github.token }}
files: "${{ env.BIGTEST_JUNIT_OUTPUT_DIR }}/*.xml"
check_name: BigTest Unit Test Results
comment_mode: update last
comment_title: BigTest Unit Test Statistics
- name: Publish BigTest coverage report
uses: actions/upload-artifact@v2
if: always()
with:
name: bigtest-coverage-report
path: ${{ env.BIGTEST_COVERAGE_REPORT_DIR }}
retention-days: 30
- name: Publish yarn.lock
uses: actions/upload-artifact@v2
if: failure()
with:
name: yarn.lock
path: yarn.lock
retention-days: 5
- 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@v2
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 }}