# DSpace Continuous Integration/Build via GitHub Actions # Concepts borrowed from # https://docs.github.com/en/free-pro-team@latest/actions/guides/building-and-testing-nodejs name: Build # Run this Build for all pushes / PRs to current branch on: [push, pull_request] jobs: tests: runs-on: ubuntu-latest env: # The ci step will test the dspace-angular code against DSpace REST. # Direct that step to utilize a DSpace REST service that has been started in docker. DSPACE_REST_HOST: localhost DSPACE_REST_PORT: 8080 DSPACE_REST_NAMESPACE: '/server' DSPACE_REST_SSL: false # When Chrome version is specified, we pin to a specific version of Chrome & ChromeDriver # Comment this out to use the latest release of both. CHROME_VERSION: "90.0.4430.212-1" strategy: # Create a matrix of Node versions to test against (in parallel) matrix: node-version: [12.x, 14.x] # Do NOT exit immediately if one matrix job fails fail-fast: false # These are the actual CI steps to perform per job steps: # https://github.com/actions/checkout - name: Checkout codebase uses: actions/checkout@v1 # https://github.com/actions/setup-node - name: Install Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} # If CHROME_VERSION env variable specified above, then pin to that version. # Otherwise, just install latest version of Chrome. - name: Install Chrome (for e2e tests) run: | if [[ -z "${CHROME_VERSION}" ]] then echo "Installing latest stable version" sudo apt-get update sudo apt-get --only-upgrade install google-chrome-stable -y else echo "Installing version ${CHROME_VERSION}" wget -q "https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb" sudo dpkg -i "google-chrome-stable_${CHROME_VERSION}_amd64.deb" fi google-chrome --version # https://github.com/actions/cache/blob/main/examples.md#node---yarn - name: Get Yarn cache directory id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - name: Cache Yarn dependencies uses: actions/cache@v2 with: # Cache entire Yarn cache directory (see previous step) path: ${{ steps.yarn-cache-dir-path.outputs.dir }} # Cache key is hash of yarn.lock. Therefore changes to yarn.lock will invalidate cache key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: ${{ runner.os }}-yarn- - name: Install latest ChromeDriver compatible with installed Chrome # needs to be npm, the --detect_chromedriver_version flag doesn't work with yarn global run: | npm install -g chromedriver --detect_chromedriver_version chromedriver -v - name: Install Yarn dependencies run: yarn install --frozen-lockfile - name: Run lint run: yarn run lint - name: Run build run: yarn run build:prod - name: Run specs (unit tests) run: yarn run test:headless # NOTE: Angular CLI only supports code coverage for specs. See https://github.com/angular/angular-cli/issues/6286 # Upload coverage reports to Codecov (for Node v12 only) # https://github.com/codecov/codecov-action - name: Upload coverage to Codecov.io uses: codecov/codecov-action@v1 if: matrix.node-version == '12.x' # Using docker-compose start backend using CI configuration # and load assetstore from a cached copy - name: Start DSpace REST Backend via Docker (for e2e tests) run: | docker-compose -f ./docker/docker-compose-ci.yml up -d docker-compose -f ./docker/cli.yml -f ./docker/cli.assetstore.yml run --rm dspace-cli docker container ls # Wait until the REST API returns a 200 response (or for a max of 30 seconds) # https://github.com/nev7n/wait_for_response - name: Wait for DSpace REST Backend to be ready (for e2e tests) uses: nev7n/wait_for_response@v1 with: # We use the 'sites' endpoint to also ensure the database is ready url: 'http://localhost:8080/server/api/core/sites' responseCode: 200 timeout: 30000 - name: Get DSpace REST Backend info/properties run: curl http://localhost:8080/server/api - name: Run e2e tests (integration tests) run: | chromedriver --url-base='/wd/hub' --port=4444 & yarn run e2e:ci - name: Shutdown Docker containers run: docker-compose -f ./docker/docker-compose-ci.yml down