371 lines
12 KiB
YAML
371 lines
12 KiB
YAML
# Copyright (C) 2017-2025 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of GNU Emacs.
|
|
#
|
|
# GNU Emacs is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GNU Emacs is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
# GNU Emacs support for the GitLab protocol for CI.
|
|
|
|
# The presence of this file does not imply any FSF/GNU endorsement of
|
|
# any particular service that uses that protocol. Also, it is intended for
|
|
# evaluation purposes, thus possibly temporary.
|
|
|
|
# Maintainer: Ted Zlatanov <tzz@lifelogs.com>
|
|
# URL: https://emba.gnu.org/emacs/emacs
|
|
|
|
# Never run merge request pipelines, they usually duplicate push pipelines
|
|
# see https://docs.gitlab.com/ee/ci/yaml/README.html#common-if-clauses-for-rules
|
|
|
|
# Rules: always run tags and branches named master*, emacs*, feature*, fix*
|
|
# Test that it triggers by pushing a tag: `git tag mytag; git push origin mytag`
|
|
# Test that it triggers by pushing to: feature/emba, feature1, master, master-2, fix/emba, emacs-299, fix-2
|
|
# Test that it doesn't trigger by pushing to: scratch-2, scratch/emba, oldbranch, dev
|
|
workflow:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
when: never
|
|
- if: '$CI_COMMIT_TAG'
|
|
when: always
|
|
- if: '$CI_COMMIT_BRANCH !~ /^(master|emacs|feature|fix)/'
|
|
when: never
|
|
- when: always
|
|
|
|
variables:
|
|
GIT_DEPTH: 0
|
|
GIT_STRATEGY: fetch
|
|
EMACS_EMBA_CI: 1
|
|
EMACS_TEST_JUNIT_REPORT: junit-test-report.xml
|
|
EMACS_TEST_TIMEOUT: 3600
|
|
EMACS_TEST_VERBOSE: 1
|
|
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
|
|
# DOCKER_HOST: tcp://docker:2376
|
|
# DOCKER_TLS_CERTDIR: "/certs"
|
|
# Put the configuration for each run in a separate directory to
|
|
# avoid conflicts.
|
|
DOCKER_CONFIG: "/.docker-config-${CI_COMMIT_SHA}"
|
|
DOCKER_BUILDKIT: 1
|
|
# We don't use ${CI_COMMIT_SHA} to be able to do one bootstrap
|
|
# across multiple builds.
|
|
BUILD_TAG: ${CI_COMMIT_REF_SLUG}
|
|
# Disable if you don't need it, it can be a security risk.
|
|
# CI_DEBUG_TRACE: "true"
|
|
|
|
default:
|
|
image: docker:19.03.12
|
|
timeout: 3 hours
|
|
before_script:
|
|
- docker info
|
|
- echo "docker registry is ${CI_REGISTRY}"
|
|
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
|
|
|
|
.job-template:
|
|
variables:
|
|
test_name: ${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}
|
|
# These will be cached across builds.
|
|
cache:
|
|
key: ${CI_COMMIT_SHA}
|
|
paths: []
|
|
# These will be saved for followup builds.
|
|
artifacts:
|
|
expire_in: 24 hrs
|
|
paths: []
|
|
# Using the variables for each job.
|
|
script:
|
|
- docker pull ${CI_REGISTRY_IMAGE}:${target}-${BUILD_TAG}
|
|
- 'export PWD=$(pwd)'
|
|
- 'docker run -i -e EMACS_EMBA_CI=${EMACS_EMBA_CI} -e EMACS_TEST_JUNIT_REPORT=${EMACS_TEST_JUNIT_REPORT} -e EMACS_TEST_TIMEOUT=${EMACS_TEST_TIMEOUT} -e EMACS_TEST_VERBOSE=${EMACS_TEST_VERBOSE} -e NPROC=`nproc` --volumes-from $(docker ps -q -f "label=com.gitlab.gitlab-runner.job.id=${CI_JOB_ID}"):ro --name ${test_name} ${CI_REGISTRY_IMAGE}:${target}-${BUILD_TAG} /bin/bash -xvc "git fetch ${PWD} HEAD && echo checking out these updated files && git diff --name-only FETCH_HEAD && ( git diff --name-only FETCH_HEAD | xargs git checkout -f FETCH_HEAD ) && make -j \$NPROC && make -k -j \$NPROC ${make_params}"'
|
|
after_script:
|
|
# - docker ps -a
|
|
# - pwd; printenv
|
|
# - test -n "$(docker ps -aq -f name=${test_name})" && ( docker export ${test_name} | tar -tvf - )
|
|
# Prepare test artifacts.
|
|
- test -n "$(docker ps -aq -f name=${test_name})" && docker cp ${test_name}:checkout/test ${test_name}
|
|
- test -n "$(docker ps -aq -f name=${test_name})" && docker cp ${test_name}:checkout/configure.log ${test_name}
|
|
- test -n "$(docker ps -aq -f name=${test_name})" && docker rm ${test_name}
|
|
- find ${test_name} ! \( -name "*.log" -o -name ${EMACS_TEST_JUNIT_REPORT} \) -type f -delete
|
|
# BusyBox find does not know -empty.
|
|
- find ${test_name} -type d -depth -exec rmdir {} + 2>/dev/null
|
|
|
|
.build-template:
|
|
needs: []
|
|
cache:
|
|
policy: push
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
when: always
|
|
- changes:
|
|
- "**.in"
|
|
- GNUmakefile
|
|
- aclocal.m4
|
|
- autogen.sh
|
|
- configure.ac
|
|
- lib/*.{h,c}
|
|
- lib/malloc/*.{h,c}
|
|
- lisp/emacs-lisp/*.el
|
|
- src/*.{h,c}
|
|
- test/infra/*
|
|
- changes:
|
|
# gfilemonitor, kqueue
|
|
- src/gfilenotify.c
|
|
- src/kqueue.c
|
|
# MS Windows
|
|
- "**w32*"
|
|
# GNUstep
|
|
- lisp/term/ns-win.el
|
|
- src/ns*.{h,m}
|
|
- src/macfont.{h,m}
|
|
when: never
|
|
script:
|
|
- docker build --pull --target ${target} -t ${CI_REGISTRY_IMAGE}:${target}-${BUILD_TAG} -f test/infra/Dockerfile.emba .
|
|
- docker push ${CI_REGISTRY_IMAGE}:${target}-${BUILD_TAG}
|
|
|
|
.test-template:
|
|
cache:
|
|
policy: pull
|
|
artifacts:
|
|
name: ${test_name}
|
|
public: true
|
|
expire_in: 1 week
|
|
when: always
|
|
paths:
|
|
- ${test_name}/
|
|
reports:
|
|
junit: ${test_name}/${EMACS_TEST_JUNIT_REPORT}
|
|
|
|
.gnustep-template:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
changes:
|
|
- "**.in"
|
|
- src/ns*.{h,m}
|
|
- src/macfont.{h,m}
|
|
- lisp/term/ns-win.el
|
|
- nextstep/**
|
|
- test/infra/*
|
|
|
|
.filenotify-gio-template:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
# - if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
changes:
|
|
- "**.in"
|
|
- lisp/autorevert.el
|
|
- lisp/filenotify.el
|
|
- lisp/net/tramp-sh.el
|
|
- src/gfilenotify.c
|
|
- test/infra/*
|
|
- test/lisp/autorevert-tests.el
|
|
- test/lisp/filenotify-tests.el
|
|
|
|
.eglot-template:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
changes:
|
|
- "**.in"
|
|
- lisp/progmodes/eglot.el
|
|
- test/infra/*
|
|
- test/lisp/progmodes/eglot-tests.el
|
|
|
|
.tree-sitter-template:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
changes:
|
|
- "**.in"
|
|
- lisp/align.el
|
|
- lisp/progmodes/*-ts-mode.el
|
|
- lisp/progmodes/csharp-mode.el
|
|
- lisp/progmodes/js.el
|
|
- lisp/progmodes/python.el
|
|
- lisp/progmodes/sh-script.el
|
|
- lisp/textmodes/*-ts-mode.el
|
|
- lisp/textmodes/css-mode.el
|
|
- lisp/treesit.el
|
|
- src/treesit.{h,c}
|
|
- test/infra/*
|
|
- test/lisp/align-resources/**
|
|
- test/lisp/align-tests.el
|
|
- test/lisp/progmodes/*-ts-mode-resources/**
|
|
- test/lisp/progmodes/*-ts-mode-tests.el
|
|
- test/lisp/progmodes/csharp-mode-resources/**
|
|
- test/lisp/progmodes/csharp-mode-tests.el
|
|
- test/lisp/progmodes/js-resources/**
|
|
- test/lisp/progmodes/js-tests.el
|
|
- test/lisp/progmodes/python-tests.el
|
|
- test/lisp/textmodes/*-ts-mode-resources/**
|
|
- test/lisp/textmodes/*-ts-mode-tests.el
|
|
- test/src/treesit-tests.el
|
|
|
|
.native-comp-template:
|
|
rules:
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
changes:
|
|
- "**.in"
|
|
- lisp/emacs-lisp/comp*.el
|
|
- src/comp.{h,m}
|
|
- test/infra/*
|
|
- test/lisp/emacs-lisp/comp*-tests.el
|
|
- test/src/comp-resources/*.el
|
|
- test/src/comp-tests.el
|
|
timeout: 8 hours
|
|
|
|
stages:
|
|
- build-images
|
|
- normal
|
|
- platform-images
|
|
- platforms
|
|
- native-comp-images
|
|
- native-comp
|
|
|
|
build-image-inotify:
|
|
stage: build-images
|
|
extends: [.job-template, .build-template]
|
|
variables:
|
|
target: emacs-inotify
|
|
|
|
include: '/test/infra/test-jobs.yml'
|
|
|
|
test-all-inotify:
|
|
# This tests also file monitor libraries inotify and inotifywatch.
|
|
stage: normal
|
|
extends: [.job-template, .test-template]
|
|
needs:
|
|
- job: build-image-inotify
|
|
optional: true
|
|
rules:
|
|
# Note there's no "changes" section, so this always runs on a schedule.
|
|
- if: '$CI_PIPELINE_SOURCE == "web"'
|
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
variables:
|
|
target: emacs-inotify
|
|
make_params: check-expensive
|
|
|
|
build-image-filenotify-gio:
|
|
stage: platform-images
|
|
extends: [.job-template, .build-template, .filenotify-gio-template]
|
|
variables:
|
|
target: emacs-filenotify-gio
|
|
|
|
test-filenotify-gio:
|
|
# This tests file monitor libraries gfilemonitor and gio.
|
|
stage: platforms
|
|
extends: [.job-template, .test-template, .filenotify-gio-template]
|
|
needs:
|
|
- job: build-image-filenotify-gio
|
|
optional: true
|
|
variables:
|
|
target: emacs-filenotify-gio
|
|
# This is needed in order to get a JUnit test report.
|
|
make_params: >-
|
|
check-expensive
|
|
TEST_HOME=/root
|
|
LOGFILES="lisp/autorevert-tests.log lisp/filenotify-tests.log"
|
|
|
|
build-image-eglot:
|
|
stage: platform-images
|
|
extends: [.job-template, .build-template, .eglot-template]
|
|
variables:
|
|
target: emacs-eglot
|
|
|
|
test-eglot:
|
|
stage: platforms
|
|
extends: [.job-template, .test-template, .eglot-template]
|
|
needs:
|
|
- job: build-image-eglot
|
|
optional: true
|
|
variables:
|
|
target: emacs-eglot
|
|
# This is needed in order to get a JUnit test report.
|
|
make_params: >-
|
|
check-expensive
|
|
TEST_HOME=/root LOGFILES="lisp/progmodes/eglot-tests.log"
|
|
# EMACS_EXTRAOPT="--eval \(package-reinstall\ \(quote\ company\)\)
|
|
# --eval \(package-reinstall\ \(quote\ yasnippet\)\)
|
|
# --eval \(use-package\ company\)
|
|
# --eval \(use-package\ yasnippet\)"
|
|
|
|
build-image-tree-sitter:
|
|
stage: platform-images
|
|
extends: [.job-template, .build-template, .tree-sitter-template]
|
|
variables:
|
|
target: emacs-tree-sitter
|
|
|
|
test-tree-sitter:
|
|
stage: platforms
|
|
extends: [.job-template, .test-template, .tree-sitter-template, .tree-sitter-files]
|
|
needs:
|
|
- job: build-image-tree-sitter
|
|
optional: true
|
|
variables:
|
|
target: emacs-tree-sitter
|
|
selector: >-
|
|
\(and\ \$\{SELECTOR_EXPENSIVE\}\ \(or\ \\\"^treesit\\\"\ \\\"-ts-\\\"\)\)
|
|
# This is needed in order to get a JUnit test report.
|
|
make_params: >-
|
|
check SELECTOR=$selector TEST_HOME=/root LOGFILES="$tree_sitter_files"
|
|
|
|
build-image-gnustep:
|
|
stage: platform-images
|
|
extends: [.job-template, .build-template, .gnustep-template]
|
|
variables:
|
|
target: emacs-gnustep
|
|
|
|
test-gnustep:
|
|
# This tests the GNUstep build process.
|
|
stage: platforms
|
|
extends: [.job-template, .gnustep-template]
|
|
needs:
|
|
- job: build-image-gnustep
|
|
optional: true
|
|
variables:
|
|
target: emacs-gnustep
|
|
make_params: install
|
|
|
|
# The next two jobs are commented out due to high workload on
|
|
# emba.gnu.org.
|
|
|
|
# build-native-comp-speed0:
|
|
# stage: native-comp-images
|
|
# extends: [.job-template, .build-template, .native-comp-template]
|
|
# variables:
|
|
# target: emacs-native-comp-speed0
|
|
|
|
# build-native-comp-speed1:
|
|
# stage: native-comp-images
|
|
# extends: [.job-template, .build-template, .native-comp-template]
|
|
# variables:
|
|
# target: emacs-native-comp-speed1
|
|
|
|
build-native-comp-speed2:
|
|
stage: native-comp-images
|
|
extends: [.job-template, .build-template, .native-comp-template]
|
|
variables:
|
|
target: emacs-native-comp-speed2
|
|
|
|
test-native-comp-speed2:
|
|
stage: native-comp
|
|
extends: [.job-template, .test-template, .native-comp-template]
|
|
needs:
|
|
- job: build-native-comp-speed2
|
|
optional: true
|
|
variables:
|
|
target: emacs-native-comp-speed2
|
|
make_params: check SELECTOR='(not (tag :unstable))'
|
|
|
|
# Local Variables:
|
|
# add-log-current-defun-header-regexp: "^\\([-_.[:alnum:]]+\\)[ \t]*:"
|
|
# End:
|