cozy-labs/cozy-desktop

View on GitHub
.github/workflows/macos.yaml

Summary

Maintainability
Test Coverage
name: macOS

# To debug a job, add the following step:
# - name: Debug with tmate
#   uses: mxschmitt/action-tmate@v3

on:
  push:
    branches:
      - master
    tags:
      - '**'
  pull_request:
    paths-ignore:
      - '.github/workflows/linux.yaml'

env:
  COZY_DESKTOP_DIR: "${{ github.workspace }}/cozy-desktop"
  COZY_STACK_STORAGE: "${{ github.workspace }}/storage"
  COZY_URL: "http://cozy.localhost:8080"
  COZY_PASSPHRASE: "cozy"
  GO111MODULE: "on"
  NO_BREAKPOINTS: "1"
  NODE_ENV: "test"
  COZY_DESKTOP_HEARTBEAT: "1000"
  DISPLAY: ":99.0"
  NODE_VERSION: "20.15.1"
  GO_VERSION: "1.19"
  COUCHDB_VERSION: "3.2.2"
  COUCHDB_USER: "admin"
  COUCHDB_PASSWORD: "password"
  OS_USERNAME: "${{ secrets.SWIFT_OS_USERNAME }}"
  OS_PASSWORD: "${{ secrets.SWIFT_OS_PASSWORD }}"
  OS_PROJECT_NAME: "${{ secrets.SWIFT_OS_PROJECT_NAME }}"
  OS_REGION_NAME: "GRA"
  OS_USER_DOMAIN_NAME: "Default"
  OS_PROJECT_DOMAIN_NAME: "Default"
  OS_AUTH_URL: "https://auth.cloud.ovh.net/v3"
  OS_IDENTITY_API_VERSION: "3"

jobs:
  cancel:
    name: 'Cancel Previous Runs'
    runs-on: ubuntu-latest
    timeout-minutes: 3
    steps:
      - uses: styfle/cancel-workflow-action@5df4e62aed82ea1f787d2a02ab3dbfcaa49ffdd1

  docker_cache_key:
    name: 'Fetch latest version tag of cozy-app-dev'
    runs-on: ubuntu-latest
    steps:
      - id: cozy-app-dev
        run: |
          version=$(curl -Ls --fail -q "https://hub.docker.com/v2/repositories/cozy/cozy-app-dev/tags/?page_size=1000" | \
              jq '.results | .[] | .name' -r | \
              head -n 2 | tail -1)
          echo "key=docker-${{ runner.os }}-${{ hashFiles('docker-compose.yml') }}-$(echo $version)" >> $GITHUB_OUTPUT
    outputs:
      key: ${{ steps.cozy-app-dev.outputs.key }}

  unit:
    needs: [cancel, docker_cache_key]
    runs-on: macos-13
    name: Unit tests
    strategy:
      matrix:
        fs: ['APFS']
      fail-fast: false
    steps:
      - uses: actions/checkout@v3
      - name: Cache node modules
        id: cache-node-modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: |
            ${{ github.workspace }}/node_modules
            ~/.cache/electron
            ~/.cache/electron-builder
          key: ${{ runner.os }}-v${{ env.NODE_VERSION }}-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
      - name: Setup Docker
        uses: douglascamata/setup-docker-macos-action@v1-alpha
      - name: Install Bash for docker-cache
        id: install-bash
        run: |
          brew install bash
          echo "bash-path=$(brew --prefix)/bin/bash" >> $GITHUB_OUTPUT
      - name: Cache Docker images.
        uses: cozy-labs/docker-cache@0.7.0
        with:
          key: ${{ needs.docker_cache_key.outputs.key }}
          bash: ${{ steps.install-bash.outputs.bash-path }}
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
      - name: Setup golang
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GO_VERSION }}
      - name: Setup python
        run: pip install setuptools
      - name: Setup DNS resolution for .localhost
        uses: ./.github/actions/setup-dnsmasq
      - name: Install dependencies
        if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }}
        run: yarn install:all
      - name: Setup local env
        env:
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: |
          hdiutil create -megabytes 50 -fs "$COZY_DESKTOP_FS" -volname cozy-desktop "$COZY_DESKTOP_DIR"
          hdiutil attach "${COZY_DESKTOP_DIR}.dmg" -mountpoint "$COZY_DESKTOP_DIR"
          echo "NODE_ENV=test" > "${{ github.workspace }}/.env.test"
      - name: Setup cozy-stack
        run: docker-compose up -d
      - name: Setup test config
        run: |
          until docker exec cozy-desktop-stack /cozy-desktop/test/setup.sh
          do
            echo "Waiting for cozy-stack to be running..."
            sleep 30
          done
      - name: Unit tests
        env:
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: yarn test:unit --forbid-only

  integration:
    needs: [cancel, docker_cache_key]
    runs-on: macos-13
    name: Integration tests
    strategy:
      matrix:
        fs: ['APFS']
      fail-fast: false
    steps:
      - uses: actions/checkout@v3
      - name: Cache node modules
        id: cache-node-modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: |
            ${{ github.workspace }}/node_modules
            ~/.cache/electron
            ~/.cache/electron-builder
          key: ${{ runner.os }}-v${{ env.NODE_VERSION }}-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
      - name: Setup Docker
        uses: douglascamata/setup-docker-macos-action@v1-alpha
      - name: Install Bash for docker-cache
        id: install-bash
        run: |
          brew install bash
          echo "bash-path=$(brew --prefix)/bin/bash" >> $GITHUB_OUTPUT
      - name: Cache Docker images.
        uses: cozy-labs/docker-cache@0.7.0
        with:
          key: ${{ needs.docker_cache_key.outputs.key }}
          bash: ${{ steps.install-bash.outputs.bash-path }}
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
      - name: Setup golang
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GO_VERSION }}
      - name: Setup python
        run: pip install setuptools
      - name: Setup DNS resolution for .localhost
        uses: ./.github/actions/setup-dnsmasq
      - name: Install dependencies
        if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }}
        run: yarn install:all
      - name: Setup local env
        env:
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: |
          hdiutil create -megabytes 50 -fs "$COZY_DESKTOP_FS" -volname cozy-desktop "$COZY_DESKTOP_DIR"
          hdiutil attach "${COZY_DESKTOP_DIR}.dmg" -mountpoint "$COZY_DESKTOP_DIR"
          echo "NODE_ENV=test" > "${{ github.workspace }}/.env.test"
      - name: Setup cozy-stack
        run: docker-compose up -d
      - name: Setup test config
        run: |
          until docker exec cozy-desktop-stack /cozy-desktop/test/setup.sh
          do
            echo "Waiting for cozy-stack to be running..."
            sleep 30
          done
      - name: Integration tests
        env:
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: yarn test:integration --forbid-only

  scenarios:
    needs: [cancel, docker_cache_key]
    runs-on: macos-13
    name: Scenarios
    strategy:
      matrix:
        stopped_client: ['', 'STOPPED']
        fs: ['APFS', 'HFS+']
      fail-fast: false
    steps:
      - uses: actions/checkout@v3
      - name: Cache node modules
        id: cache-node-modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: |
            ${{ github.workspace }}/node_modules
            ~/.cache/electron
            ~/.cache/electron-builder
          key: ${{ runner.os }}-v${{ env.NODE_VERSION }}-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
      - name: Setup Docker
        uses: douglascamata/setup-docker-macos-action@v1-alpha
      - name: Install Bash for docker-cache
        id: install-bash
        run: |
          brew install bash
          echo "bash-path=$(brew --prefix)/bin/bash" >> $GITHUB_OUTPUT
      - name: Cache Docker images.
        uses: cozy-labs/docker-cache@0.7.0
        with:
          key: ${{ needs.docker_cache_key.outputs.key }}
          bash: ${{ steps.install-bash.outputs.bash-path }}
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
      - name: Setup golang
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GO_VERSION }}
      - name: Setup python
        run: pip install setuptools
      - name: Setup DNS resolution for .localhost
        uses: ./.github/actions/setup-dnsmasq
      - name: Install dependencies
        if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }}
        run: yarn install:all
      - name: Setup local env
        env:
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: |
          until hdiutil create -megabytes 100 -fs "$COZY_DESKTOP_FS" -volname cozy-desktop "$COZY_DESKTOP_DIR"
          do
            sleep 1
          done
          until hdiutil attach "${COZY_DESKTOP_DIR}.dmg" -mountpoint "$COZY_DESKTOP_DIR"
          do
            sleep 1
          done
          echo "NODE_ENV=test" > "${{ github.workspace }}/.env.test"
      - name: Setup cozy-stack
        run: docker-compose up -d
      - name: Setup test config
        run: |
          until docker exec cozy-desktop-stack /cozy-desktop/test/setup.sh
          do
            echo "Waiting for cozy-stack to be running..."
            sleep 30
          done
      - name: Scenarios
        env:
          STOPPED_CLIENT: ${{ matrix.stopped_client == 'STOPPED' }}
          COZY_DESKTOP_FS: ${{ matrix.fs }}
        run: yarn test:scenarios --forbid-only

  build:
    needs: cancel
    runs-on: macos-13
    name: Build packages
    steps:
      - uses: actions/checkout@v3
      - name: Cache node modules
        id: cache-node-modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: |
            ${{ github.workspace }}/node_modules
            ~/.cache/electron
            ~/.cache/electron-builder
          key: ${{ runner.os }}-v${{ env.NODE_VERSION }}-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
      - name: Setup python
        run: pip install setuptools
      - name: Install dependencies
        if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }}
        run: yarn install:all
      - name: Build assets
        run: yarn build
      - name: Build package
        uses: ./.github/actions/build-and-publish
        with:
          gh-token: "${{ secrets.github_token }}"
          mac-cert: "${{ secrets.mac_cert }}"
          mac-cert-password: "${{ secrets.mac_cert_password }}"
          apple-id: "${{ secrets.apple_id }}"
          apple-id-password: "${{ secrets.apple_id_password }}"
          apple-team-id: "${{ secrets.apple_team_id }}"
      - name: Save artifacts
        if: ${{ github.event_name == 'pull_request' }}
        uses: actions/upload-artifact@v3
        with:
            name: Binaries
            path: |
                ${{ github.workspace }}/dist/latest-mac.yml
                ${{ github.workspace }}/dist/Cozy[- ]Drive[- ]*.dmg
                ${{ github.workspace }}/dist/Cozy[- ]Drive[- ]*-mac.zip
            retention-days: 5