build-steps: &build-steps
  steps:
    - run:
        name: Fix Known Hosts on Linux
        command: |
          if [ "`uname`" == "Linux" ]; then
            /home/builduser/fix-known-hosts.sh
          fi
    - checkout
    - run:
        name: Install Node.js 10 on MacOS
        command: |
          if [ "$INSTALL_MACOS_NODE" == "true" ]; then
            echo 'Installing Node.js 10 for MacOS'
            brew update
            brew install node@10
            echo 'export PATH="/usr/local/opt/node@10/bin:$PATH"' >> $BASH_ENV
          fi
    - run:
        name: Check for release
        command: |
          if [ -n "${RUN_RELEASE_BUILD}" ]; then
            echo 'release build triggered from api'
            echo 'export ELECTRON_RELEASE=1 UPLOAD_TO_S3=1' >> $BASH_ENV
          fi
    - run:
       name: Bootstrap
       command: |
        if [ "$ELECTRON_RELEASE" == "1" ]; then
          echo "Bootstrapping Electron for release build for $TARGET_ARCH"
          script/bootstrap.py --target_arch=$TARGET_ARCH
        else
          echo "Bootstrapping Electron for debug build for $TARGET_ARCH"
          script/bootstrap.py --target_arch=$TARGET_ARCH --dev
        fi
    - run:
        name: Lint
        command: npm run lint
    - run:
       name: Build
       command: |
         if [ "$ELECTRON_RELEASE" == "1" ]; then
           echo 'Building Electron for release'
           script/build.py -c R
         else
           echo 'Building Electron for debug'
           script/build.py -c D
         fi
    - run:
        name: Create distribution
        command: |
          if [ "$ELECTRON_RELEASE" == "1" ]; then
            echo 'Creating Electron release distribution'
            script/create-dist.py
          else
            echo 'Skipping create distribution because build is not for release'
          fi
    - run:
        name: Upload distribution
        command: |
          if [ "$ELECTRON_RELEASE" == "1" ] && [ "$UPLOAD_TO_S3" != "1" ]; then
            echo 'Uploading Electron release distribution to github releases'
            script/upload.py
          elif [ "$ELECTRON_RELEASE" == "1" ] && [ "$UPLOAD_TO_S3" == "1" ]; then
            echo 'Uploading Electron release distribution to s3'
            script/upload.py --upload_to_s3
          else
            echo 'Skipping upload distribution because build is not for release'
          fi
    - run:
        name: Setup for headless testing
        command: |
          if [ "$RUN_HEADLESS_TESTS" == "true" ]; then
            echo 'Setup for headless testing'
            sh -e /etc/init.d/xvfb start
          else
            echo 'Headless testing not needed'
          fi

    - run:
        name: Verify mksnapshot
        command: |
          if [ "$RUN_TESTS" == "true" ] && [ "$ELECTRON_RELEASE" == "1" ]; then
            echo 'Verifying mksnapshot on release build'
            script/verify-mksnapshot.py
          else
            echo 'Skipping mksnapshot tests due to configuration'
          fi

    - run:
        name: Test
        environment:
          MOCHA_FILE: junit/test-results.xml
          MOCHA_REPORTER: mocha-junit-reporter
        command: |
          if [ "$RUN_TESTS" == "true" ]; then
            if [ "$ELECTRON_RELEASE" != "1" ]; then
              echo 'Testing Electron debug build'
              mkdir junit
              script/test.py --ci --rebuild_native_modules
            else
              if [ "$UPLOAD_TO_S3" == "1" ]; then
                echo 'Testing Electron release build'
                mkdir junit
                script/test.py --ci --rebuild_native_modules -c R
              else
                echo 'Skipping tests on GitHub release'
              fi
            fi
          else
           echo 'Skipping tests due to configuration'
          fi
    - run:
        name: Verify FFmpeg
        command: |
          if [ "$RUN_TESTS" == "true" ]; then
            if [ "$ELECTRON_RELEASE" != "1" ]; then
              echo 'Verifying ffmpeg on debug build'
              script/verify-ffmpeg.py
            else
              echo 'Verifying ffmpeg on release build'
              script/verify-ffmpeg.py -R
            fi
          else
            echo 'Skipping tests due to configuration'
          fi

    - run:
        name: Generate Typescript Definitions
        command: |
          if [ "$CREATE_TYPESCRIPT_DEFS" == "true" ]; then
            npm run create-typescript-definitions
          fi
    - persist_to_workspace:
        root: out
        paths:
          - "*"
    - store_test_results:
        path: junit
    - store_artifacts:
        path: junit
    - store_artifacts:
        path: out

build-defaults: &build-defaults
  docker:
    - image: electronbuilds/electron:0.0.8.1
  <<: *build-steps

version: 2
jobs:
  electron-linux-arm:
    environment:
      TARGET_ARCH: arm
    <<: *build-defaults
    resource_class: 2xlarge

  electron-linux-arm-test:
    machine: true
    steps:
      - attach_workspace:
          at: /tmp/workspace/project/out
      - checkout
      - run:
          name: Test in ARM docker container
          command: |
            if [ "$ELECTRON_RELEASE" != "1" ]; then
              docker run --rm --privileged multiarch/qemu-user-static:register --reset
              docker run -it \
              --mount type=bind,source=/tmp/workspace,target=/tmp/workspace \
              --rm electronbuilds/electronarm7:0.0.5 > version.txt
              cat version.txt
              if grep -q `script/get-version.py` version.txt; then
                echo "Versions match"
              else
                echo "Versions do not match"
                exit 1
              fi
            else
              echo "Skipping test for release build"
            fi

  electron-linux-arm-release-nightly:
    environment:
      TARGET_ARCH: arm
      RUN_RELEASE_BUILD: true
    <<: *build-defaults
    resource_class: 2xlarge

  electron-linux-arm64:
    environment:
      TARGET_ARCH: arm64
    <<: *build-defaults
    resource_class: 2xlarge

  electron-linux-arm64-test:
    machine: true
    steps:
      - attach_workspace:
          at: /tmp/workspace/project/out
      - checkout
      - run:
          name: Test in ARM64 docker container
          command: |
            if [ "$ELECTRON_RELEASE" != "1" ]; then
              docker run --rm --privileged multiarch/qemu-user-static:register --reset
              docker run -it \
              --mount type=bind,source=/tmp/workspace,target=/tmp/workspace \
              --rm electronbuilds/electronarm64:0.0.6 > version.txt
              cat version.txt
              if grep -q `script/get-version.py` version.txt; then
                echo "Versions match"
              else
                echo "Versions do not match"
                exit 1
              fi
            else
              echo "Skipping test for release build"
            fi

  electron-linux-arm64-release-nightly:
    environment:
      TARGET_ARCH: arm64
      RUN_RELEASE_BUILD: true
    <<: *build-defaults
    resource_class: 2xlarge

  electron-linux-ia32:
    environment:
      TARGET_ARCH: ia32
      DISPLAY: ':99.0'
      RUN_TESTS: true
      RUN_HEADLESS_TESTS: true
    <<: *build-defaults
    resource_class: xlarge

  electron-linux-ia32-release-nightly:
    environment:
      TARGET_ARCH: ia32
      RUN_RELEASE_BUILD: true
    <<: *build-defaults
    resource_class: xlarge

  electron-linux-mips64el:
    environment:
      TARGET_ARCH: mips64el
    <<: *build-defaults
    resource_class: xlarge

  electron-linux-x64:
    environment:
      TARGET_ARCH: x64
      DISPLAY: ':99.0'
      RUN_TESTS: true
      RUN_HEADLESS_TESTS: true
      CREATE_TYPESCRIPT_DEFS: true
    <<: *build-defaults
    resource_class: xlarge

  electron-linux-x64-release-nightly:
    environment:
      TARGET_ARCH: x64
      RUN_RELEASE_BUILD: true
    <<: *build-defaults
    resource_class: xlarge

  electron-osx-x64:
    environment:
      TARGET_ARCH: x64
      RUN_TESTS: true
      INSTALL_MACOS_NODE: true
    resource_class: large
    macos:
      xcode: "8.3.3"
    <<: *build-steps

  electron-osx-x64-release-nightly:
    environment:
      TARGET_ARCH: x64
      RUN_RELEASE_BUILD: true
      INSTALL_MACOS_NODE: true
    resource_class: large
    macos:
      xcode: "8.3.3"
    <<: *build-steps

  electron-mas-x64:
    environment:
      TARGET_ARCH: x64
      MAS_BUILD: 1
      RUN_TESTS: true
      INSTALL_MACOS_NODE: true
    resource_class: large
    macos:
      xcode: "8.3.3"
    <<: *build-steps

  electron-mas-x64-release-nightly:
    environment:
      TARGET_ARCH: x64
      MAS_BUILD: 1
      RUN_RELEASE_BUILD: true
      INSTALL_MACOS_NODE: true
    resource_class: large
    macos:
      xcode: "8.3.3"
    <<: *build-steps


workflows:
  version: 2
  build-arm:
    jobs:
      - electron-linux-arm
      - electron-linux-arm-test:
          requires:
            - electron-linux-arm
  build-arm64:
    jobs:
      - electron-linux-arm64
      - electron-linux-arm64-test:
          requires:
            - electron-linux-arm64
  build-ia32:
    jobs:
      - electron-linux-ia32
  build-x64:
    jobs:
      - electron-linux-x64
  build-osx-x64:
    jobs:
      - electron-osx-x64
  build-mas-x64:
    jobs:
      - electron-mas-x64

  nightly-release-test:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - master
                - 2-0-x
                - 1-8-x
                - 1-7-x
    jobs:
      - electron-linux-arm-release-nightly
      - electron-linux-arm64-release-nightly
      - electron-linux-ia32-release-nightly
      - electron-linux-x64-release-nightly

experimental:
  notify:
    branches:
      only:
        - master
        - 2-0-x
        - 1-8-x
        - 1-7-x
