version: 2.1

executors:
  cider-ci:
    docker:
      - image: cimg/node:lts-browsers
    working_directory: ~/Cider

orbs: # Add orbs to your configuration
  jira: circleci/jira@1.0.5 # invokes the Jira orb, making its commands accessible

# The jobs for this project
jobs:
  prepare-build:
    executor: cider-ci
    steps:
      - checkout
      - run:
          name: Update Version Number of App
          command: sudo chmod +x resources/version.sh && ./resources/version.sh || true
      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - yarn-packages-{{ checksum "cider.lock" }}
      - run:
          name: Install Node Dependencies
          command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
      - save_cache:
          name: Save Yarn Package Cache
          key: yarn-packages-{{ checksum "cider.lock" }}
          paths:
            - ~/.cache/yarn
      - run:
          name: TypeScript Compile
          command: yarn build
      - persist_to_workspace:
          # Must be an absolute path, or relative path from working_directory. This is a directory on the container which is
          # taken to be the root directory of the workspace.
          root: .
          # Must be relative path from root
          paths:
            - src
            - node_modules
            - build
            - resources
            - yarn.lock
            - package.json
            - winget.json # winget.json is a file that is generated by the winget package manager
            - LICENSE
            - license.txt

  build-linux:
    executor: cider-ci
    steps:
      - attach_workspace:
          at: ~/Cider
      - run:
          name: Generate Builds (Linux)
          command: yarn electron-builder -l -p never
          post-steps:
            - jira/notify
      - persist_to_workspace:
          root: .
          paths:
            - dist/*.deb
            - dist/*.AppImage
            - dist/*.snap
            - dist/latest-linux.yml

  build-windows:
    executor: cider-ci
    steps:
      - attach_workspace:
          at: ~/Cider
      - run:
          name: Install Windows System Build Dependencies
          command: |
            sudo apt-get update -y
            sudo apt-get install -y dpkg fakeroot wine64
            sudo dpkg --add-architecture i386
            sudo apt-get update -y
            sudo apt-get install -y wine32
      - run:
          name: Reinstall proper rust node module
          command: |
            cd ./node_modules/cider_utils
            yarn run prebuild-downloads --platform=win32 --verbose
            cd ../..     
      - run:
          name: Generate Builds (Windows)
          command: yarn electron-builder -w --x64 -p never
          post-steps:
            - jira/notify
      - persist_to_workspace:
          root: .
          paths:
            - dist/*.exe
            - dist/Cider-Setup-*.exe.blockmap
            - dist/latest.yml

  build-winget:
    executor: cider-ci
    steps:
      - attach_workspace:
          at: ~/Cider
      - run:
          name: Install Windows System Build Dependencies
          command: |
            sudo apt-get update -y
            sudo apt-get install -y dpkg fakeroot wine64
            sudo dpkg --add-architecture i386
            sudo apt-get update -y
            sudo apt-get install -y wine32
      - run:
          name: Reinstall proper rust node module
          command: |
            cd ./node_modules/cider_utils
            yarn run prebuild-downloads --platform=win32 --verbose
            cd ../..
      - run:
          name: Generate Builds (Winget)
          command: yarn electron-builder --win -c winget.json -p never
          post-steps:
            - jira/notify
      - persist_to_workspace:
          root: .
          paths:
            - dist/*.exe
            - dist/Cider-Setup-winget-*.exe.blockmap

  release:
    executor: cider-ci
    steps:
      - attach_workspace:
          at: ~/Cider/
      - run:
          name: Installing GitHub Command Line Interface
          command: |
            sudo apt-get update -y
            curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
            echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
            sudo apt-get update -y
            sudo apt install -y gh
      - run:
          name: Move Build Files
          command: |
            mkdir ~/Cider/dist/artifacts/
            mv ~/Cider/dist/*.exe ~/Cider/dist/artifacts
            mv ~/Cider/dist/*.deb ~/Cider/dist/artifacts
            mv ~/Cider/dist/*.AppImage ~/Cider/dist/artifacts
            mv ~/Cider/dist/*.snap ~/Cider/dist/artifacts
            mv ~/Cider/dist/*.yml ~/Cider/dist/artifacts
            mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
      - store_artifacts:
          path: ~/Cider/dist/artifacts
      - run:
          name: Update Version Number of App
          command: sudo chmod +x resources/version.sh && ./resources/version.sh || true
      - run:
          name: Publish Release
          command: |
            echo "Creating release for Cider v${APP_VERSION} on the ${CIRCLE_BRANCH} branch."
            gh release create "v${APP_VERSION}" --title "Cider Version ${APP_VERSION} (${CIRCLE_BRANCH})" --generate-notes -R ciderapp/cider-releases ~/Cider/dist/artifacts/*.deb ~/Cider/dist/artifacts/*.AppImage ~/Cider/dist/artifacts/*.snap ~/Cider/dist/artifacts/*.exe ~/Cider/dist/artifacts/*.yml ~/Cider/dist/artifacts/*.blockmap

# Orchestrate our job run sequence
workflows:
  build_and_release:
    jobs:
      - prepare-build:
          filters:
            branches:
              only: 
              - main
              - stable
      - build-windows:
          requires:
            - prepare-build
          filters:
            branches:
              only: 
              - main
              - stable
      - build-linux:
          requires:
            - prepare-build
          filters:
            branches:
              only: 
              - main
              - stable
      - build-winget:
          requires:
            - prepare-build
          filters:
            branches:
              only: 
              - main
              - stable
      - release:
          requires:
            - build-windows
            - build-linux
            - build-winget
          filters:
            branches:
              only: 
              - main
              - stable
