# ---------------------------------------------------------------------------- #
## \file package.yml
## \author Sebastien Beaugrand
## \sa http://beaugrand.chez.com/
## \copyright CeCILL 2.1 Free Software license
# ---------------------------------------------------------------------------- #
stages:
  - build     # build
  - test      # test build
  - package   # build package
  - install   # install package
  - rbuild    # build on remote (build host)
  - rtest     # test build on remote (build host)
  - rpackage  # build package on remote (build host)
  - rinstall  # install remote package on remote host
  - rdeploy   # install package from build host to target host
  - stest     # tests with remote service installed
  - xbuild    # cross build
  - xpackage  # cross build package
  - xdeploy   # install cross-builded package
  - xinstall  # install cross-compiled binary (reinstall project binary)
  - xtest     # tests with remote package or binary installed
  - rxbuild   # remote cross build (for old cross compilers)
  - rxpackage # remote cross build package
  - rxdeploy  # remote install cross-builded package
  - rxinstall # remote install cross-compiled binary
variables:
  HOST: ubuntu2404
  BUILD: Debug
  NOCLEAN: 0
  CMAKE: cmake .. -DCMAKE_BUILD_TYPE=$BUILD
  PROJECT: example
  VERSION: 1.0.0
  STRIP: strip
  RSYNC: >
         rsync --checksum --delete -a -i
         --exclude=*~
         --exclude=build
         --exclude=build-*
         --exclude=__pycache__
         --exclude=.git
         --exclude=.svn
  URI: example@ip
  SSH: vagrant ssh -c
  SCP: scp
  USERPATH: /vagrant/.vagrant
  SCPTARGET: $URI:$USERPATH/
  HDIR: ../hosts
  BDIR: build
  BHOST: $HOST
  XCVER: 12
  XCDIR: /data
  PRIVKEY: $HOME/.ssh/id_rsa
  APT: apt-get -y -o APT::Sandbox::User=root
.keychain:
  script:
    - >
      test ! -f $PRIVKEY || test -d /run/lock/.keychain ||
      TMPDIR=/run/lock keychain --dir /run/lock --nogui $PRIVKEY
    - test ! -f $PRIVKEY || source /run/lock/.keychain/*-sh
build:
  stage: build
  except:
    variables:
      - $PROJECT =~ '/^lib/'
  script:
    - mkdir -p build
    - cd build
    - $CMAKE
    - test $NOCLEAN = 1 || make --no-print-directory clean
    - make --no-print-directory -j`nproc`
package:
  stage: package
  except:
    variables:
      - $PROJECT =~ '/^lib/'
  script:
    - export DEBEMAIL=$DEBEMAIL
    - export DEBFULLNAME=$DEBFULLNAME
    - >
      test -n "$DEBEMAIL" ||
      export DEBEMAIL=`git config --global --get user.email`
    - >
      test -n "$DEBFULLNAME" ||
      export DEBFULLNAME=`git config --global --get user.name`
    - mkdir -p $BDIR/$PROJECT-$VERSION/data
    - cd $BDIR/$PROJECT-$VERSION
    - dh_make --native --single --yes || true
    - rm -f debian/README*
    - cat /dev/null >debian/$PROJECT.install
    - test ! -d ../../debian-nr || cp -L ../../debian-nr/* debian/
    - test ! -d ../../data   || cp -L ../../data/*   data/
    - test ! -d ../../share  || cp -a ../../share/*  data/
    - find .. -maxdepth 1 -type f -executable -exec cp {} data/ \;
    - >
      test ! -f ../$PROJECT ||
      echo "data/$PROJECT /usr/bin/" >>debian/$PROJECT.install
    - >
      test ! -d ../../share || ls ../../share |
      sed "s#\(.*\)#data/\1 /usr/share/$PROJECT/#" >>debian/$PROJECT.install
    - SOURCE_DATE_EPOCH=`date +%s` dpkg-buildpackage --no-sign $OPTS
install:
  stage: install
  script:
    - sudo $APT reinstall ./build/${PROJECT}_${VERSION}_amd64.deb
rbuild:
  stage: rbuild
  script:
    - PROPATH=$(basename `readlink -f .`)
    - $RSYNC ./ $HDIR/$BHOST/.vagrant/$PROPATH/
    - $RSYNC ../makefiles $HDIR/$BHOST/.vagrant/
    - cd $HDIR/$BHOST
    - >
      $SSH "cd $USERPATH/$PROPATH &&
      make build BUILD=$BUILD NOCLEAN=$NOCLEAN CMAKE='$CMAKE' &&
      (test $BUILD = Debug || $STRIP build/$PROJECT)"
rtest:
  stage: rtest
  before_script:
    - PROPATH=$(basename `readlink -f .`)
    - $RSYNC ./ $HDIR/$BHOST/.vagrant/$PROPATH/
    - $RSYNC ../makefiles $HDIR/$BHOST/.vagrant/
    - cd $HDIR/$BHOST
    - $SSH "cd $USERPATH/$PROPATH && build/$PROJECT" &
    - sleep 1
    - IP=`make --no-print-directory get-ip`
    - cd -
rpackage:
  stage: rpackage
  script:
    - PROPATH=$(basename `readlink -f .`)
    - $RSYNC ./ $HDIR/$BHOST/.vagrant/$PROPATH/
    - $RSYNC ../makefiles $HDIR/$BHOST/.vagrant/
    - cd $HDIR/$BHOST
    - $SSH "cd $USERPATH/$PROPATH && make package"
rinstall:
  stage: rinstall
  script:
    - PROPATH=$(basename `readlink -f .`)
    - cd $HDIR/$BHOST
    - >
      $SSH "cd $USERPATH/$PROPATH &&
      sudo $APT reinstall ./build/${PROJECT}_${VERSION}_amd64.deb"
rdeploy:
  stage: rdeploy
  script:
    - PROPATH=$(basename `readlink -f .`)
    - test -n "$XC" || BDIR=.vagrant/$PROPATH/build
    - test -n "$XC" || cd $HDIR/$BHOST
    - !reference [.keychain, script]
    - $SCP $BDIR/${PROJECT}_${VERSION}_*.deb $SCPTARGET
    - test -n "$SUDOPASS" || read -s SUDOPASS
    - >
      $SSH "! systemctl -q is-active $PROJECT ||
      echo $SUDOPASS | sudo -S -p \"wait\" systemctl stop $PROJECT"
    - >
      $SSH "cd $USERPATH && echo $SUDOPASS | sudo -S
      $APT reinstall ./${PROJECT}_${VERSION}_*.deb"
stest:
  stage: stest
  before_script:
    - cd $HDIR/$HOST
    - IP=`make --no-print-directory get-ip`
    - cd -
xbuild:
  stage: xbuild
  variables:
    XC: aarch64-linux-gnu
  script:
    - mkdir -p build-$XC
    - cd build-$XC
    - $CMAKE -DXC=$XC -DXCVER=$XCVER -DXCDIR=$XCDIR
    - test $NOCLEAN = 1 || make --no-print-directory clean
    - make --no-print-directory -j`nproc`
xpackage:
  stage: xpackage
  extends: package
  variables:
    XC: aarch64-linux-gnu
  before_script:
    - BDIR=build-$XC
    - test "$XC" != "aarch64-linux-gnu" || ARCH=arm64
    - test "$XC" != "arm-linux-gnueabihf" || ARCH=armhf
    - CONFIG_SITE=/etc/dpkg-cross/cross-config.$ARCH
    - OPTS=-a$ARCH
    - export DEB_BUILD_OPTIONS=nocheck
    - export XC=$XC
    - export XCVER=$XCVER
    - export XCDIR=$XCDIR
    - export CC=$XC
xdeploy:
  stage: xdeploy
  extends: rdeploy
  variables:
    XC: aarch64-linux-gnu
  before_script:
    - BDIR=build-$XC
xinstall:
  stage: xinstall
  variables:
    XC: aarch64-linux-gnu
  script:
    - test -n "$BLIST" || BLIST=$PROJECT
    - BDIR=build-$XC
    - !reference [.keychain, script]
    - cd $BDIR
    - $SCP $BLIST $SCPTARGET
    - test -n "$SUDOPASS" || read -s SUDOPASS
    - >
      $SSH "cd $USERPATH && echo $SUDOPASS | sudo -S true && echo &&
      sudo cp $BLIST /usr/bin/"
xtest:
  stage: xtest
  before_script:
    - cd $HDIR/$HOST
    - $SSH "/usr/bin/$PROJECT" &
    - sleep 2
    - IP=`make --no-print-directory get-ip`
    - cd -
rxbuild:
  stage: rxbuild
  variables:
    XC: aarch64-linux-gnu
    XCDIR: /vagrant/.vagrant
  script:
    - PROPATH=$(basename `readlink -f .`)
    - $RSYNC ./ $HDIR/$BHOST/.vagrant/$PROPATH/
    - $RSYNC ../makefiles $HDIR/$BHOST/.vagrant/
    - cd $HDIR/$BHOST
    - >
      $SSH "cd $USERPATH/$PROPATH &&
      make xbuild BUILD=$BUILD NOCLEAN=$NOCLEAN CMAKE='$CMAKE'
      XC=$XC XCVER=$XCVER XCDIR=$XCDIR &&
      (test $BUILD = Debug || $STRIP build-$XC/$PROJECT)"
rxpackage:
  stage: rxpackage
  variables:
    XC: aarch64-linux-gnu
    XCDIR: /vagrant/.vagrant
  script:
    - PROPATH=$(basename `readlink -f .`)
    - $RSYNC ./ $HDIR/$BHOST/.vagrant/$PROPATH/
    - $RSYNC ../makefiles $HDIR/$BHOST/.vagrant/
    - cd $HDIR/$BHOST
    - $SSH "cd $USERPATH/$PROPATH &&
      make xpackage XC=$XC XCVER=$XCVER XCDIR=$XCDIR"
rxdeploy:
  stage: rxdeploy
  extends: rdeploy
  variables:
    XC: aarch64-linux-gnu
  before_script:
    - PROPATH=$(basename `readlink -f .`)
    - BDIR=$HDIR/$BHOST/.vagrant/$PROPATH/build-$XC
rxinstall:
  stage: rxinstall
  variables:
    XC: aarch64-linux-gnu
  script:
    - test -n "$BLIST" || BLIST=$PROJECT
    - PROPATH=$(basename `readlink -f .`)
    - BDIR=$HDIR/$BHOST/.vagrant/$PROPATH/build-$XC
    - !reference [.keychain, script]
    - cd $BDIR
    - $SCP $BLIST $URI:/run/user/1000/
    - test -n "$SUDOPASS" || read -s SUDOPASS
    - >
      $SSH "cd /run/user/1000 && echo $SUDOPASS | sudo -S true && echo &&
      sudo mv $BLIST /usr/bin/"