Stream of Consciousness

Mark Eschbach's random writings on various topics.

Exploring Github Actions && Local Validation

Categories: programming

Tags: continuous-delivery github-actions

Recently I released erraform-provider-twsaws which used Github Actions as a release platform based on the Hashicorp’s recommended provider release methods. Well, today I was asked to build out continuous delivery and continuous integration for an internal TypeScript project running on Node.

Just getting my toes wet in the pool, my current understanding of Github Action’s is:

  • It’s a workflow engine specialized in code management. There can be several input triggers.
  • Steps appear to be something similar to Docker containers which work against a shared volume.

There has been decent thought given to how these would work and overall pretty straight forward. Workflows are placed into .github/workflows defining the actions.

Testing a Github Actions

Ideally one would be able to test much fo the workflows before pushing up. The Github Actions community does not disappoint: Act does exactly that. (Insert mutterings about need HomeBrew for a Go Program)

Behind the scenes this drives Docker to run the Actions in your local Docker instance. My first shot of a pipeline looked like the following:

name: Unit Tests Pull Requests

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x]

    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - run: yarn install --frozen-lockfile
      - run: yarn tsc index.ts

This failed to run with act pull_request due to yarn not being found. Wrong container? From the debug output the container downloads and installs the most recent version of Node 16 into a step. Checking various versions this seems to not be the case. Switching to actions/setup-node@v1 also did not resolve the issue. According this blog yarn needs to be installed in a separate step.

This definitely was the missing step. A bit unfortunate this is installed very time. I think my understanding of the steps might be a little flawed: actions/setup-node@v2 appears to actually install Node into the sandbox environment instead of providing extensions to it. Anyway, here is the Github Actions file I found myself with:

name: Unit Tests Pull Requests

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x]

    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm install -g
      - run: yarn install --frozen-lockfile
      - run: yarn tsc index.ts

This can be checked against a TypeScript project with the following: act pull_request.