# Configuration for Gitlab-CI.
# Builds appear on https://gitlab.com/buildroot.org/buildroot/pipelines
# The .gitlab-ci.yml file is generated from .gitlab-ci.yml.in.
# It needs to be regenerated every time a defconfig is added, using
# "make .gitlab-ci.yml".

image: buildroot/base:20200814.2228

.check_base:
    rules:
        - if: '$CI_COMMIT_REF_NAME =~ /^.*-.*_defconfig$/ || $CI_COMMIT_REF_NAME =~ /^.*-tests\..*$/'
          when: never
        - when: always

check-DEVELOPERS:
    extends: .check_base
    # get-developers should print just "No action specified"; if it prints
    # anything else, it's a parse error.
    # The initial ! is removed by YAML so we need to quote it.
    script:
        - "! utils/get-developers | grep -v 'No action specified'"

check-flake8:
    extends: .check_base
    before_script:
        # Help flake8 to find the Python files without .py extension.
        - find * -type f -name '*.py' > files.txt
        - find * -type f -print0 | xargs -0 file | grep 'Python script' | cut -d':' -f1 >> files.txt
        - sort -u files.txt | tee files.processed
    script:
        - python3 -m flake8 --statistics --count --max-line-length=132 $(cat files.processed)
    after_script:
        - wc -l files.processed

check-gitlab-ci.yml:
    extends: .check_base
    script:
        - mv .gitlab-ci.yml .gitlab-ci.yml.orig
        - make .gitlab-ci.yml
        - diff -u .gitlab-ci.yml.orig .gitlab-ci.yml

check-package:
    extends: .check_base
    script:
        - make check-package

.defconfig_base:
    script:
        - echo "Configure Buildroot for ${DEFCONFIG_NAME}"
        - make ${DEFCONFIG_NAME}
        - echo 'Build buildroot'
        - |
            make > >(tee build.log |grep '>>>') 2>&1 || {
                echo 'Failed build last output'
                tail -200 build.log
                exit 1
            }
    artifacts:
        when: always
        expire_in: 2 weeks
        paths:
            - .config
            - build.log
            - output/images/
            - output/build/build-time.log
            - output/build/packages-file-list.txt
            - output/build/*/.config

.defconfig:
    extends: .defconfig_base
    # Running the defconfigs for every push is too much, so limit to
    # explicit triggers through the API.
    rules:
        # For tags, create a pipeline.
        - if: '$CI_COMMIT_TAG'
        # For pipeline created by using a trigger token.
        - if: '$CI_PIPELINE_TRIGGERED'
        # For the branch or tag name named *-defconfigs, create a pipeline.
        - if: '$CI_COMMIT_REF_NAME =~ /^.*-defconfigs$/'
    before_script:
        - DEFCONFIG_NAME=${CI_JOB_NAME}

one-defconfig:
    extends: .defconfig_base
    rules:
        # For the branch or tag name named *-*_defconfigs, create a pipeline.
        - if: '$CI_COMMIT_REF_NAME =~ /^.*-.*_defconfig$/'
    before_script:
        - DEFCONFIG_NAME=$(echo ${CI_COMMIT_REF_NAME} | sed -e 's,^.*-,,g')

.runtime_test_base:
    # Keep build directories so the rootfs can be an artifact of the job. The
    # runner will clean up those files for us.
    # Multiply every emulator timeout by 10 to avoid sporadic failures in
    # elastic runners.
    script:
        - echo "Starting runtime test ${TEST_CASE_NAME}"
        - ./support/testing/run-tests -o test-output/ -d test-dl/ -k --timeout-multiplier 10 ${TEST_CASE_NAME}
    artifacts:
        when: always
        expire_in: 2 weeks
        paths:
            - test-output/*.log
            - test-output/*/.config
            - test-output/*/images/*

.runtime_test:
    extends: .runtime_test_base
    # Running the runtime tests for every push is too much, so limit to
    # explicit triggers through the API.
    rules:
        # For tags, create a pipeline.
        - if: '$CI_COMMIT_TAG'
        # For pipeline created by using a trigger token.
        - if: '$CI_PIPELINE_TRIGGERED'
        # For the branch or tag name named *-runtime-tests, create a pipeline.
        - if: '$CI_COMMIT_REF_NAME =~ /^.*-runtime-tests$/'
    before_script:
        - TEST_CASE_NAME=${CI_JOB_NAME}

one-runtime_test:
    extends: .runtime_test_base
    rules:
        - if: '$CI_COMMIT_REF_NAME =~ /^.*-tests\..*$/'
    before_script:
        - TEST_CASE_NAME=$(echo ${CI_COMMIT_REF_NAME} | sed -e 's,^.*-,,g')
