stages:
  - tests
  - build
  - publish

variables:
  DOC_BRANCH: doc
  DOC_REMOTE: https://gitlab-ci-token:${ACCESS_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"

tests:bullseye:
  image:
    name: brenard/ldapsaisie:bullseye
    entrypoint: [""]
  stage: tests
  rules:
    - changes:
      - src/**/*.php
  script:
    - rm -fr vendor
    - composer install
    - service slapd start
    - >
       if [ "$GITLAB_CI" == "true" ]; then
         ./vendor/bin/phpstan analyse --no-interaction --configuration=.phpstan/config.neon --error-format=junit > tests-report-bullseye.xml
       else
         ./vendor/bin/phpstan analyse --no-interaction --configuration=.phpstan/config.neon
       fi
  artifacts:
    when: always
    paths:
      - tests-report-bullseye.xml
    reports:
      junit: tests-report-bullseye.xml

tests:buster:
  image:
    name: brenard/ldapsaisie:buster
    entrypoint: [""]
  stage: tests
  rules:
    - changes:
      - src/**/*.php
  script:
    - rm -fr vendor
    - composer install
    - service slapd start
    - ./vendor/bin/phpstan analyse --no-interaction --configuration=.phpstan/config.neon --error-format=junit > tests-report-buster.xml
    - >
       if [ "$GITLAB_CI" == "true" ]; then
         ./vendor/bin/phpstan analyse --no-interaction --configuration=.phpstan/config.neon --error-format=junit > tests-report-buster.xml
       else
         ./vendor/bin/phpstan analyse --no-interaction --configuration=.phpstan/config.neon
       fi
  artifacts:
    when: always
    paths:
      - tests-report-buster.xml
    reports:
      junit: tests-report-buster.xml

tests:stretch:
  image:
    name: brenard/ldapsaisie:stretch
    entrypoint: [""]
  stage: tests
  rules:
    - changes:
      - src/*
  script:
    - cd /tmp/
    - composer require overtrue/phplint --dev
    - cd -
    - rm -f .phplint-cache
    - /tmp/vendor/bin/phplint src

tests:jessie:
  image:
    name: brenard/ldapsaisie:jessie
    entrypoint: [""]
  stage: tests
  rules:
    - changes:
      - src/**/*.php
  script:
    - cd /tmp/
    - composer require overtrue/phplint --dev
    - cd -
    - rm -f .phplint-cache
    - /tmp/vendor/bin/phplint src

build:debian-sid:
  image: brenard/debian-python-deb:debian11
  stage: build
  cache:
    paths:
      - .cache/pip
  only:
    - master
  script:
    - ./build-deb.sh --install-build-deps --sid
    - rm -fr dist/ldapsaisie-*
  artifacts:
    paths:
      - dist/*

build:snapshot:
  stage: build
  image: alpine
  only:
    - master
  script:
    - tar -czf ldapsaisie-snapshot.tar.gz --exclude=ldapsaisie-snapshot.tar.gz ./
  artifacts:
    paths:
      - ldapsaisie-snapshot.tar.gz

build:doc:html:
  stage: build
  image: python:alpine
  cache:
    paths:
      - .cache/pip
      - doc/venv
  only:
    - master
  before_script:
    - apk add make git
    - git config user.name $GITLAB_USER_NAME
    - git config user.email $GITLAB_USER_EMAIL
    - VERSION=`git describe --tags`
    - cd doc
    - git fetch origin $DOC_BRANCH
    - git rev-parse --verify $DOC_BRANCH && git branch -D $DOC_BRANCH || echo "No existing local git $DOC_BRANCH branch"
    - git checkout -b $DOC_BRANCH origin/$DOC_BRANCH
    - git checkout $CI_COMMIT_SHA
    - make clean && make venv
  script:
    - make LdapSaisie.html
    - test -n "$CI_COMMIT_TAG" && DOC_TAG=stable || DOC_TAG=dev
    - source venv/bin/activate  # We must have to activate the venv to use mike (direct call not supported)
    - mike deploy --branch $DOC_BRANCH --remote $DOC_REMOTE --push --update-aliases $VERSION $DOC_TAG
    - mike set-default --branch $DOC_BRANCH --remote $DOC_REMOTE --push $DOC_TAG
  artifacts:
    paths:
      - doc/LdapSaisie.html

build:doc:pdf:
  stage: build
  image:
    name: pink33n/html-to-pdf
    entrypoint: ["/bin/sh", "-c"]
  only:
    - master
  needs:
    - build:doc:html
  script:
    - rm -f doc/LdapSaisie.pdf
    - /usr/local/bin/entrypoint --url file://$(pwd)/doc/LdapSaisie.html --pdf doc/LdapSaisie.pdf || test -f doc/LdapSaisie.pdf
  artifacts:
    paths:
      - doc/LdapSaisie.pdf

build:doc:epub:
  stage: build
  image:
    name: pandoc/core
    entrypoint: ["/bin/sh", "-c"]
  only:
    - master
  needs:
    - build:doc:html
  before_script:
    - apk add make
  script:
    - cd doc
    - test ! -d venv && mkdir venv && touch public_html LdapSaisie.html
    - make LdapSaisie.epub
  artifacts:
    paths:
      - doc/LdapSaisie.epub

build:doc:append_additional_versions:
  stage: build
  image: python:alpine
  only:
    - master
  needs:
    - build:doc:html
    - build:doc:pdf
    - build:doc:epub
  before_script:
    - apk add git
    - git config user.name $GITLAB_USER_NAME
    - git config user.email $GITLAB_USER_EMAIL
    - VERSION=`git describe --tags`
    - cd doc
    - git fetch origin $DOC_BRANCH
    - git rev-parse --verify $DOC_BRANCH && git branch -D $DOC_BRANCH || echo "No existing local git $DOC_BRANCH branch"
    - git checkout -b $DOC_BRANCH origin/$DOC_BRANCH
    - git pull origin $DOC_BRANCH
  script:
    - cp LdapSaisie.html LdapSaisie.pdf LdapSaisie.epub dist/$VERSION/
    - git add dist/$VERSION/
    - git commit --amend --no-edit
    - git push --force $DOC_REMOTE $DOC_BRANCH

publish:doc:
  stage: publish
  image: alpine:latest
  only:
    - master
  needs:
    - build:doc:append_additional_versions
  before_script:
    - apk update && apk add git openssh-client rsync
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add -
    - mkdir ~/.ssh
    - echo "$SSH_HOST_KEY" | base64 -d > ~/.ssh/known_hosts
    - git fetch origin $DOC_BRANCH
    - git rev-parse --verify $DOC_BRANCH && git branch -D $DOC_BRANCH || echo "No existing local git $DOC_BRANCH branch"
    - git checkout -b $DOC_BRANCH origin/$DOC_BRANCH
    - git pull origin $DOC_BRANCH
  script:
    - rsync -atv --exclude '.git*' --delete --progress ./doc/dist/ $SSH_USER@$SSH_HOST:doc/

publish:snapshot:
  stage: publish
  image: alpine:latest
  only:
    - master
  needs:
    - build:snapshot
  before_script:
    - apk update && apk add openssh-client rsync
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add -
    - mkdir ~/.ssh
    - echo "$SSH_HOST_KEY" | base64 -d > ~/.ssh/known_hosts
  script:
    - rsync -atv ldapsaisie-snapshot.tar.gz $SSH_USER@$SSH_HOST:download/ldapsaisie-snapshot.tar.gz

publish:debian-sid:
  stage: publish
  image: debian:stable-slim
  only:
    - master
  needs:
    - build:debian-sid
  before_script:
    - apt-get update
    - apt-get install -y --no-install-recommends rsync openssh-client dupload
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add -
    - mkdir ~/.ssh
    - echo "$SSH_HOST_KEY" | base64 -d > ~/.ssh/known_hosts
    - echo "$DUPLOAD_CONFIG" | base64 -d > ~/.dupload.conf
  script:
    - echo "Publish Sid debian packages on APT repository..."
    - dupload --to debian-sid dist/ldapsaisie*changes
