Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GitHub #5

Merged
merged 1 commit into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 231 additions & 0 deletions .github/workflows/build-npm-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
# 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: 'false'
COMPILE_TRANSLATION_FILES: 'false'
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: actions/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@v2
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 }}

Loading
Loading