name: CI test and publish Docker image

on:
  push:
    branches:
      - master
      - dev
  pull_request:
    branches:
      - master
      - dev

jobs:
  test:
    name: Run Tests
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20, 22, 24]
        mongodb-version: [4.4, 5.0, 6.0]
    env:
      # Temporary: Allow Node 20 until branch protection rules are updated
      # See: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
      ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true

    steps:
      - name: Git Checkout
        uses: actions/checkout@v3

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

      - name: Start MongoDB ${{ matrix.mongodb-version }}
        uses: supercharge/mongodb-github-action@1.3.0
        with:
          mongodb-version: ${{ matrix.mongodb-version }}

      - name: Install dependencies
        run: npm install
      - name: Run Tests
        run: npm run-script test-ci
      - name: Send Coverage
        run: npm run-script coverage

  publish:
    name: Publish to Docker Hub
    needs: test
    runs-on: ubuntu-latest
    if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev') && github.repository_owner == 'nightscout'
    env:
      DOCKER_IMAGE: nightscout/cgm-remote-monitor
      PLATFORMS: linux/amd64,linux/arm64
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}
      - name: Clean git Checkout
        if: success()
        uses: actions/checkout@v3
      - name: Build, tag and push the dev Docker image
        if: success() && github.ref == 'refs/heads/dev'
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          no-cache: true
          platforms: ${{ env.PLATFORMS }}
          tags: |
            ${{ env.DOCKER_IMAGE }}:dev_${{ github.sha }}
            ${{ env.DOCKER_IMAGE }}:latest_dev

      - name: Get Nightscout release version
        if: success() && github.ref == 'refs/heads/master'
        id: package-version
        uses: martinbeentjes/npm-get-version-action@master
      - name: Build, tag and push the master Docker image
        if: success() && github.ref == 'refs/heads/master'
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          no-cache: true
          platforms: ${{ env.PLATFORMS }}
          tags: |
            ${{ env.DOCKER_IMAGE }}:${{ steps.package-version.outputs.current-version }}
            ${{ env.DOCKER_IMAGE }}:latest
