#
# Copyright 2021 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Description:
#
# Automated x4xx openembedded build on Azure DevOps
#
# This pipeline builds the following openembedded targets:
# - UHD
# - UHD FPGA images
# - MPMD
#
# It also runs UHD unit tests and publishes their results.

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - .ci
    - host
    - mpm
    - images/manifest.txt

pr:
  branches:
    include:
    - master
  paths:
    include:
    - .ci
    - host
    - mpm
    - images/manifest.txt

variables:
  SITECONF_FILE: '$(Agent.WorkFolder)/site.conf'
  MANIFEST_URL: 'git@github.com:EttusResearch/oe-manifest-dev.git'
  MANIFEST_BRANCH: 'zeus-dev'
  MANIFEST_FILE: 'head-titanium-dev.xml'
  IMAGE_VERSION_SUFFIX: '-$(Build.BuildNumber)'
  MENDER_ARTIFACT_NAME: '$(Build.BuildNumber)'

jobs:
- job: 'Build_OE_packages'
  timeoutInMinutes: 60
  cancelTimeoutInMinutes: 10
  strategy:
    matrix: {'x4xx-rev2': {}}

  pool:
    name: de-dre-lab
    demands:
    - openembedded
    - Agent.Name -equals oss-build3

  steps:

  - script: env
    displayName: 'Print environment'

  - script: ssh -T git@github.com || true
    displayName: 'Test github authentication'

  - script: |
      cd $AGENT_BUILDDIRECTORY
      repo init -u $MANIFEST_URL -b $MANIFEST_BRANCH -m $MANIFEST_FILE
      repo forall -c git clean -fd
      repo forall -c git reset --hard
      repo sync
      if [ -x .repo/manifests/apply-patches.sh ]; then
        .repo/manifests/apply-patches.sh
      fi
    displayName: 'Checkout openembedded layers'

  - checkout: self
    path: uhddev
    displayName: 'Checkout uhddev'

  - script: |
      if (echo $SYSTEM_JOBNAME | grep -q -e "-nomender$"); then
        DEVICE=${SYSTEM_JOBNAME:0:-9}
        TEMPLATECONF_DIR="meta-ettus/conf/without-mender/$DEVICE"
      else
        DEVICE=$SYSTEM_JOBNAME
        TEMPLATECONF_DIR="meta-ettus/conf/with-mender/$DEVICE"
      fi
      BUILD_DIR="$DEVICE/build-$BUILD_BUILDNUMBER" # relative to Agent.BuildDirectory
      TESTRESULTS_DIR="$BUILD_DIR/testresults" # relative to Agent.BuildDirectory
      # set variables to be used in the pipeline
      echo "###vso[task.setVariable variable=Device;isOutput=true]$DEVICE"
      echo "###vso[task.setVariable variable=TemplateConf_Dir;isOutput=true]$TEMPLATECONF_DIR"
      echo "###vso[task.setVariable variable=Build_Dir;isOutput=true]$BUILD_DIR"
      echo "###vso[task.setVariable variable=TESTRESULTS_DIR;isOutput=true]$TESTRESULTS_DIR"
    name: config

  - script: |
      cd $AGENT_BUILDDIRECTORY
      mkdir -p $PWD/$CONFIG_BUILD_DIR
      export TEMPLATECONF=$PWD/$CONFIG_TEMPLATECONF_DIR
      if [ -d $CONFIG_BUILD_DIR/conf ]; then
        rm -rv $CONFIG_BUILD_DIR/conf
      fi
      source oe-core/oe-init-build-env $CONFIG_BUILD_DIR
      echo "INHERIT += \"externalsrc\"" >> conf/local.conf
      echo "EXTERNALSRC_pn-uhd = \"$AGENT_BUILDDIRECTORY/uhddev/host\"" >> conf/local.conf
      echo "EXTERNALSRC_pn-mpmd = \"$AGENT_BUILDDIRECTORY/uhddev/mpm\"" >> conf/local.conf
      echo "RRECOMMENDS_uhd_class-target_remove = \"uhd-fpga-images\"" >> conf/local.conf
      echo "RDEPENDS_mpmd_remove = \"uhd-fpga-images-firmware\"" >> conf/local.conf
      if [ -n "$SITECONF_FILE" ]; then
        cp -v $SITECONF_FILE conf/site.conf
        DEPLOY_DIR_BASE=$(grep -e "^DEPLOY_DIR_BASE\s*=" conf/site.conf | sed "s|^.*=\s*\"\(\S*\)\"$|\1|")
        if [ -n "$DEPLOY_DIR_BASE" ]; then
          DEPLOY_DIR="$DEPLOY_DIR_BASE/${SYSTEM_DEFINITIONNAME}/${CONFIG_BUILD_DIR}"
          echo "###vso[task.setVariable variable=DEPLOY_DIR]$DEPLOY_DIR"
          echo "Setting DEPLOY_DIR to $DEPLOY_DIR"
          echo "DEPLOY_DIR = \"$DEPLOY_DIR\"" >> conf/local.conf
        fi
        echo "TESTRESULTS_DIR = \"$(Agent.BuildDirectory)/$(config.TESTRESULTS_DIR)\"" >> conf/local.conf
      fi
      for FILE in $TEMPLATECONF/multiconfig/*.sample; do
        mkdir -p conf/multiconfig
        cp -v $FILE conf/multiconfig/$(basename $FILE .sample)
      done
      for FILE in $(find conf -name "*.conf"); do
        echo "*** content of file $FILE: ***"
        cat $FILE
      done
    displayName: 'Setup environment'

  - script: |
      cd $AGENT_BUILDDIRECTORY
      source oe-core/oe-init-build-env $CONFIG_BUILD_DIR
      bitbake -p
    displayName: 'Parse recipes'

  - script: |
      cd $AGENT_BUILDDIRECTORY
      source oe-core/oe-init-build-env $CONFIG_BUILD_DIR
      bitbake uhd:do_package_write_ipk
    displayName: 'Build UHD'

  - script: |
      cd $AGENT_BUILDDIRECTORY
      source oe-core/oe-init-build-env $CONFIG_BUILD_DIR
      bitbake uhd:do_run_tests
    displayName: 'Run UHD tests'
    continueOnError: true

  - task: PublishTestResults@2
    inputs:
      testResultsFormat: 'cTest'
      testResultsFiles: '**/Test.xml'
      testRunTitle: 'UHD tests'
      searchFolder: '$(Agent.BuildDirectory)/$(config.TESTRESULTS_DIR)/uhd'
    displayName: 'Publish UHD tests results'
    continueOnError: true

  - script: |
      cd $AGENT_BUILDDIRECTORY
      source oe-core/oe-init-build-env $CONFIG_BUILD_DIR
      bitbake mpmd:do_package_write_ipk
    displayName: 'Build MPM'

  - publish: '$(DEPLOY_DIR)/ipk'
    artifact: 'IPK files'
    displayName: 'Publish Artifacts'

  - script: |
      if [ -d $(DEPLOY_DIR) ]; then mv $(DEPLOY_DIR) $(DEPLOY_DIR)_attempt_$(System.JobAttempt); fi
    condition: failed()
    displayName: rename deploy dir if build failed