1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-06 11:50:51 -08:00
emacs/test/infra/gitlab-ci.yml
Michael Albinus 771370dea5 Adapt filenotify-tests.el for Emba
* test/infra/gitlab-ci.yml (.filenotify-gio-template): Enable also
for scheduled jobs.

* test/lisp/filenotify-tests.el (file-notify--test-cleanup):
Fix docstring.
(file-notify--deftest-remote): Use `file-notify--test-cleanup'.
(file-notify-test03-events, file-notify-test05-file-validity)
(file-notify-test06-dir-validity)
(file-notify-test07-many-events)
(file-notify-test09-watched-file-in-watched-dir): Adapt tests.
(file-notify-test03-events-remote)
(file-notify-test04-autorevert-remote)
(file-notify-test07-many-events-remote)
(file-notify-test09-watched-file-in-watched-dir-remote): Do not
tag as :unstable.
2025-07-06 14:41:02 +02:00

401 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.
# Author: Ted Zlatanov <tzz@lifelogs.com>
# Maintainer: Michael Albinus <michael.albinus@gmx.de>
# 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`
-e http_proxy=${http_proxy}
-e https_proxy=${https_proxy}
-e no_proxy=${no_proxy}
--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
# 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/config.log ${test_name} || true'
- 'test -n "$(docker ps -aq -f name=${test_name})" &&
docker cp ${test_name}:checkout/compatibility-report.html ${test_name} ||
true'
- 'test -n "$(docker ps -aq -f name=${test_name})" && docker rm ${test_name}'
- 'test -d ${test_name} &&
find ${test_name}
! \( -name "*.log" -o -name ${EMACS_TEST_JUNIT_REPORT} -o
-name compatibility-report.html \) -type f -delete'
# BusyBox find does not know -empty.
- 'test -d ${test_name} &&
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/c-ts-common.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 \(use-package\ company\ :ensure\ t\) --eval \(use-package\ yasnippet\ :ensure\ t\)'
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: