SpeciesFileGroup/taxonworks

View on GitHub
.github/workflows/deliver.yml

Summary

Maintainability
Test Coverage
name: deliver

on:
  push:
    branches:
      - development
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-*'
  pull_request:
    branches:
      - development
  schedule:
    - cron: '0 0 * * *'

jobs:
  deliver:
    if: |
      !(
        contains(github.event.head_commit.message, '[ci skip]') ||
        contains(github.event.head_commit.message, '[ci-skip]') ||
        contains(github.event.head_commit.message, '[skip ci]') ||
        contains(github.event.head_commit.message, '[skip-ci]')
      )
    env:
      REF_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
      CACHE_PATH: ".github/.docker-cache"

    runs-on: ubuntu-20.04
    steps:
    - name: Get startup date
      id: datetime
      run: echo "year_week=$(date -u +'%Y-%U')" >> $GITHUB_OUTPUT

    - name: Git checkout
      uses: actions/checkout@v4

    - name: Set up Docker images cache
      id: docker_cache
      uses: actions/cache@v4
      with:
        path: .github/.docker-cache
        key: ${{ runner.os }}-docker-${{ steps.datetime.outputs.year_week }}-${{ hashFiles('**/package-lock.json', '**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-docker-${{ steps.datetime.outputs.year_week }}

    - name: Load Docker cache (if cache was hit)
      run: |
        [ ! -f ${CACHE_PATH}/images.tar ] || docker load -i ${CACHE_PATH}/images.tar

    - name: Build the Docker image
      run: docker build . -t sfgrp/taxonworks:latest --build-arg REVISION=$(echo $GITHUB_SHA | cut -c1-9) --build-arg BUNDLER_WORKERS=3

    - name: Run image tests
      run: .github/docker-tests/test.sh

    - name: Wait build workflow to complete successfully
      if: ${{ github.event_name != 'pull_request' }}
      uses: actions/github-script@v7
      with:
        script: |
          const suiteId = (
            await github.rest.checks.listForRef({
              owner: context.repo.owner,
              repo: context.repo.repo,
              ref: process.env.REF_SHA,
              check_name: 'build (0)'
            })
          ).data.check_runs[0].check_suite.id

          const oneMinute = () => {
            return new Promise(resolve => {
              setTimeout(() => resolve(true), 60000)
            })
          }

          let suite, attempts = 20
          do {
            core.info(`Checking suite completed successfully (${attempts} remaining). [check_suite_id = ${suiteId}]`)
            suite = (
              await github.rest.checks.getSuite({
                owner: context.repo.owner,
                repo: context.repo.repo,
                check_suite_id: suiteId
              })
            ).data
          } while(attempts-- && suite.status !== 'completed' && await oneMinute())

          if (suite.conclusion !== 'success') {
            core.setFailed(`Build workflow did not complete successfully. [status = '${suite.status}'; conclusion = '${suite.conclusion}']`);
          }

    - name: Login to DockerHub
      if: ${{ github.event_name != 'pull_request' }}
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Get tag for docker image
      id: docker_tag
      uses: actions/github-script@v7
      with:
        result-encoding: string
        script: |
          return context.ref.startsWith('refs/tags/v') ? context.ref.replace('refs/tags/v', '') : 'latest'

    - name: Push image to DockerHub
      if: ${{ github.event_name != 'pull_request' }}
      env:
        DOCKER_TAG: '${{steps.docker_tag.outputs.result}}'
      run: |
        docker tag sfgrp/taxonworks:latest sfgrp/taxonworks:$DOCKER_TAG
        docker push sfgrp/taxonworks:$DOCKER_TAG

    - name: Save Docker cache (if cache was NOT hit)
      env:
        CACHE_HASH: ${{ hashFiles('**/package-lock.json', '**/Gemfile.lock') }}
      run: |
        mkdir -p $CACHE_PATH
        [ -f ${CACHE_PATH}/${CACHE_HASH} ] || (\
          rm -f ${CACHE_PATH}/images.tar && \
          docker save -o ${CACHE_PATH}/images.tar $(docker history -q sfgrp/taxonworks | grep -v '^<missing>') \
        )
        touch ${CACHE_PATH}/${CACHE_HASH}