JavaScript and Node.js

This guide will help you get started with a JavaScript project on Semaphore. If you’re new to Semaphore please read our Guided tour first.

Table of contents:

Hello world

# .semaphore/semaphore.yml
version: v1.0
name: JavaScript example
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Hello world
    task:
      jobs:
        - name: Run some code
          commands:
            - node -p '"evol".split("").reverse().join("")'

Example project with Node.js, TypeScript and React

Semaphore provides a tutorial and demo application with a working CI pipeline that you can use to get started quickly:

Supported Node.js versions

Node.js is available out-of-the-box on Semaphore via Linux and macOS operating system images. See these pages for details on currently available versions and additional tools that are available.

You can also run JavaScript projects by defining a Docker-based Semaphore agent.

On Linux, Semaphore uses nvm to manage Node.js versions. Any version installable with nvm is supported by Semaphore. By default, version 8.11 of Node.js is pre-installed on the Semaphore VM.

The version of Node.js that will be used can be set from a .nvmrc file if such a file exists in your repository. If you want to make use of the .nvmrc file you will need to run nvm use so you can actually tell nvm to set the node version specified within the .nvmrc file.

Alternatively, you can change the Node.js version by calling sem-version node. Here's an example:

blocks:
  - name: Tests
    task:
      prologue:
        commands:
          - sem-version node 10.13.0
      jobs:
        - name: Tests
          commands:
            - node --version

If you need a version other than the preinstalled versions, then you can install it with nvm. Here's an example:

blocks:
  - name: Tests
    task:
      prologue:
        commands:
          - nvm install --lts carbon
          - sem-version node --lts carbon
      jobs:
        - name: Tests
          commands:
            - node --version

Dependency caching

You can use Semaphores cache command to store and load node_modules. In the following configuration example, we install dependencies and warm the cache in the first block, then use the cache in subsequent blocks.

version: v1.0
name: First pipeline example
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804

blocks:
  - name: Install dependencies
    task:
      jobs:
        - name: npm install and cache
          commands:
            - checkout
            - cache restore node-modules-$SEMAPHORE_GIT_BRANCH-$(checksum package-lock.json),node-modules-$SEMAPHORE_GIT_BRANCH,node-modules-master
            - npm install
            - cache store node-modules-$SEMAPHORE_GIT_BRANCH-$(checksum package-lock.json) node_modules

  - name: Tests
    task:
      prologue:
        commands:
          - checkout
          - cache restore node-modules-$SEMAPHORE_GIT_BRANCH-$(checksum package-lock.json),node-modules-$SEMAPHORE_GIT_BRANCH,node-modules-master
      jobs:
        - name: Everything
          commands:
            - npm test

If you need to clear cache for your project, launch a debug session and execute cache clear or cache delete <key>.

Yarn is supported

Besides NPM, Semaphore also supports Yarn for managing Node.js dependencies.

To get started, use the configuration example above and replace package-lock.json with yarn.lock.

Environment Variables

Semaphore doesn't set language specific environment variables like NODE_ENV You should set these at the task level.

blocks:
  - name: Tests
    task:
      env_vars:
        - name: NODE_ENV
          value: test
      jobs:
        - name: Everything
          commands:
            - npm test

Browser testing

Install the selenium-webdriver library and it should work out of the box, same goes for higher level libraries that leverage Selenium. See the official Node examples.

Refer to the Ubuntu image reference for details on pre-installed browsers and testing tools on Semaphore.

Still need help? Contact Us Contact Us