# we utilize the images generated by the build-images project, to
# speed up CI runs. We also use ccache and store config.cache
# to speed up compilation.

stages:
    - test-from-git
    - test-from-tarball
    - deploy

cache:
  key: "$CI_JOB_NAME"
  paths:
    - cache/

before_script:
  # CCache Config
  - mkdir -p cache
  - export CCACHE_BASEDIR=${PWD}
  - export CCACHE_DIR=${PWD}/cache
  - echo $CCACHE_DIR
  - export CC="ccache gcc"

after_script:
  # somehow after_script loses environment
  - export CCACHE_BASEDIR=${PWD}
  - export CCACHE_DIR=${PWD}/cache
  - if type -p ccache >/dev/null; then ccache -s; fi

variables:
  BUILD_IMAGES_PROJECT: gnuwget/build-images
  CI_BASE_PATH: $CI_REGISTRY/$BUILD_IMAGES_PROJECT/wget
  DEBIAN_OLDSTABLE_BUILD: buildenv-debian-oldstable
  DEBIAN_TESTING_BUILD: buildenv-debian-testing
  DEBIAN_STABLE_BUILD: buildenv-debian-stable
  CENTOS_OLDLTS_BUILD: buildenv-centos7
  FEDORA_BUILD: buildenv-fedora
  MINGW_BUILD: buildenv-mingw
  ARCH_BUILD: buildenv-arch
  GET_SOURCES_ATTEMPTS: "3"
  GIT_DEPTH: "5"
  CONFIGURE_BASE_FLAGS: --enable-assert --cache-file cache/config.cache
  CFLAGS_DEFAULT: -O0 -g -ggdb3

CommitCheck:
  stage: test-from-git
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
  script:
    - ./contrib/commit-check
  allow_failure: true
  cache:
      paths:
      policy: push


# Create the tarball in a separate build directory (VPATH).
Build-Tarball:
    stage: test-from-git
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - ./bootstrap
        - autoreconf -fi
        - mkdir vpath && cd vpath
        - ../configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
          --without-ssl --enable-ipv6 --without-zlib --without-libiconv-prefix
          --disable-iri --disable-ntlm --disable-pcre --without-libpsl --without-libuuid
          --without-libintl-prefix
        - make -j$(nproc)
        - make -j$(nproc) syntax-check
        - make -j$(nproc) dist
        - mv wget-*.gz ..
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - ./*.log
            - vpath/*.log
            - vpath/fuzz/*.log
            - vpath/tests/*.log
            - vpath/testenv/*.log
    artifacts:
        expire_in: 2 weeks
        when: on_success
        paths:
            - wget-*.gz

Valgrind:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make check-valgrind
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

Minimal:
    stage: test-from-tarball
    image: $CI_BASE_PATH/debian:testing-minimal
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
          --disable-nls --without-ssl --enable-ipv6 --without-zlib --without-libiconv-prefix
          --disable-iri --disable-ntlm --disable-pcre --without-libpsl --without-libuuid
          --without-libintl-prefix
        - make -j$(nproc) check-valgrind
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

Debian-OldStable:
    stage: test-from-tarball
    image: $CI_BASE_PATH/debian:oldstable
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make
        - make -j$(nproc) check
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

Debian-Stable:
    stage: test-from-tarball
    image: $CI_BASE_PATH/debian:stable
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make -j$(nproc) check
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

CentOS-OldLTS:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$CENTOS_OLDLTS_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make -j$(nproc)
        - make -j$(nproc) check
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log
    # The test suite is currently broken, so a temporary allowance
    allow_failure: true

TLS/OpenSSL:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - echo "127.0.0.1 wgettestingserver" >>/etc/hosts
        - cat /etc/hosts
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache --with-ssl=openssl
        - make -j$(nproc)
        - make -j$(nproc) check-valgrind
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

TLS/GnuTLS:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - echo "127.0.0.1 wgettestingserver" >>/etc/hosts
        - cat /etc/hosts
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache --with-ssl=gnutls
        - make -j$(nproc)
        - make -j$(nproc) check-valgrind
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

Sanitizers:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
#       - export CFLAGS="$CFLAGS_DEFAULT -Werror"
        - export CFLAGS="$CFLAGS_DEFAULT"
        - export CC="ccache clang"
        - export UBSAN_OPTIONS=print_stacktrace=1
        - export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
#       - export LSAN_OPTIONS=suppressions="$PWD/tests/clang-asan-suppressions"
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
            --enable-fsanitize-asan --enable-fsanitize-ubsan
        - make -j$(nproc) check
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log

Scan-Build:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - scan-build ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make -C lib -j$(nproc)
        - make -C src css_.o
        - scan-build -v -enable-checker nullability --keep-empty --status-bugs -o ../scan-build make -j$(nproc)
    tags:
        - shared
        - linux
    except:
        - tags
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - scan-build/
    # scan-build reports two false positives that we can't suppress
    allow_failure: true

CoverageReports:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_TESTING_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
        - make -j$(nproc) check-coverage
        - mv lcov ../test-coverage
        - make -C doc html
        - make -j$(nproc) fuzz-coverage
        - mv lcov ../fuzz-coverage
        - make dist
    tags:
        - shared
        - linux
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        when: on_success
        paths:
            - test-coverage/
            - fuzz-coverage/
    only:
        - master

MinGW64:
    stage: test-from-tarball
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$MINGW_BUILD
    variables:
        GIT_STRATEGY: none
    script:
        - export CFLAGS=$CFLAGS_DEFAULT
        - tar xvf wget-*.gz
        - cd wget-*/
        - mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
        - echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
        - export CC="ccache $PREFIX-gcc"
        - export GCCLIB=$(dirname $(find /usr/lib/gcc/$PREFIX -name libgcc_s_seh-1.dll|grep posix))
        - export WINEPATH="$WINEPATH;/usr/$PREFIX/bin;/usr/$PREFIX/lib;$PWD/libwget/.libs;$GCCLIB"
        - echo "WINEPATH=$WINEPATH"
        - LIBS="-ldl -lpsapi" ./configure $CONFIGURE_BASE_FLAGS --cache-file ../cache/config.cache
            --build=x86_64-pc-linux-gnu --host=$PREFIX --enable-shared
        - make -j$(nproc)
        - cp -p src/wget.exe src/wget
        - make check -j$(nproc) LOG_COMPILER=wine
    tags:
        - shared
        - linux
    except:
        - tags
        - coverity-scan@gnuwget/wget
    dependencies:
        - Build-Tarball
    needs: ["Build-Tarball"]
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - wget-*/./config.h
            - wget-*/./*.log
            - wget-*/fuzz/*.log
            - wget-*/tests/*.log
            - wget-*/testenv/*.log
    # The MinGW64 build breaks quite often, mostly due to dependencies.
    allow_failure: true

# Build from git should work on Arch.
ArchLinux:
    stage: test-from-git
    image: $CI_BASE_PATH/archlinux
    script:
        - export CFLAGS="$CFLAGS_DEFAULT"
        - ./bootstrap
        - autoreconf -fi
        - touch .manywarnings
        - ./configure $CONFIGURE_BASE_FLAGS
        - make -j$(nproc)
        - make check -j$(nproc)
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    needs: []
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - ./*.log
            - fuzz/*.log
            - tests/*.log
            - testenv/*.log

# Build from git should work on Fedora.
Fedora:
    stage: test-from-git
    image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
    script:
        - export CFLAGS="$CFLAGS_DEFAULT"
        - ./bootstrap
        - autoreconf -fi
        - touch .manywarnings
        - ./configure $CONFIGURE_BASE_FLAGS
        - make -j$(nproc) check
    tags:
        - shared
        - linux
    except:
        - coverity-scan@gnuwget/wget
    needs: []
    artifacts:
        expire_in: 2 weeks
        when: on_failure
        paths:
            - ./*.log
            - fuzz/*.log
            - tests/*.log
            - testenv/*.log


pages:
    stage: deploy
    script:
        - mkdir -p public
        - rm -rf public/reference public/coverage public/fuzz-coverage
        - mv wget-*.gz public/wget-latest.tar.gz
        - mv test-coverage public/coverage
        - mv fuzz-coverage public/fuzz-coverage
    dependencies:
        - CoverageReports
        - Build-Tarball
    artifacts:
        when: on_success
        paths:
            - public
    only:
        - master