2018-12-10 10:28:31 +03:00
#!/usr/bin/env python3
2010-09-25 23:51:51 +04:00
# run tests on all Samba subprojects and push to a git tree on success
# Copyright Andrew Tridgell 2010
# released under GNU GPL v3 or later
2020-11-20 12:20:14 +03:00
from subprocess import call , check_call , check_output , Popen , PIPE , CalledProcessError
2018-07-30 09:21:38 +03:00
import os
import tarfile
import sys
import time
2019-05-22 13:34:57 +03:00
import random
2010-09-25 23:51:51 +04:00
from optparse import OptionParser
2010-09-30 21:41:36 +04:00
import smtplib
2015-04-14 08:18:02 +03:00
import email
2010-09-30 21:41:36 +04:00
from email . mime . text import MIMEText
2015-04-14 08:18:02 +03:00
from email . mime . base import MIMEBase
from email . mime . application import MIMEApplication
from email . mime . multipart import MIMEMultipart
2022-12-21 18:02:18 +03:00
from sysconfig import get_path
2015-04-14 08:18:02 +03:00
import platform
2024-08-28 00:39:36 +03:00
import ssl
2010-09-25 23:51:51 +04:00
2024-08-28 22:34:09 +03:00
def get_libc_version ( ) :
import ctypes
libc = ctypes . CDLL ( " libc.so.6 " )
gnu_get_libc_version = libc . gnu_get_libc_version
gnu_get_libc_version . restype = ctypes . c_char_p
return gnu_get_libc_version ( ) . decode ( )
2023-03-23 04:28:49 +03:00
import logging
2018-09-03 13:07:23 +03:00
try :
from waflib . Build import CACHE_SUFFIX
except ImportError :
sys . path . insert ( 0 , " ./third_party/waf " )
from waflib . Build import CACHE_SUFFIX
2023-03-23 04:28:49 +03:00
logging . basicConfig ( format = ' %(asctime)s %(message)s ' )
logger = logging . getLogger ( ' autobuild ' )
logger . setLevel ( logging . INFO )
2018-09-03 13:07:23 +03:00
2017-01-11 16:48:45 +03:00
os . environ [ " PYTHONUNBUFFERED " ] = " 1 "
2012-06-22 04:14:36 +04:00
# This speeds up testing remarkably.
os . environ [ ' TDB_NO_FSYNC ' ] = ' 1 '
2022-04-12 18:04:53 +03:00
# allow autobuild to run within git rebase -i
if " GIT_DIR " in os . environ :
del os . environ [ " GIT_DIR " ]
if " GIT_WORK_TREE " in os . environ :
del os . environ [ " GIT_WORK_TREE " ]
2019-05-03 13:34:32 +03:00
def find_git_root ( ) :
''' get to the top of the git repo '''
p = os . getcwd ( )
while p != ' / ' :
2020-02-28 01:58:42 +03:00
if os . path . exists ( os . path . join ( p , " .git " ) ) :
2019-05-03 13:34:32 +03:00
return p
p = os . path . abspath ( os . path . join ( p , ' .. ' ) )
return None
gitroot = find_git_root ( )
if gitroot is None :
raise Exception ( " Failed to find git root " )
2019-05-03 13:41:51 +03:00
def_testbase = os . getenv ( " AUTOBUILD_TESTBASE " , " /memdisk/ %s " % os . getenv ( ' USER ' ) )
parser = OptionParser ( )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --tail " , help = " show output while running " , default = False , action = " store_true " )
parser . add_option ( " --keeplogs " , help = " keep logs " , default = False , action = " store_true " )
parser . add_option ( " --nocleanup " , help = " don ' t remove test tree " , default = False , action = " store_true " )
2020-12-17 13:53:21 +03:00
parser . add_option ( " --skip-dependencies " , help = " skip to run task dependency tasks " , default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --testbase " , help = " base directory to run tests in (default %s ) " % def_testbase ,
2019-05-03 13:41:51 +03:00
default = def_testbase )
2020-09-11 02:22:10 +03:00
parser . add_option ( " --full-testbase " , help = " full base directory to run tests in (default %s /b$PID) " % def_testbase ,
default = None )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --passcmd " , help = " command to run on success " , default = None )
parser . add_option ( " --verbose " , help = " show all commands as they are run " ,
2019-05-03 13:41:51 +03:00
default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --rebase " , help = " rebase on the given tree before testing " ,
2019-05-03 13:41:51 +03:00
default = None , type = ' str ' )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --pushto " , help = " push to a git url on success " ,
2019-05-03 13:41:51 +03:00
default = None , type = ' str ' )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --mark " , help = " add a Tested-By signoff before pushing " ,
2019-05-03 13:41:51 +03:00
default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --fix-whitespace " , help = " fix whitespace on rebase " ,
2019-05-03 13:41:51 +03:00
default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --retry " , help = " automatically retry if master changes " ,
2019-05-03 13:41:51 +03:00
default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --email " , help = " send email to the given address on failure " ,
2019-05-03 13:41:51 +03:00
type = ' str ' , default = None )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --email-from " , help = " send email from the given address " ,
2019-05-03 13:41:51 +03:00
type = ' str ' , default = " autobuild@samba.org " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --email-server " , help = " send email via the given server " ,
2019-05-03 13:41:51 +03:00
type = ' str ' , default = ' localhost ' )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --always-email " , help = " always send email, even on success " ,
2019-05-03 13:41:51 +03:00
action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --daemon " , help = " daemonize after initial setup " ,
2019-05-03 13:41:51 +03:00
action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --branch " , help = " the branch to work on (default=master) " ,
2019-05-03 13:41:51 +03:00
default = " master " , type = ' str ' )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --log-base " , help = " location where the logs can be found (default=cwd) " ,
2019-05-03 13:41:51 +03:00
default = gitroot , type = ' str ' )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --attach-logs " , help = " Attach logs to mails sent on success/failure? " ,
2019-05-03 13:41:51 +03:00
default = False , action = " store_true " )
2019-05-23 05:04:18 +03:00
parser . add_option ( " --restrict-tests " , help = " run as make test with this TESTS= regex " ,
2019-05-03 13:41:51 +03:00
default = ' ' )
2019-05-03 17:32:40 +03:00
parser . add_option ( " --enable-coverage " , dest = ' enable_coverage ' ,
action = " store_const " , const = ' --enable-coverage ' , default = ' ' ,
help = " Add --enable-coverage option while configure " )
2019-05-03 13:41:51 +03:00
( options , args ) = parser . parse_args ( )
if options . retry :
if options . rebase is None :
raise Exception ( ' You can only use --retry if you also rebase ' )
2023-03-23 04:39:55 +03:00
if options . verbose :
logger . setLevel ( logging . DEBUG )
2020-09-11 02:22:10 +03:00
if options . full_testbase is not None :
testbase = options . full_testbase
else :
testbase = " %s /b %u " % ( options . testbase , os . getpid ( ) )
2019-05-03 13:41:51 +03:00
test_master = " %s /master " % testbase
test_prefix = " %s /prefix " % testbase
test_tmpdir = " %s /tmp " % testbase
os . environ [ ' TMPDIR ' ] = test_tmpdir
2019-05-03 18:00:53 +03:00
if options . enable_coverage :
LCOV_CMD = " cd $ {TEST_SOURCE_DIR} && lcov --capture --directory . --output-file $ {LOG_BASE} /$ {NAME} .info --rc ' geninfo_adjust_src_path=$ {TEST_SOURCE_DIR} / ' "
else :
LCOV_CMD = ' echo " lcov skipped since no --enable-coverage specified " '
2019-05-03 13:41:51 +03:00
2021-04-16 02:16:17 +03:00
if options . enable_coverage :
PUBLISH_DOCS = " mkdir -p $ {LOG_BASE} /public && mv output/htmldocs $ {LOG_BASE} /public/htmldocs "
else :
PUBLISH_DOCS = ' echo " HTML documentation publishing skipped since no --enable-coverage specified " '
2020-11-19 16:41:16 +03:00
CLEAN_SOURCE_TREE_CMD = " cd $ {TEST_SOURCE_DIR} && script/clean-source-tree.sh "
2022-02-14 16:59:13 +03:00
def check_symbols ( sofile , expected_symbols = " " ) :
return " objdump --dynamic-syms " + sofile + " | " + \
2022-04-01 10:13:40 +03:00
" awk \' $0 !~ / " + expected_symbols + " / { if ($2 == \" g \" && $3 ~ /D(F|O)/ && $4 ~ /(.bss|.text)/ && $7 !~ /(__gcov_|mangle_path)/) exit 1} \' "
2021-08-23 15:56:15 +03:00
2024-08-05 15:51:01 +03:00
def check_versioned_symbol ( sofile , symvol , version ) :
return " objdump --dynamic-syms " + sofile + " | " + \
" awk \' $7 == \" " + symvol + " \" { " + \
" if ($2 == \" g \" && $3 ~ /D(F|O)/ && $4 ~ /(.bss|.text)/ && " + \
" $6 == \" " + version + " \" ) print $0 } \' " + \
" | wc -l | grep -q \' ^1$ \' "
2019-05-22 13:34:57 +03:00
if args :
# If we are only running specific test,
# do not sleep randomly to wait for it to start
def random_sleep ( low , high ) :
return ' sleep 1 '
else :
def random_sleep ( low , high ) :
return ' sleep {} ' . format ( random . randint ( low , high ) )
2010-09-25 23:51:51 +04:00
cleanup_list = [ ]
2011-02-07 02:05:32 +03:00
builddirs = {
2018-07-30 09:17:14 +03:00
" ctdb " : " ctdb " ,
" tdb " : " lib/tdb " ,
" talloc " : " lib/talloc " ,
" replace " : " lib/replace " ,
" tevent " : " lib/tevent " ,
2020-06-03 03:33:50 +03:00
" pidl " : " pidl " ,
" docs-xml " : " docs-xml "
2018-07-30 09:14:37 +03:00
}
2011-02-07 02:05:32 +03:00
2014-11-11 16:55:55 +03:00
ctdb_configure_params = " --enable-developer $ {PREFIX} "
samba_configure_params = " $ {ENABLE_COVERAGE} $ {PREFIX} --with-profiling-data "
2011-02-07 02:05:32 +03:00
2024-08-28 22:34:09 +03:00
# We cannot configure himmelblau on old systems missing openssl 3 or with glibc
# older than version 2.32.
2024-08-28 00:39:36 +03:00
himmelblau_configure_params = ' '
2024-08-28 22:34:09 +03:00
rust_configure_param = ' '
glibc_vers = float ( ' . ' . join ( get_libc_version ( ) . split ( ' . ' ) [ : 2 ] ) )
if glibc_vers > = 2.32 :
rust_configure_param = ' --enable-rust '
if ssl . OPENSSL_VERSION_INFO [ 0 ] > = 3 and rust_configure_param :
2024-08-28 00:39:36 +03:00
himmelblau_configure_params = rust_configure_param + ' --with-himmelblau '
2018-11-24 14:13:47 +03:00
samba_libs_envvars = " PYTHONPATH=$ {PYTHON_PREFIX} :$PYTHONPATH "
2015-08-13 18:34:42 +03:00
samba_libs_envvars + = " PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$ {PREFIX_DIR} /lib/pkgconfig "
2015-08-14 09:40:37 +03:00
samba_libs_envvars + = " ADDITIONAL_CFLAGS= ' -Wmissing-prototypes ' "
2014-11-11 16:55:55 +03:00
samba_libs_configure_base = samba_libs_envvars + " ./configure --abi-check $ {ENABLE_COVERAGE} --enable-debug -C $ {PREFIX} "
2019-02-15 01:58:51 +03:00
samba_libs_configure_libs = samba_libs_configure_base + " --bundled-libraries=cmocka,popt,NONE "
2024-02-14 05:38:28 +03:00
samba_libs_configure_bundled_libs = " --bundled-libraries=!talloc,!pytalloc-util,!tdb,!pytdb,!tevent,!pytevent,!popt "
2019-02-15 01:58:51 +03:00
samba_libs_configure_samba = samba_libs_configure_base + samba_libs_configure_bundled_libs
2016-02-01 14:55:34 +03:00
2019-05-22 14:29:56 +03:00
def format_option ( name , value = None ) :
""" Format option as str list. """
if value is None : # boolean option
return [ name ]
if not isinstance ( value , list ) : # single value option
value = [ value ]
# repeatable option
return [ ' {} = {} ' . format ( name , item ) for item in value ]
def make_test (
2020-12-17 13:53:21 +03:00
cmd = ' make testonly ' ,
2020-11-19 17:01:04 +03:00
INJECT_SELFTEST_PREFIX = 1 ,
2019-05-22 14:29:56 +03:00
TESTS = ' ' ,
include_envs = None ,
exclude_envs = None ) :
test_options = [ ]
if include_envs :
test_options = format_option ( ' --include-env ' , include_envs )
if exclude_envs :
test_options = format_option ( ' --exclude-env ' , exclude_envs )
if test_options :
# join envs options to original test options
TESTS = ( TESTS + ' ' + ' ' . join ( test_options ) ) . strip ( )
_options = [ ]
2021-09-17 07:43:00 +03:00
# Allow getting a full CI with
# git push -o ci.variable='AUTOBUILD_FAIL_IMMEDIATELY=0'
FAIL_IMMEDIATELY = os . getenv ( " AUTOBUILD_FAIL_IMMEDIATELY " , " 1 " )
if int ( FAIL_IMMEDIATELY ) :
2019-05-22 14:29:56 +03:00
_options . append ( ' FAIL_IMMEDIATELY=1 ' )
if TESTS :
_options . append ( " TESTS= ' {} ' " . format ( TESTS ) )
2020-11-19 17:01:04 +03:00
if INJECT_SELFTEST_PREFIX :
_options . append ( " TEST_OPTIONS= ' --with-selftest-prefix= {} ' " . format ( " $ {SELFTEST_PREFIX} " ) )
_options . append ( " --directory= ' {} ' " . format ( " $ {TEST_SOURCE_DIR} " ) )
2019-05-22 14:29:56 +03:00
return ' ' . join ( [ cmd ] + _options )
2019-12-10 00:59:49 +03:00
# When updating this list, also update .gitlab-ci.yml to add the job
# and to make it a dependency of 'page' for the coverage report.
2010-09-25 23:51:51 +04:00
tasks = {
2020-11-19 13:49:25 +03:00
" ctdb " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " configure " , " ./configure " + ctdb_configure_params ) ,
( " make " , " make all " ) ,
( " install " , " make install " ) ,
( " test " , " make autotest " ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" docs-xml " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " autoconf " , " autoconf " ) ,
( " configure " , " ./configure " ) ,
( " make " , " make html htmlman " ) ,
2021-04-16 02:16:17 +03:00
( " publish-docs " , PUBLISH_DOCS ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
2020-06-03 03:33:50 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2020-06-03 03:33:50 +03:00
2020-11-19 17:23:00 +03:00
" samba-def-build " : {
" git-clone-required " : True ,
" sequence " : [
( " configure " , " ./configure.developer " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
" samba-mit-build " : {
" git-clone-required " : True ,
" sequence " : [
( " configure " , " ./configure.developer --with-system-mitkrb5 --with-experimental-mit-ad-dc " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
2020-12-28 19:12:39 +03:00
" samba-nt4-build " : {
" git-clone-required " : True ,
" sequence " : [
( " configure " , " ./configure.developer --without-ad-dc --without-ldap --without-ads --without-json " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
" samba-h5l-build " : {
" git-clone-required " : True ,
" sequence " : [
( " configure " , " ./configure.developer --without-ad-dc --with-system-heimdalkrb5 " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
2022-03-04 00:07:50 +03:00
" samba-without-smb1-build " : {
" git-clone-required " : True ,
" sequence " : [
( " configure " , " ./configure.developer --without-smb1-server --without-ad-dc " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
2020-12-28 19:12:39 +03:00
" samba-no-opath-build " : {
" git-clone-required " : True ,
" sequence " : [
2023-12-19 13:12:49 +03:00
( " configure " , " ADDITIONAL_CFLAGS= ' -DDISABLE_OPATH=1 -DDISABLE_VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS=1 -DDISABLE_PROC_FDS=1 ' ./configure.developer --without-ad-dc " + samba_configure_params ) ,
2020-12-28 19:12:39 +03:00
( " make " , " make -j " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " chmod-R-a-w " , " chmod -R a-w . " ) ,
] ,
} ,
2019-01-23 11:43:33 +03:00
# We have 'test' before 'install' because, 'test' should work without 'install (runs all the other envs)'
2020-11-19 13:49:25 +03:00
" samba " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2024-08-28 00:39:36 +03:00
( " configure " , " ./configure.developer " + himmelblau_configure_params + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " make " , " make -j " ) ,
( " test " , make_test ( exclude_envs = [
2019-05-22 14:29:56 +03:00
" none " ,
" nt4_dc " ,
2019-12-13 13:24:07 +03:00
" nt4_dc_smb1 " ,
2019-12-18 13:26:14 +03:00
" nt4_dc_smb1_done " ,
2019-05-22 14:29:56 +03:00
" nt4_dc_schannel " ,
" nt4_member " ,
" ad_dc " ,
2019-12-06 18:20:48 +03:00
" ad_dc_smb1 " ,
2019-12-18 13:20:45 +03:00
" ad_dc_smb1_done " ,
2019-05-22 14:29:56 +03:00
" ad_dc_backup " ,
" ad_dc_ntvfs " ,
" ad_dc_default " ,
2019-12-18 13:31:29 +03:00
" ad_dc_default_smb1 " ,
2019-05-22 14:29:56 +03:00
" ad_dc_slowtests " ,
" ad_dc_no_nss " ,
" ad_dc_no_ntlm " ,
" fl2003dc " ,
" fl2008dc " ,
" fl2008r2dc " ,
" ad_member " ,
" ad_member_idmap_rid " ,
2022-02-15 14:38:00 +03:00
" admem_idmap_autorid " ,
2019-05-22 14:29:56 +03:00
" ad_member_idmap_ad " ,
2019-11-04 09:47:15 +03:00
" ad_member_rfc2307 " ,
2024-01-15 12:33:05 +03:00
" ad_member_idmap_nss " ,
2020-10-08 15:00:44 +03:00
" ad_member_oneway " ,
2019-11-04 09:47:15 +03:00
" chgdcpass " ,
" vampire_2000_dc " ,
" fl2000dc " ,
" fileserver " ,
2020-01-07 13:17:49 +03:00
" fileserver_smb1 " ,
2019-12-18 13:21:49 +03:00
" fileserver_smb1_done " ,
2019-11-04 09:47:15 +03:00
" maptoguest " ,
" simpleserver " ,
" backupfromdc " ,
" restoredc " ,
" renamedc " ,
" offlinebackupdc " ,
" labdc " ,
" preforkrestartdc " ,
" proclimitdc " ,
" promoted_dc " ,
" vampire_dc " ,
" rodc " ,
" ad_dc_default " ,
2019-12-18 13:31:29 +03:00
" ad_dc_default_smb1 " ,
2019-12-18 13:32:59 +03:00
" ad_dc_default_smb1_done " ,
2019-11-04 09:47:15 +03:00
" ad_dc_slowtests " ,
" schema_pair_dc " ,
" schema_dc " ,
2020-10-16 17:09:33 +03:00
" clusteredmember " ,
2021-07-20 20:06:28 +03:00
" ad_dc_fips " ,
" ad_member_fips " ,
2019-11-04 09:47:15 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " test-slow-none " , make_test ( cmd = ' make test ' , TESTS = " --include=selftest/slow-none " , include_envs = [ " none " ] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " install " , " make install " ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
2019-11-04 09:47:15 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2019-11-04 09:47:15 +03:00
# We have 'test' before 'install' because, 'test' should work without 'install (runs all the other envs)'
2020-11-19 13:49:25 +03:00
" samba-mitkrb5 " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2020-11-19 17:01:04 +03:00
( " configure " , " ./configure.developer --with-system-mitkrb5 --with-experimental-mit-ad-dc " + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " make " , " make -j " ) ,
( " test " , make_test ( exclude_envs = [
2019-11-04 09:47:15 +03:00
" none " ,
" nt4_dc " ,
2019-12-13 13:24:07 +03:00
" nt4_dc_smb1 " ,
2019-12-18 13:26:14 +03:00
" nt4_dc_smb1_done " ,
2019-11-04 09:47:15 +03:00
" nt4_dc_schannel " ,
" nt4_member " ,
" ad_dc " ,
2019-12-06 18:20:48 +03:00
" ad_dc_smb1 " ,
2019-12-18 13:20:45 +03:00
" ad_dc_smb1_done " ,
2019-11-04 09:47:15 +03:00
" ad_dc_backup " ,
" ad_dc_ntvfs " ,
" ad_dc_default " ,
2019-12-18 13:31:29 +03:00
" ad_dc_default_smb1 " ,
2019-12-18 13:32:59 +03:00
" ad_dc_default_smb1_done " ,
2019-11-04 09:47:15 +03:00
" ad_dc_slowtests " ,
" ad_dc_no_nss " ,
" ad_dc_no_ntlm " ,
" fl2003dc " ,
" fl2008dc " ,
" fl2008r2dc " ,
" ad_member " ,
" ad_member_idmap_rid " ,
2022-02-15 14:38:00 +03:00
" admem_idmap_autorid " ,
2019-11-04 09:47:15 +03:00
" ad_member_idmap_ad " ,
2019-05-22 14:29:56 +03:00
" ad_member_rfc2307 " ,
2024-01-15 12:33:05 +03:00
" ad_member_idmap_nss " ,
2020-10-08 15:00:44 +03:00
" ad_member_oneway " ,
2019-05-22 14:29:56 +03:00
" chgdcpass " ,
" vampire_2000_dc " ,
" fl2000dc " ,
" fileserver " ,
2020-01-07 13:17:49 +03:00
" fileserver_smb1 " ,
2019-12-18 13:21:49 +03:00
" fileserver_smb1_done " ,
2019-05-22 14:29:56 +03:00
" maptoguest " ,
" simpleserver " ,
" backupfromdc " ,
" restoredc " ,
" renamedc " ,
" offlinebackupdc " ,
" labdc " ,
" preforkrestartdc " ,
" proclimitdc " ,
" promoted_dc " ,
" vampire_dc " ,
" rodc " ,
" ad_dc_default " ,
2019-12-18 13:31:29 +03:00
" ad_dc_default_smb1 " ,
2019-12-18 13:32:59 +03:00
" ad_dc_default_smb1_done " ,
2019-05-22 14:29:56 +03:00
" ad_dc_slowtests " ,
" schema_pair_dc " ,
" schema_dc " ,
2020-10-16 17:09:33 +03:00
" clusteredmember " ,
2021-07-20 20:06:28 +03:00
" ad_dc_fips " ,
" ad_member_fips " ,
2019-05-22 14:29:56 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
( " install " , " make install " ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-nt4 " : {
2020-12-28 19:12:39 +03:00
" dependency " : " samba-nt4-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" nt4_dc " ,
2019-12-13 13:24:07 +03:00
" nt4_dc_smb1 " ,
2019-12-18 13:26:14 +03:00
" nt4_dc_smb1_done " ,
2019-05-22 14:29:56 +03:00
" nt4_dc_schannel " ,
" nt4_member " ,
2020-03-21 22:15:30 +03:00
" simpleserver " ,
2019-05-22 14:29:56 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-fileserver " : {
2020-12-28 19:12:39 +03:00
" dependency " : " samba-h5l-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" fileserver " ,
2020-01-07 13:17:49 +03:00
" fileserver_smb1 " ,
2019-12-18 13:21:49 +03:00
" fileserver_smb1_done " ,
2019-05-22 14:29:56 +03:00
" maptoguest " ,
2021-08-18 05:59:47 +03:00
" ktest " , # ktest is also tested in samba-ktest-mit samba
# and samba-mitkrb5 but is tested here against
# a system Heimdal
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
] ,
} ,
2022-03-04 00:07:50 +03:00
" samba-fileserver-without-smb1 " : {
" dependency " : " samba-without-smb1-build " ,
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [ " fileserver " ] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
] ,
} ,
2021-08-18 05:59:47 +03:00
# This is a full build without the AD DC so we test the build with
# MIT Kerberos from the current system. Runtime behaviour is
# confirmed via the ktest (static ccache and keytab) environment
2022-06-07 06:07:59 +03:00
# This environment also used to confirm we can still build with --with-libunwind
2021-08-18 05:59:47 +03:00
" samba-ktest-mit " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2022-06-07 06:07:59 +03:00
( " configure " , " ./configure.developer --without-ad-dc --with-libunwind --with-system-mitkrb5 " + samba_configure_params ) ,
2021-08-18 05:59:47 +03:00
( " make " , " make -j " ) ,
( " test " , make_test ( include_envs = [
" ktest " , # ktest is also tested in fileserver, samba and
# samba-mitkrb5 but is tested here against a
# system MIT krb5
2019-10-30 23:45:55 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-10-30 23:45:55 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-admem " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" ad_member " ,
" ad_member_idmap_rid " ,
2022-02-15 14:38:00 +03:00
" admem_idmap_autorid " ,
2019-05-22 14:29:56 +03:00
" ad_member_idmap_ad " ,
" ad_member_rfc2307 " ,
2024-01-15 12:33:05 +03:00
" ad_member_idmap_nss " ,
2021-05-19 09:18:22 +03:00
" ad_member_offlogon " ,
2019-05-22 14:29:56 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2020-12-30 03:33:00 +03:00
" samba-no-opath1 " : {
2020-12-28 19:12:39 +03:00
" dependency " : " samba-no-opath-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test (
2020-12-30 03:33:00 +03:00
cmd = " make testonly DISABLE_OPATH=1 " ,
2020-11-19 13:49:25 +03:00
include_envs = [
" nt4_dc " ,
" nt4_dc_smb1 " ,
" nt4_dc_smb1_done " ,
" nt4_dc_schannel " ,
" nt4_member " ,
" simpleserver " ,
2020-12-30 03:33:00 +03:00
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , " script/clean-source-tree.sh " ) ,
] ,
} ,
" samba-no-opath2 " : {
" dependency " : " samba-no-opath-build " ,
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test (
cmd = " make testonly DISABLE_OPATH=1 " ,
include_envs = [
2020-11-19 13:49:25 +03:00
" fileserver " ,
" fileserver_smb1 " ,
" fileserver_smb1_done " ,
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , " script/clean-source-tree.sh " ) ,
2020-06-22 14:32:45 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-ad-dc-1 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" ad_dc " ,
2019-12-06 18:20:48 +03:00
" ad_dc_smb1 " ,
2019-12-18 13:20:45 +03:00
" ad_dc_smb1_done " ,
2019-05-22 14:29:56 +03:00
" ad_dc_no_nss " ,
" ad_dc_no_ntlm " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-ad-dc-2 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" vampire_dc " ,
" vampire_2000_dc " ,
" rodc " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-ad-dc-3 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" promoted_dc " ,
" chgdcpass " ,
" preforkrestartdc " ,
" proclimitdc " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2020-12-30 04:01:30 +03:00
" samba-ad-dc-4a " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" fl2000dc " ,
2020-10-08 15:00:44 +03:00
" ad_member_oneway " ,
2019-05-22 14:29:56 +03:00
" fl2003dc " ,
2020-12-30 04:01:30 +03:00
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
] ,
} ,
" samba-ad-dc-4b " : {
" dependency " : " samba-def-build " ,
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" fl2008dc " ,
" fl2008r2dc " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-ad-dc-5 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-12-18 13:32:59 +03:00
" ad_dc_default " , " ad_dc_default_smb1 " , " ad_dc_default_smb1_done " ] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-ad-dc-6 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
2020-12-28 17:38:52 +03:00
( " test " , make_test ( include_envs = [ " ad_dc_slowtests " , " ad_dc_backup " ] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-schemaupgrade " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [ " schema_dc " , " schema_pair_dc " ] ) ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2019-04-02 00:45:36 +03:00
2019-01-23 11:43:33 +03:00
# We split out the ad_dc_ntvfs tests (which are long) so other test do not wait
# This is currently the longest task, so we don't randomly delay it.
2020-11-19 13:49:25 +03:00
" samba-ad-dc-ntvfs " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [ " ad_dc_ntvfs " ] ) ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2019-01-23 11:43:33 +03:00
2020-04-03 12:19:17 +03:00
# Test fips compliance
2020-11-19 13:49:25 +03:00
" samba-fips " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-mit-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
2020-11-19 17:23:00 +03:00
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
2020-11-19 13:49:25 +03:00
( " test " , make_test ( include_envs = [ " ad_dc_fips " , " ad_member_fips " ] ) ) ,
2020-12-30 14:11:55 +03:00
# TODO: This seems to generate only an empty samba-fips.info ("lcov", LCOV_CMD),
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-04-03 12:19:17 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2020-04-03 12:19:17 +03:00
2019-02-05 05:17:03 +03:00
# run the backup/restore testenvs separately as they're fairly standalone
2020-12-28 17:56:57 +03:00
# (and CI seems to max out at ~3 different DCs running at once)
" samba-ad-back1 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-def-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [
2019-05-22 14:29:56 +03:00
" backupfromdc " ,
" restoredc " ,
" renamedc " ,
2020-12-28 17:56:57 +03:00
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
] ,
} ,
" samba-ad-back2 " : {
" dependency " : " samba-def-build " ,
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " test " , make_test ( include_envs = [
" backupfromdc " ,
2019-05-22 14:29:56 +03:00
" offlinebackupdc " ,
" labdc " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-admem-mit " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-mit-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-10-09 16:55:50 +03:00
" ad_member " ,
" ad_member_idmap_rid " ,
2022-02-15 14:38:00 +03:00
" admem_idmap_autorid " ,
2019-10-09 16:55:50 +03:00
" ad_member_idmap_ad " ,
" ad_member_rfc2307 " ,
2024-01-15 12:33:05 +03:00
" ad_member_idmap_nss " ,
2021-05-19 09:18:22 +03:00
" ad_member_offlogon " ,
2019-10-09 16:55:50 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-10-09 16:55:50 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2021-08-03 14:20:40 +03:00
" samba-addc-mit-1 " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-mit-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2019-10-09 16:55:50 +03:00
" ad_dc " ,
2019-12-06 18:20:48 +03:00
" ad_dc_smb1 " ,
2019-12-18 13:20:45 +03:00
" ad_dc_smb1_done " ,
2019-10-09 16:55:50 +03:00
" ad_dc_no_nss " ,
" ad_dc_no_ntlm " ,
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-10-09 16:55:50 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2021-08-03 14:20:40 +03:00
" samba-addc-mit-4a " : {
2020-12-30 04:01:30 +03:00
" dependency " : " samba-mit-build " ,
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
" fl2000dc " ,
2020-10-08 15:00:44 +03:00
" ad_member_oneway " ,
2020-12-30 04:01:30 +03:00
" fl2003dc " ,
] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
] ,
} ,
2021-08-03 14:20:40 +03:00
" samba-addc-mit-4b " : {
2020-11-19 17:23:00 +03:00
" dependency " : " samba-mit-build " ,
2020-11-19 13:49:25 +03:00
" sequence " : [
( " random-sleep " , random_sleep ( 1 , 1 ) ) ,
( " test " , make_test ( include_envs = [
2021-09-01 00:40:08 +03:00
" fl2008dc " ,
" fl2008r2dc " ,
2019-10-09 16:55:50 +03:00
] ) ) ,
2020-11-19 13:49:25 +03:00
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2019-10-09 16:55:50 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
" samba-test-only " : {
" sequence " : [
2020-11-19 17:01:04 +03:00
( " configure " , " ./configure.developer --abi-check-disable " + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " make " , " make -j " ) ,
( " test " , make_test ( TESTS = " $ {TESTS} " ) ) ,
( " lcov " , LCOV_CMD ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2016-07-27 05:28:04 +03:00
2015-05-04 10:21:53 +03:00
# Test cross-compile infrastructure
2020-11-19 13:49:25 +03:00
" samba-xc " : {
" sequence " : [
( " random-sleep " , random_sleep ( 900 , 1500 ) ) ,
( " configure-native " , " ./configure.developer --with-selftest-prefix=./bin/ab " + samba_configure_params ) ,
( " configure-cross-execute " , " ./configure.developer --out ./bin-xe --cross-compile --cross-execute=script/identity_cc.sh " \
2019-05-22 13:17:28 +03:00
" --cross-answers=./bin-xe/cross-answers.txt --with-selftest-prefix=./bin-xe/ab " + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " verify-cross-execute-output " , " grep ' ^Checking value of NSIG ' ./bin-xe/cross-answers.txt " ) ,
( " configure-cross-answers " , " ./configure.developer --out ./bin-xa --cross-compile " \
2019-05-22 13:17:28 +03:00
" --cross-answers=./bin-xe/cross-answers.txt --with-selftest-prefix=./bin-xa/ab " + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " compare-results " , " script/compare_cc_results.py "
2019-05-22 13:11:28 +03:00
" ./bin/c4che/default {} "
" ./bin-xe/c4che/default {} "
2019-05-22 13:17:28 +03:00
" ./bin-xa/c4che/default {} " . format ( * ( [ CACHE_SUFFIX ] * 3 ) ) ) ,
2020-11-19 13:49:25 +03:00
( " modify-cross-answers " , " sed -i.bak -e ' s/^ \\ (Checking value of NSIG: \\ ) .*/ \\ 1 \" 1234 \" / ' ./bin-xe/cross-answers.txt " ) ,
( " configure-cross-answers-modified " , " ./configure.developer --out ./bin-xa2 --cross-compile " \
2019-10-09 21:53:43 +03:00
" --cross-answers=./bin-xe/cross-answers.txt --with-selftest-prefix=./bin-xa2/ab " + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " verify-cross-answers " , " test $(sed -n -e ' s/VALUEOF_NSIG = \\ (.* \\ )/ \\ 1/p ' ./bin-xa2/c4che/default {} ) " \
2019-10-09 21:53:43 +03:00
" = \" ' 1234 ' \" " . format ( CACHE_SUFFIX ) ) ,
2020-11-19 13:49:25 +03:00
( " invalidate-cross-answers " , " sed -i.bak -e ' /^Checking value of NSIG/d ' ./bin-xe/cross-answers.txt " ) ,
( " configure-cross-answers-fail " , " ./configure.developer --out ./bin-xa3 --cross-compile " \
2019-10-09 21:53:43 +03:00
" --cross-answers=./bin-xe/cross-answers.txt --with-selftest-prefix=./bin-xa3/ab " + samba_configure_params + \
" ; test $? -ne 0 " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2015-05-04 10:21:53 +03:00
2017-06-30 02:11:05 +03:00
# test build with -O3 -- catches extra warnings and bugs, tests the ad_dc environments
2020-11-19 13:49:25 +03:00
" samba-o3 " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2024-08-28 00:39:36 +03:00
( " configure " , " ADDITIONAL_CFLAGS= ' -O3 -Wp,-D_FORTIFY_SOURCE=2 ' ./configure.developer --abi-check-disable " + rust_configure_param + samba_configure_params ) ,
2020-11-19 13:49:25 +03:00
( " make " , " make -j " ) ,
( " test " , make_test ( cmd = ' make test ' , TESTS = " --exclude=selftest/slow-none " , include_envs = [ " none " ] ) ) ,
( " quicktest " , make_test ( cmd = ' make quicktest ' , include_envs = [ " ad_dc " , " ad_dc_smb1 " , " ad_dc_smb1_done " ] ) ) ,
( " lcov " , LCOV_CMD ) ,
( " install " , " make install " ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2019-05-22 13:11:28 +03:00
2022-11-22 12:41:39 +03:00
" samba-32bit " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " configure " , " ./configure.developer --abi-check-disable --disable-warnings-as-errors " + samba_configure_params ) ,
( " make " , " make -j " ) ,
( " nonetest " , make_test ( cmd = ' make test ' , TESTS = " --exclude=selftest/slow-none " , include_envs = [ " none " ] ) ) ,
( " quicktest " , make_test ( cmd = ' make quicktest ' , include_envs = [ " ad_dc " , " ad_dc_smb1 " , " ad_dc_smb1_done " ] ) ) ,
( " ktest " , make_test ( cmd = ' make test ' , include_envs = [ " ktest " ] ) ) ,
( " install " , " make install " ) ,
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " clean " , " make clean " ) ,
] ,
} ,
2020-11-19 13:49:25 +03:00
" samba-ctdb " : {
" sequence " : [
( " random-sleep " , random_sleep ( 900 , 1500 ) ) ,
2019-05-22 13:11:28 +03:00
# make sure we have tdb around:
2020-11-19 13:49:25 +03:00
( " tdb-configure " , " cd lib/tdb && PYTHONPATH=$ {PYTHON_PREFIX} :$PYTHONPATH PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$ {PREFIX_DIR} /lib/pkgconfig ./configure --bundled-libraries=NONE --abi-check --enable-debug -C $ {PREFIX} " ) ,
( " tdb-make " , " cd lib/tdb && make " ) ,
( " tdb-install " , " cd lib/tdb && make install " ) ,
2019-05-22 13:11:28 +03:00
# build samba with cluster support (also building ctdb):
2020-11-19 13:49:25 +03:00
( " samba-configure " ,
2020-02-14 19:19:46 +03:00
" PYTHONPATH=$ {PYTHON_PREFIX} :$PYTHONPATH "
" PKG_CONFIG_PATH=$ {PREFIX_DIR} /lib/pkgconfig:$ {PKG_CONFIG_PATH} "
" ./configure.developer $ {PREFIX} "
" --with-selftest-prefix=./bin/ab "
" --with-cluster-support "
" --bundled-libraries=!tdb " ) ,
2020-11-19 13:49:25 +03:00
( " samba-make " , " make " ) ,
2021-01-12 12:07:56 +03:00
( " samba-check " , " ./bin/smbd --configfile=/dev/null -b | grep CLUSTER_SUPPORT " ) ,
2020-11-19 13:49:25 +03:00
( " samba-install " , " make install " ) ,
( " ctdb-check " , " test -e $ {PREFIX_DIR} /sbin/ctdbd " ) ,
2019-05-22 13:11:28 +03:00
2020-11-19 17:01:04 +03:00
( " test " , make_test (
2024-01-15 15:06:57 +03:00
cmd = ' PYTHONPATH=$ {PYTHON_PREFIX} :$PYTHONPATH make test ' ,
2020-11-19 17:01:04 +03:00
INJECT_SELFTEST_PREFIX = 0 ,
include_envs = [ " clusteredmember " ] )
) ,
2018-10-16 14:56:14 +03:00
2019-05-22 13:11:28 +03:00
# clean up:
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
( " ctdb-clean " , " cd ./ctdb && make clean " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2012-06-20 16:05:50 +04:00
2020-11-19 13:49:25 +03:00
" samba-libs " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
( " talloc-configure " , " cd lib/talloc && " + samba_libs_configure_libs ) ,
( " talloc-make " , " cd lib/talloc && make " ) ,
( " talloc-install " , " cd lib/talloc && make install " ) ,
2024-08-06 15:43:29 +03:00
( " talloc-abi-check1 " ,
check_versioned_symbol (
" ./lib/talloc/bin/shared/libtalloc.so.2 " ,
" talloc_named " ,
" TALLOC_2.0.2 "
)
) ,
( " talloc-abi-check2 " ,
check_versioned_symbol (
" ./lib/talloc/bin/shared/libtalloc.so.2 " ,
" talloc_asprintf_addbuf " ,
" TALLOC_2.3.5 "
)
) ,
2019-05-22 13:11:28 +03:00
2020-11-19 13:49:25 +03:00
( " tdb-configure " , " cd lib/tdb && " + samba_libs_configure_libs ) ,
( " tdb-make " , " cd lib/tdb && make " ) ,
( " tdb-install " , " cd lib/tdb && make install " ) ,
2024-08-06 15:43:29 +03:00
( " tdb-abi-check1 " ,
check_versioned_symbol (
" ./lib/tdb/bin/shared/libtdb.so.1 " ,
" tdb_errorstr " ,
" TDB_1.2.1 "
)
) ,
( " tdb-abi-check2 " ,
check_versioned_symbol (
" ./lib/tdb/bin/shared/libtdb.so.1 " ,
" tdb_traverse_chain " ,
" TDB_1.3.17 "
)
) ,
2019-05-22 13:11:28 +03:00
2020-11-19 13:49:25 +03:00
( " tevent-configure " , " cd lib/tevent && " + samba_libs_configure_libs ) ,
( " tevent-make " , " cd lib/tevent && make " ) ,
( " tevent-install " , " cd lib/tevent && make install " ) ,
2024-08-06 15:43:29 +03:00
( " tevent-abi-check1 " ,
check_versioned_symbol (
" ./lib/tevent/bin/shared/libtevent.so.0 " ,
" _tevent_loop_once " ,
" TEVENT_0.9.9 "
)
) ,
( " tevent-abi-check2 " ,
check_versioned_symbol (
" ./lib/tevent/bin/shared/libtevent.so.0 " ,
" __tevent_req_create " ,
" TEVENT_0.15.0 "
)
) ,
2019-05-22 13:11:28 +03:00
2024-06-21 01:40:59 +03:00
( " nondevel-configure " , samba_libs_envvars + " ./configure --private-libraries= ' !ldb ' --vendor-suffix=TEST-STRING~5.1.2 $ {PREFIX} " ) ,
2020-11-19 13:49:25 +03:00
( " nondevel-make " , " make -j " ) ,
( " nondevel-check " , " ./bin/smbd -b | grep WITH_NTVFS_FILESERVER && exit 1; exit 0 " ) ,
2024-06-21 01:40:59 +03:00
( " nondevel-check " , " ./bin/smbd --version | grep -F ' TEST-STRING~5.1.2 ' && exit 0; exit 1 " ) ,
2021-08-20 12:21:13 +03:00
( " nondevel-no-libtalloc " , " find ./bin | grep -v ' libtalloc-report ' | grep ' libtalloc ' && exit 1; exit 0 " ) ,
( " nondevel-no-libtdb " , " find ./bin | grep -v ' libtdb-wrap ' | grep ' libtdb ' && exit 1; exit 0 " ) ,
( " nondevel-no-libtevent " , " find ./bin | grep -v ' libtevent-util ' | grep ' libtevent ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-samba-nss_winbind " , " ldd ./bin/plugins/libnss_winbind.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
( " nondevel-no-samba-nss_wins " , " ldd ./bin/plugins/libnss_wins.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
( " nondevel-no-samba-libwbclient " , " ldd ./bin/shared/libwbclient.so.0 | grep ' samba ' && exit 1; exit 0 " ) ,
( " nondevel-no-samba-pam_winbind " , " ldd ./bin/plugins/pam_winbind.so | grep -v ' libtalloc.so.2 ' | grep ' samba ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-nss_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/libnss_winbind.so.2 " , " _nss_winbind_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-nss_wins " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/libnss_wins.so.2 " , " _nss_wins_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-libwbclient " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/shared/libwbclient.so.0 " , " wbc " ) ) ,
2024-08-05 15:51:01 +03:00
( " nondevel-libwbclient-wbcCtxPingDc2@WBCLIENT_0.12 " ,
check_versioned_symbol ( " ./bin/shared/libwbclient.so.0 " , " wbcCtxPingDc2 " , " WBCLIENT_0.12 " ) ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-pam_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/pam_winbind.so " , " pam_sm_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-winbind_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/winbind_krb5_locator.so " , " service_locator " ) ) ,
2021-08-23 15:56:15 +03:00
( " nondevel-no-public-async_dns_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/async_dns_krb5_locator.so " , " service_locator " ) ) ,
2024-08-05 15:51:01 +03:00
( " nondevel-libndr-krb5pac-ndr_pull_PAC_DATA@NDR_KRB5PAC_0.0.1 " ,
check_versioned_symbol ( " ./bin/shared/libndr-krb5pac.so.0 " , " ndr_pull_PAC_DATA " , " NDR_KRB5PAC_0.0.1 " ) ) ,
2021-08-20 12:21:13 +03:00
( " nondevel-install " , " make -j install " ) ,
2020-11-19 13:49:25 +03:00
( " nondevel-dist " , " make dist " ) ,
2019-05-22 13:11:28 +03:00
2021-08-20 12:21:13 +03:00
( " prefix-no-private-libtalloc " , " find $ {PREFIX_DIR} | grep -v ' libtalloc-report ' | grep ' private.*libtalloc ' && exit 1; exit 0 " ) ,
( " prefix-no-private-libtdb " , " find $ {PREFIX_DIR} | grep -v ' libtdb-wrap ' | grep ' private.*libtdb ' && exit 1; exit 0 " ) ,
( " prefix-no-private-libtevent " , " find $ {PREFIX_DIR} | grep -v ' libtevent-util ' | grep ' private.*libtevent ' && exit 1; exit 0 " ) ,
2024-02-14 05:38:28 +03:00
( " prefix-no-private-libldb " , " find $ {PREFIX_DIR} | grep -v ' module ' | grep -v ' libldbsamba ' | grep ' private.*libldb.so ' && exit 1; exit 0 " ) ,
( " prefix-public-libldb " , " find $ {PREFIX_DIR} | grep ' lib/libldb.so ' && exit 0; exit 1 " ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-samba-nss_winbind " , " ldd $ {PREFIX_DIR} /lib/libnss_winbind.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
( " prefix-no-samba-nss_wins " , " ldd $ {PREFIX_DIR} /lib/libnss_wins.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
( " prefix-no-samba-libwbclient " , " ldd $ {PREFIX_DIR} /lib/libwbclient.so.0 | grep ' samba ' && exit 1; exit 0 " ) ,
( " prefix-no-samba-pam_winbind " , " ldd $ {PREFIX_DIR} /lib/security/pam_winbind.so | grep -v ' libtalloc.so.2 ' | grep ' samba ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-nss_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/libnss_winbind.so.2 " , " _nss_winbind_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-nss_wins " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/libnss_wins.so.2 " , " _nss_wins_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-libwbclient " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/libwbclient.so.0 " , " wbc " ) ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-pam_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/security/pam_winbind.so " , " pam_sm_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-winbind_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/krb5/winbind_krb5_locator.so " ,
" service_locator " ) ) ,
2021-08-23 15:56:15 +03:00
( " prefix-no-public-async_dns_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " $ {PREFIX_DIR} /lib/krb5/async_dns_krb5_locator.so " ,
" service_locator " ) ) ,
2021-08-20 12:21:13 +03:00
# retry with all modules shared
2020-11-19 13:49:25 +03:00
( " allshared-distclean " , " make distclean " ) ,
( " allshared-configure " , samba_libs_configure_samba + " --with-shared-modules=ALL " ) ,
( " allshared-make " , " make -j " ) ,
2021-08-20 12:21:13 +03:00
( " allshared-no-libtalloc " , " find ./bin | grep -v ' libtalloc-report ' | grep ' libtalloc ' && exit 1; exit 0 " ) ,
( " allshared-no-libtdb " , " find ./bin | grep -v ' libtdb-wrap ' | grep ' libtdb ' && exit 1; exit 0 " ) ,
( " allshared-no-libtevent " , " find ./bin | grep -v ' libtevent-util ' | grep ' libtevent ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-samba-nss_winbind " , " ldd ./bin/plugins/libnss_winbind.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
( " allshared-no-samba-nss_wins " , " ldd ./bin/plugins/libnss_wins.so.2 | grep ' samba ' && exit 1; exit 0 " ) ,
2022-01-20 13:17:29 +03:00
( " allshared-no-samba-libwbclient " , " ldd ./bin/shared/libwbclient.so.0 | grep ' samba ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-samba-pam_winbind " , " ldd ./bin/plugins/pam_winbind.so | grep -v ' libtalloc.so.2 ' | grep ' samba ' && exit 1; exit 0 " ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-nss_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/libnss_winbind.so.2 " , " _nss_winbind_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-nss_wins " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/libnss_wins.so.2 " , " _nss_wins_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-libwbclient " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/shared/libwbclient.so.0 " , " wbc " ) ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-pam_winbind " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/pam_winbind.so " , " pam_sm_ " ) ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-winbind_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/winbind_krb5_locator.so " , " service_locator " ) ) ,
2021-08-23 15:56:15 +03:00
( " allshared-no-public-async_dns_krb5_locator " ,
2022-02-14 16:59:13 +03:00
check_symbols ( " ./bin/plugins/async_dns_krb5_locator.so " , " service_locator " ) ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2015-08-13 18:38:43 +03:00
2020-11-19 13:49:25 +03:00
" samba-fuzz " : {
" sequence " : [
2020-09-11 01:35:58 +03:00
# build the fuzzers (static) via the oss-fuzz script
2020-11-19 13:49:25 +03:00
( " fuzzers-mkdir-prefix " , " mkdir -p $ {PREFIX_DIR} " ) ,
( " fuzzers-build " , " OUT=$ {PREFIX_DIR} LIB_FUZZING_ENGINE= SANITIZER=address CXX= CFLAGS= ADDITIONAL_LDFLAGS= ' -fuse-ld=bfd ' ./lib/fuzzing/oss-fuzz/build_samba.sh --enable-afl-fuzzer " ) ,
2020-09-11 01:35:58 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2020-09-11 01:35:58 +03:00
# * Test smbd and smbtorture can build semi-static
#
# * Test Samba without python still builds.
#
# When this test fails due to more use of Python, the expectations
# is that the newly failing part of the code should be disabled
# when --disable-python is set (rather than major work being done
# to support this environment).
#
# The target here is for vendors shipping a minimal smbd.
2020-11-19 13:49:25 +03:00
" samba-minimal-smbd " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2020-09-11 01:35:58 +03:00
2019-05-22 13:11:28 +03:00
# build with all modules static
2020-11-19 13:49:25 +03:00
( " allstatic-configure " , " ./configure.developer " + samba_configure_params + " --with-static-modules=ALL " ) ,
( " allstatic-make " , " make -j " ) ,
( " allstatic-test " , make_test ( TESTS = " samba3.smb2.create.*nt4_dc " ) ) ,
2020-12-30 03:58:48 +03:00
( " allstatic-lcov " , LCOV_CMD ) ,
2023-12-29 18:28:37 +03:00
( " allstatic-def-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " allstatic-def-clean " , " make clean " ) ,
# force all libraries as private
( " allprivate-def-distclean " , " make distclean " ) ,
( " allprivate-def-configure " , " ./configure.developer " + samba_configure_params + " --private-libraries=ALL " ) ,
( " allprivate-def-make " , " make -j " ) ,
# note wrapper libraries need to be public
2024-07-15 19:43:37 +03:00
( " allprivate-def-no-public " , " ls ./bin/shared | egrep -v ' ^private$|lib[nprsu][saeoi][smscd].*-wrapper.so$|pam_set_items.so|pam_matrix.so ' | wc -l | grep -q ' ^0 ' " ) ,
2023-12-29 18:28:37 +03:00
( " allprivate-def-only-private-ext " , " ls ./bin/shared/private | egrep ' private-samba ' | wc -l | grep -q ' ^0 ' && exit 1; exit 0 " ) ,
( " allprivate-def-no-non-private-ext " , " ls ./bin/shared/private | egrep -v ' private-samba|^libpypamtest.so$ ' | wc -l | grep -q ' ^0 ' " ) ,
( " allprivate-def-test " , make_test ( TESTS = " samba3.smb2.create.*nt4_dc " ) ) ,
( " allprivate-def-lcov " , LCOV_CMD ) ,
( " allprivate-def-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " allprivate-def-clean " , " make clean " ) ,
# force all libraries as private with a non default
# extension and 2 exceptions
( " allprivate-ext-distclean " , " make distclean " ) ,
( " allprivate-ext-configure " , " ./configure.developer " + samba_configure_params + " --private-libraries=ALL --private-library-extension=private-library --private-extension-exception=pac,ndr " ) ,
( " allprivate-ext-make " , " make -j " ) ,
# note wrapper libraries need to be public
2024-07-15 19:43:37 +03:00
( " allprivate-ext-no-public " , " ls ./bin/shared | egrep -v ' ^private$|lib[nprsu][saeoi][smscd].*-wrapper.so$|pam_set_items.so|pam_matrix.so ' | wc -l | grep -q ' ^0 ' " ) ,
2023-12-29 18:28:37 +03:00
( " allprivate-ext-no-private-default-ext " , " ls ./bin/shared/private | grep ' private-samba ' | wc -l | grep -q ' ^0 ' " ) ,
( " allprivate-ext-has-private-ext " , " ls ./bin/shared/private | grep ' private-library ' | wc -l | grep -q ' ^0 ' && exit 1; exit 0 " ) ,
( " allprivate-ext-libndr-no-private-ext " , " ls ./bin/shared/private | grep -v ' private-library ' | grep ' libndr ' | wc -l | grep -q ' ^1 ' " ) ,
( " allprivate-ext-libpac-no-private-ext " , " ls ./bin/shared/private | grep -v ' private-library ' | grep ' libpac ' | wc -l | grep -q ' ^1 ' " ) ,
( " allprivate-ext-test " , make_test ( TESTS = " samba3.smb2.create.*nt4_dc " ) ) ,
( " allprivate-ext-lcov " , LCOV_CMD ) ,
( " allprivate-ext-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " allprivate-ext-clean " , " make clean " ) ,
2019-05-22 13:11:28 +03:00
# retry with nonshared smbd and smbtorture
2020-11-19 13:49:25 +03:00
( " nonshared-distclean " , " make distclean " ) ,
( " nonshared-configure " , " ./configure.developer " + samba_configure_params + " --bundled-libraries=ALL --with-static-modules=ALL --nonshared-binary=smbtorture,smbd/smbd " ) ,
( " nonshared-make " , " make -j " ) ,
2023-12-29 18:27:38 +03:00
( " nonshared-test " , make_test ( TESTS = " samba3.smb2.create.*nt4_dc " ) ) ,
( " nonshared-lcov " , LCOV_CMD ) ,
( " nonshared-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " nonshared-clean " , " make clean " ) ,
2024-08-06 18:45:37 +03:00
# retry without winbindd
( " nonwinbind-distclean " , " make distclean " ) ,
( " nonwinbind-configure " , " ./configure.developer " + samba_configure_params + " --bundled-libraries=ALL --with-static-modules=ALL --without-winbind " ) ,
( " nonwinbind-make " , " make -j " ) ,
( " nonwinbind-test " , make_test ( TESTS = " samba3.smb2.*.simpleserver " ) ) ,
( " nonwinbind-lcov " , LCOV_CMD ) ,
( " nonwinbind-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
( " nonwinbind-clean " , " make clean " ) ,
2020-12-30 03:58:48 +03:00
] ,
} ,
" samba-nopython " : {
" sequence " : [
( " random-sleep " , random_sleep ( 300 , 900 ) ) ,
2020-11-19 13:49:25 +03:00
( " configure " , " ./configure.developer $ {ENABLE_COVERAGE} $ {PREFIX} --with-profiling-data --disable-python --without-ad-dc " ) ,
( " make " , " make -j " ) ,
( " find-python " , " script/find_python.sh $ {PREFIX} " ) ,
( " test " , " make test-nopython " ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
( " talloc-configure " , " cd lib/talloc && " + samba_libs_configure_base + " --bundled-libraries=cmocka,NONE --disable-python " ) ,
( " talloc-make " , " cd lib/talloc && make " ) ,
( " talloc-install " , " cd lib/talloc && make install " ) ,
( " tdb-configure " , " cd lib/tdb && " + samba_libs_configure_base + " --bundled-libraries=cmocka,NONE --disable-python " ) ,
( " tdb-make " , " cd lib/tdb && make " ) ,
( " tdb-install " , " cd lib/tdb && make install " ) ,
( " tevent-configure " , " cd lib/tevent && " + samba_libs_configure_base + " --bundled-libraries=cmocka,NONE --disable-python " ) ,
( " tevent-make " , " cd lib/tevent && make " ) ,
( " tevent-install " , " cd lib/tevent && make install " ) ,
2020-09-11 04:36:22 +03:00
# retry against installed library packages, but no required modules
2020-11-19 13:49:25 +03:00
( " libs-configure " , samba_libs_configure_base + samba_libs_configure_bundled_libs + " --disable-python --without-ad-dc --with-static-modules=!FORCED,!DEFAULT --with-shared-modules=!FORCED,!DEFAULT " ) ,
( " libs-make " , " make -j " ) ,
( " libs-install " , " make install " ) ,
2020-11-19 16:41:16 +03:00
( " libs-check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " libs-clean " , " make clean " ) ,
2019-05-22 13:11:28 +03:00
] ,
2020-11-19 13:49:25 +03:00
} ,
2023-03-22 12:15:54 +03:00
" samba-codecheck " : {
2022-02-21 13:36:39 +03:00
" sequence " : [
( " run " , " script/check-shell-scripts.sh . " ) ,
2023-03-22 12:15:54 +03:00
( " run " , " script/codespell.sh . " ) ,
2022-02-21 13:36:39 +03:00
] ,
} ,
2020-11-19 13:49:25 +03:00
" tdb " : {
" sequence " : [
( " random-sleep " , random_sleep ( 60 , 600 ) ) ,
( " configure " , " ./configure $ {ENABLE_COVERAGE} --enable-developer -C $ {PREFIX} " ) ,
( " make " , " make " ) ,
( " install " , " make install " ) ,
( " test " , " make test " ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " distcheck " , " make distcheck " ) ,
( " clean " , " make clean " ) ,
] ,
} ,
" talloc " : {
" sequence " : [
( " random-sleep " , random_sleep ( 60 , 600 ) ) ,
( " configure " , " ./configure $ {ENABLE_COVERAGE} --enable-developer -C $ {PREFIX} " ) ,
( " make " , " make " ) ,
( " install " , " make install " ) ,
( " test " , " make test " ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " distcheck " , " make distcheck " ) ,
( " clean " , " make clean " ) ,
] ,
} ,
" replace " : {
" sequence " : [
( " random-sleep " , random_sleep ( 60 , 600 ) ) ,
( " configure " , " ./configure $ {ENABLE_COVERAGE} --enable-developer -C $ {PREFIX} " ) ,
( " make " , " make " ) ,
( " install " , " make install " ) ,
( " test " , " make test " ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " distcheck " , " make distcheck " ) ,
( " clean " , " make clean " ) ,
] ,
} ,
" tevent " : {
" sequence " : [
( " random-sleep " , random_sleep ( 60 , 600 ) ) ,
( " configure " , " ./configure $ {ENABLE_COVERAGE} --enable-developer -C $ {PREFIX} " ) ,
( " make " , " make " ) ,
( " install " , " make install " ) ,
( " test " , " make test " ) ,
( " lcov " , LCOV_CMD ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " distcheck " , " make distcheck " ) ,
( " clean " , " make clean " ) ,
] ,
} ,
" pidl " : {
" git-clone-required " : True ,
" sequence " : [
( " random-sleep " , random_sleep ( 60 , 600 ) ) ,
( " configure " , " perl Makefile.PL PREFIX=$ {PREFIX_DIR} " ) ,
( " touch " , " touch *.yp " ) ,
( " make " , " make " ) ,
( " test " , " make test " ) ,
( " install " , " make install " ) ,
( " checkout-yapp-generated " , " git checkout lib/Parse/Pidl/IDL.pm lib/Parse/Pidl/Expr.pm " ) ,
2020-11-19 16:41:16 +03:00
( " check-clean-tree " , CLEAN_SOURCE_TREE_CMD ) ,
2020-11-19 13:49:25 +03:00
( " clean " , " make clean " ) ,
] ,
} ,
2018-10-16 21:25:26 +03:00
2011-02-07 02:05:32 +03:00
# these are useful for debugging autobuild
2020-11-19 13:49:25 +03:00
" pass " : {
" sequence " : [
( " pass " , ' echo passing && /bin/true ' ) ,
] ,
} ,
" fail " : {
" sequence " : [
( " fail " , ' echo failing && /bin/false ' ) ,
] ,
} ,
2010-09-25 23:51:51 +04:00
}
2019-12-10 00:59:49 +03:00
defaulttasks = list ( tasks . keys ( ) )
2019-12-04 12:52:06 +03:00
2019-12-10 00:59:49 +03:00
defaulttasks . remove ( " pass " )
defaulttasks . remove ( " fail " )
2021-08-16 04:40:39 +03:00
# The build tasks will be brought in by the test tasks as needed
2020-11-19 17:23:00 +03:00
defaulttasks . remove ( " samba-def-build " )
2020-12-28 19:12:39 +03:00
defaulttasks . remove ( " samba-nt4-build " )
2020-11-19 17:23:00 +03:00
defaulttasks . remove ( " samba-mit-build " )
2020-12-28 19:12:39 +03:00
defaulttasks . remove ( " samba-h5l-build " )
defaulttasks . remove ( " samba-no-opath-build " )
2021-08-16 04:40:39 +03:00
# This is not a normal test, but a task to support manually running
# one test under autobuild
2019-12-10 00:59:49 +03:00
defaulttasks . remove ( " samba-test-only " )
2021-08-16 04:40:39 +03:00
# Only built on GitLab CI and not in the default autobuild because it
# uses too much space (4GB of semi-static binaries)
2019-12-04 12:52:06 +03:00
defaulttasks . remove ( " samba-fuzz " )
2021-08-16 04:40:39 +03:00
# The FIPS build runs only in GitLab CI on a current Fedora Docker
# container where a simulated FIPS mode is possible.
2020-05-19 08:21:25 +03:00
defaulttasks . remove ( " samba-fips " )
2021-08-16 04:40:39 +03:00
2021-08-16 04:53:58 +03:00
# The MIT build runs on a current Fedora where an up to date MIT KDC
# is already packaged. This avoids needing to backport a current MIT
# to the default Ubuntu 18.04, particularly during development, and
# the need to install on the shared sn-devel-184.
defaulttasks . remove ( " samba-mitkrb5 " )
defaulttasks . remove ( " samba-admem-mit " )
defaulttasks . remove ( " samba-addc-mit-1 " )
defaulttasks . remove ( " samba-addc-mit-4a " )
defaulttasks . remove ( " samba-addc-mit-4b " )
2022-11-22 12:41:39 +03:00
defaulttasks . remove ( " samba-32bit " )
2019-12-10 00:59:49 +03:00
if os . environ . get ( " AUTOBUILD_SKIP_SAMBA_O3 " , " 0 " ) == " 1 " :
defaulttasks . remove ( " samba-o3 " )
2018-07-30 09:20:39 +03:00
2017-01-11 17:02:17 +03:00
def do_print ( msg ) :
2023-03-23 04:41:15 +03:00
logger . info ( msg )
sys . stdout . flush ( )
sys . stderr . flush ( )
def do_debug ( msg ) :
logger . debug ( msg )
2017-01-11 17:02:17 +03:00
sys . stdout . flush ( )
sys . stderr . flush ( )
2018-07-30 09:20:39 +03:00
2010-09-26 23:50:06 +04:00
def run_cmd ( cmd , dir = " . " , show = None , output = False , checkfail = True ) :
2010-09-25 23:51:51 +04:00
if show is None :
2023-03-23 04:41:15 +03:00
do_debug ( " Running: ' %s ' in ' %s ' " % ( cmd , dir ) )
elif show :
2017-01-11 17:02:17 +03:00
do_print ( " Running: ' %s ' in ' %s ' " % ( cmd , dir ) )
2023-03-23 04:41:15 +03:00
2010-09-26 22:46:01 +04:00
if output :
2019-05-22 03:15:40 +03:00
out = check_output ( [ cmd ] , shell = True , cwd = dir )
return out . decode ( encoding = ' utf-8 ' , errors = ' backslashreplace ' )
2010-10-01 19:45:47 +04:00
elif checkfail :
2010-10-01 22:12:24 +04:00
return check_call ( cmd , shell = True , cwd = dir )
2010-10-01 19:45:47 +04:00
else :
2010-10-01 22:12:24 +04:00
return call ( cmd , shell = True , cwd = dir )
2010-10-01 19:45:47 +04:00
2020-11-20 12:20:14 +03:00
def rmdir_force ( dirname , re_raise = True ) :
try :
run_cmd ( " test -d %s && chmod -R +w %s ; rm -rf %s " % (
dirname , dirname , dirname ) , output = True , show = True )
except CalledProcessError as e :
do_print ( " Failed: ' %s ' " % ( str ( e ) ) )
run_cmd ( " tree %s " % dirname , output = True , show = True )
if re_raise :
raise
return False
return True
2010-09-25 23:51:51 +04:00
2010-10-01 14:19:56 +04:00
class builder ( object ) :
2010-09-25 23:51:51 +04:00
''' handle build of one directory '''
2010-10-01 14:19:56 +04:00
2020-11-19 13:49:25 +03:00
def __init__ ( self , name , definition ) :
2010-09-25 23:51:51 +04:00
self . name = name
2019-05-21 04:56:12 +03:00
self . dir = builddirs . get ( name , ' . ' )
2010-09-25 23:51:51 +04:00
self . tag = self . name . replace ( ' / ' , ' _ ' )
2020-11-19 13:49:25 +03:00
self . definition = definition
self . sequence = definition [ " sequence " ]
self . git_clone_required = False
if " git-clone-required " in definition :
self . git_clone_required = bool ( definition [ " git-clone-required " ] )
2020-12-17 13:53:21 +03:00
self . proc = None
self . done = False
2010-09-25 23:51:51 +04:00
self . next = 0
2010-09-30 21:41:36 +04:00
self . stdout_path = " %s / %s .stdout " % ( gitroot , self . tag )
self . stderr_path = " %s / %s .stderr " % ( gitroot , self . tag )
2023-03-23 04:41:15 +03:00
do_debug ( " stdout for %s in %s " % ( self . name , self . stdout_path ) )
do_debug ( " stderr for %s in %s " % ( self . name , self . stderr_path ) )
2010-09-25 23:51:51 +04:00
run_cmd ( " rm -f %s %s " % ( self . stdout_path , self . stderr_path ) )
self . stdout = open ( self . stdout_path , ' w ' )
self . stderr = open ( self . stderr_path , ' w ' )
self . stdin = open ( " /dev/null " , ' r ' )
2020-12-17 13:53:21 +03:00
self . builder_dir = " %s / %s " % ( testbase , self . tag )
self . test_source_dir = self . builder_dir
self . cwd = " %s / %s " % ( self . builder_dir , self . dir )
2020-11-19 17:01:04 +03:00
self . selftest_prefix = " %s /bin/ab " % ( self . cwd )
2016-12-16 15:35:01 +03:00
self . prefix = " %s / %s " % ( test_prefix , self . tag )
2020-12-17 13:53:21 +03:00
self . consumers = [ ]
self . producer = None
if self . git_clone_required :
assert " dependency " not in definition
def mark_existing ( self ) :
2023-03-23 04:41:15 +03:00
do_debug ( ' %s : Mark as existing dependency ' % self . name )
2020-12-17 13:53:21 +03:00
self . next = len ( self . sequence )
self . done = True
def add_consumer ( self , consumer ) :
2023-03-23 04:41:15 +03:00
do_debug ( " %s : add consumer: %s " % ( self . name , consumer . name ) )
2020-12-17 13:53:21 +03:00
consumer . producer = self
consumer . test_source_dir = self . test_source_dir
self . consumers . append ( consumer )
2010-09-25 23:51:51 +04:00
def start_next ( self ) :
2020-12-17 13:53:21 +03:00
if self . producer is not None :
if not self . producer . done :
2023-03-23 04:41:15 +03:00
do_debug ( " %s : Waiting for producer: %s " % ( self . name , self . producer . name ) )
2020-12-17 13:53:21 +03:00
return
2020-11-19 17:11:39 +03:00
if self . next == 0 :
2020-12-17 13:53:21 +03:00
rmdir_force ( self . builder_dir )
2020-11-19 17:11:39 +03:00
rmdir_force ( self . prefix )
2020-12-17 13:53:21 +03:00
if self . producer is not None :
run_cmd ( " mkdir %s " % ( self . builder_dir ) , dir = test_master , show = True )
elif not self . git_clone_required :
2020-12-17 13:53:21 +03:00
run_cmd ( " cp -R -a -l %s %s " % ( test_master , self . builder_dir ) , dir = test_master , show = True )
2020-11-19 17:11:39 +03:00
else :
2020-12-17 13:53:21 +03:00
run_cmd ( " git clone --recursive --shared %s %s " % ( test_master , self . builder_dir ) , dir = test_master , show = True )
2020-11-19 17:11:39 +03:00
2010-09-25 23:51:51 +04:00
if self . next == len ( self . sequence ) :
2020-12-17 13:53:21 +03:00
if not self . done :
do_print ( ' %s : Completed OK ' % self . name )
self . done = True
if not options . nocleanup and len ( self . consumers ) == 0 :
do_print ( ' %s : Cleaning up ' % self . name )
2020-12-17 13:53:21 +03:00
rmdir_force ( self . builder_dir )
2020-11-20 12:20:14 +03:00
rmdir_force ( self . prefix )
2020-12-17 13:53:21 +03:00
for consumer in self . consumers :
if consumer . next != 0 :
continue
do_print ( ' %s : Starting consumer %s ' % ( self . name , consumer . name ) )
consumer . start_next ( )
if self . producer is not None :
self . producer . consumers . remove ( self )
assert self . producer . done
self . producer . start_next ( )
do_print ( ' %s : Remaining consumers %u ' % ( self . name , len ( self . consumers ) ) )
2010-09-25 23:51:51 +04:00
return
2019-05-22 13:17:28 +03:00
( self . stage , self . cmd ) = self . sequence [ self . next ]
2022-12-21 18:02:18 +03:00
self . cmd = self . cmd . replace ( " $ {PYTHON_PREFIX} " ,
get_path ( name = ' platlib ' ,
scheme = " posix_prefix " ,
vars = { " base " : self . prefix ,
" platbase " : self . prefix } ) )
2010-10-01 14:19:56 +04:00
self . cmd = self . cmd . replace ( " $ {PREFIX} " , " --prefix= %s " % self . prefix )
2011-01-05 11:30:48 +03:00
self . cmd = self . cmd . replace ( " $ {PREFIX_DIR} " , " %s " % self . prefix )
2016-07-27 05:28:04 +03:00
self . cmd = self . cmd . replace ( " $ {TESTS} " , options . restrict_tests )
2019-05-06 06:14:43 +03:00
self . cmd = self . cmd . replace ( " $ {TEST_SOURCE_DIR} " , self . test_source_dir )
2020-11-19 17:01:04 +03:00
self . cmd = self . cmd . replace ( " $ {SELFTEST_PREFIX} " , self . selftest_prefix )
2019-05-06 06:14:43 +03:00
self . cmd = self . cmd . replace ( " $ {LOG_BASE} " , options . log_base )
self . cmd = self . cmd . replace ( " $ {NAME} " , self . name )
self . cmd = self . cmd . replace ( " $ {ENABLE_COVERAGE} " , options . enable_coverage )
2019-05-22 14:50:01 +03:00
do_print ( ' %s : [ %s ] Running %s in %r ' % ( self . name , self . stage , self . cmd , self . cwd ) )
2010-09-25 23:51:51 +04:00
self . proc = Popen ( self . cmd , shell = True ,
2019-05-22 14:50:01 +03:00
close_fds = True , cwd = self . cwd ,
2010-09-25 23:51:51 +04:00
stdout = self . stdout , stderr = self . stderr , stdin = self . stdin )
self . next + = 1
2020-12-17 13:53:21 +03:00
def expand_dependencies ( n ) :
deps = list ( )
if " dependency " in tasks [ n ] :
depname = tasks [ n ] [ " dependency " ]
assert depname in tasks
sdeps = expand_dependencies ( depname )
assert n not in sdeps
for sdep in sdeps :
deps . append ( sdep )
deps . append ( depname )
return deps
2010-09-25 23:51:51 +04:00
2010-10-01 14:19:56 +04:00
class buildlist ( object ) :
2010-09-25 23:51:51 +04:00
''' handle build of multiple directories '''
2010-10-01 14:19:56 +04:00
2016-07-27 05:09:08 +03:00
def __init__ ( self , tasknames , rebase_url , rebase_branch = " master " ) :
2010-09-25 23:51:51 +04:00
self . tail_proc = None
2010-09-26 04:35:55 +04:00
self . retry = None
2019-05-21 04:56:12 +03:00
if not tasknames :
2016-07-27 05:28:04 +03:00
if options . restrict_tests :
tasknames = [ " samba-test-only " ]
else :
tasknames = defaulttasks
2015-04-14 02:59:57 +03:00
2020-12-17 13:53:21 +03:00
given_tasknames = tasknames . copy ( )
implicit_tasknames = [ ]
for n in given_tasknames :
deps = expand_dependencies ( n )
for dep in deps :
if dep in given_tasknames :
continue
if dep in implicit_tasknames :
continue
implicit_tasknames . append ( dep )
tasknames = implicit_tasknames . copy ( )
tasknames . extend ( given_tasknames )
2023-03-23 04:41:15 +03:00
do_debug ( " given_tasknames: %s " % given_tasknames )
do_debug ( " implicit_tasknames: %s " % implicit_tasknames )
do_debug ( " tasknames: %s " % tasknames )
2020-11-19 13:49:25 +03:00
self . tlist = [ builder ( n , tasks [ n ] ) for n in tasknames ]
2019-05-21 04:56:12 +03:00
2010-09-26 04:35:55 +04:00
if options . retry :
2012-09-22 02:23:21 +04:00
rebase_remote = " rebaseon "
2020-11-19 13:49:25 +03:00
retry_task = {
" git-clone-required " : True ,
" sequence " : [
( " retry " ,
2012-09-22 02:23:21 +04:00
''' set -e
git remote add - t % s % s % s
git fetch % s
while : ; do
sleep 60
git describe % s / % s > old_remote_branch . desc
git fetch % s
git describe % s / % s > remote_branch . desc
diff old_remote_branch . desc remote_branch . desc
done
''' % (
2019-05-22 13:17:28 +03:00
rebase_branch , rebase_remote , rebase_url ,
2012-09-22 02:23:21 +04:00
rebase_remote ,
rebase_remote , rebase_branch ,
rebase_remote ,
rebase_remote , rebase_branch
2020-11-19 13:49:25 +03:00
) ) ] }
2012-09-22 02:23:21 +04:00
2020-11-19 13:49:25 +03:00
self . retry = builder ( ' retry ' , retry_task )
2010-09-26 04:35:55 +04:00
self . need_retry = False
2010-09-25 23:51:51 +04:00
2020-12-17 13:53:21 +03:00
if options . skip_dependencies :
for b in self . tlist :
if b . name in implicit_tasknames :
b . mark_existing ( )
for b in self . tlist :
2023-03-23 04:41:15 +03:00
do_debug ( " b.name= %s " % b . name )
2020-12-17 13:53:21 +03:00
if " dependency " not in b . definition :
continue
depname = b . definition [ " dependency " ]
2023-03-23 04:41:15 +03:00
do_debug ( " b.name= %s : dependency: %s " % ( b . name , depname ) )
2020-12-17 13:53:21 +03:00
for p in self . tlist :
if p . name == depname :
p . add_consumer ( b )
2010-09-25 23:51:51 +04:00
def kill_kids ( self ) :
2010-09-26 04:35:55 +04:00
if self . tail_proc is not None :
self . tail_proc . terminate ( )
self . tail_proc . wait ( )
self . tail_proc = None
if self . retry is not None :
self . retry . proc . terminate ( )
self . retry . proc . wait ( )
self . retry = None
2010-09-25 23:51:51 +04:00
for b in self . tlist :
if b . proc is not None :
2019-05-03 08:05:08 +03:00
run_cmd ( " killbysubdir %s > /dev/null 2>&1 " % b . test_source_dir , checkfail = False )
2010-09-25 23:51:51 +04:00
b . proc . terminate ( )
b . proc . wait ( )
b . proc = None
def wait_one ( self ) :
while True :
none_running = True
for b in self . tlist :
if b . proc is None :
continue
none_running = False
b . status = b . proc . poll ( )
if b . status is None :
continue
b . proc = None
return b
2010-09-26 04:35:55 +04:00
if options . retry :
ret = self . retry . proc . poll ( )
if ret is not None :
self . need_retry = True
self . retry = None
return None
2010-09-25 23:51:51 +04:00
if none_running :
return None
time . sleep ( 0.1 )
def run ( self ) :
2020-11-19 17:11:39 +03:00
for b in self . tlist :
b . start_next ( )
if options . retry :
self . retry . start_next ( )
2010-09-25 23:51:51 +04:00
while True :
b = self . wait_one ( )
2010-09-26 04:35:55 +04:00
if options . retry and self . need_retry :
self . kill_kids ( )
2017-01-11 17:02:17 +03:00
do_print ( " retry needed " )
2010-10-02 04:58:47 +04:00
return ( 0 , None , None , None , " retry " )
2010-09-25 23:51:51 +04:00
if b is None :
break
if os . WIFSIGNALED ( b . status ) or os . WEXITSTATUS ( b . status ) != 0 :
self . kill_kids ( )
2010-10-01 14:19:56 +04:00
return ( b . status , b . name , b . stage , b . tag , " %s : [ %s ] failed ' %s ' with status %d " % ( b . name , b . stage , b . cmd , b . status ) )
2010-09-25 23:51:51 +04:00
b . start_next ( )
self . kill_kids ( )
2010-10-01 14:19:56 +04:00
return ( 0 , None , None , None , " All OK " )
2010-09-25 23:51:51 +04:00
2019-05-21 04:56:12 +03:00
def write_system_info ( self , filename ) :
with open ( filename , ' w ' ) as f :
for cmd in [ ' uname -a ' ,
' lsb_release -a ' ,
' free ' ,
' mount ' ,
' cat /proc/cpuinfo ' ,
' cc --version ' ,
' df -m . ' ,
' df -m %s ' % testbase ] :
2020-02-28 02:00:08 +03:00
try :
out = run_cmd ( cmd , output = True , checkfail = False )
2020-11-20 12:20:14 +03:00
except CalledProcessError as e :
2020-02-28 02:00:08 +03:00
out = " <failed: %s > " % str ( e )
2019-05-21 04:56:12 +03:00
print ( ' ### %s ' % cmd , file = f )
print ( out , file = f )
print ( file = f )
2015-07-01 01:45:47 +03:00
2010-09-25 23:51:51 +04:00
def tarlogs ( self , fname ) :
2019-05-21 04:56:12 +03:00
with tarfile . open ( fname , " w:gz " ) as tar :
for b in self . tlist :
tar . add ( b . stdout_path , arcname = " %s .stdout " % b . tag )
tar . add ( b . stderr_path , arcname = " %s .stderr " % b . tag )
if os . path . exists ( " autobuild.log " ) :
tar . add ( " autobuild.log " )
filename = ' system-info.txt '
self . write_system_info ( filename )
tar . add ( filename )
2010-09-25 23:51:51 +04:00
def remove_logs ( self ) :
for b in self . tlist :
os . unlink ( b . stdout_path )
os . unlink ( b . stderr_path )
def start_tail ( self ) :
2018-08-27 12:13:29 +03:00
cmd = [ " tail " , " -f " ]
for b in self . tlist :
cmd . append ( b . stdout_path )
cmd . append ( b . stderr_path )
self . tail_proc = Popen ( cmd , close_fds = True )
2010-09-25 23:51:51 +04:00
2020-11-20 12:20:14 +03:00
def cleanup ( do_raise = False ) :
2010-09-26 02:30:13 +04:00
if options . nocleanup :
return
2017-02-21 19:05:08 +03:00
run_cmd ( " stat %s || true " % test_tmpdir , show = True )
2017-01-11 16:13:00 +03:00
run_cmd ( " stat %s " % testbase , show = True )
2017-04-13 19:46:50 +03:00
do_print ( " Cleaning up %r " % cleanup_list )
2010-09-25 23:51:51 +04:00
for d in cleanup_list :
2020-11-20 12:20:14 +03:00
ok = rmdir_force ( d , re_raise = False )
if ok :
continue
if os . path . isdir ( d ) :
do_print ( " Killing, waiting and retry " )
run_cmd ( " killbysubdir %s > /dev/null 2>&1 " % d , checkfail = False )
else :
do_print ( " Waiting and retry " )
time . sleep ( 1 )
rmdir_force ( d , re_raise = do_raise )
2010-09-25 23:51:51 +04:00
2010-10-01 04:53:38 +04:00
def daemonize ( logfile ) :
pid = os . fork ( )
2018-07-30 09:19:33 +03:00
if pid == 0 : # Parent
2010-10-01 04:53:38 +04:00
os . setsid ( )
pid = os . fork ( )
2018-07-30 09:19:33 +03:00
if pid != 0 : # Actual daemon
2010-10-01 04:53:38 +04:00
os . _exit ( 0 )
2018-07-30 09:19:33 +03:00
else : # Grandparent
2010-10-01 04:53:38 +04:00
os . _exit ( 0 )
import resource # Resource usage information.
maxfd = resource . getrlimit ( resource . RLIMIT_NOFILE ) [ 1 ]
if maxfd == resource . RLIM_INFINITY :
2018-07-30 09:19:33 +03:00
maxfd = 1024 # Rough guess at maximum number of open file descriptors.
2010-10-01 04:53:38 +04:00
for fd in range ( 0 , maxfd ) :
try :
os . close ( fd )
except OSError :
pass
os . open ( logfile , os . O_RDWR | os . O_CREAT )
os . dup2 ( 0 , 1 )
os . dup2 ( 0 , 2 )
2018-07-30 09:20:39 +03:00
2010-10-20 02:44:03 +04:00
def write_pidfile ( fname ) :
''' write a pid file, cleanup on exit '''
2019-05-21 04:56:12 +03:00
with open ( fname , mode = ' w ' ) as f :
f . write ( " %u \n " % os . getpid ( ) )
2010-10-20 02:44:03 +04:00
2010-10-01 04:53:38 +04:00
2018-07-30 09:19:21 +03:00
def rebase_tree ( rebase_url , rebase_branch = " master " ) :
2012-09-22 02:23:21 +04:00
rebase_remote = " rebaseon "
2017-01-11 17:02:17 +03:00
do_print ( " Rebasing on %s " % rebase_url )
2011-02-07 03:41:21 +03:00
run_cmd ( " git describe HEAD " , show = True , dir = test_master )
2012-09-22 02:23:21 +04:00
run_cmd ( " git remote add -t %s %s %s " %
( rebase_branch , rebase_remote , rebase_url ) ,
show = True , dir = test_master )
run_cmd ( " git fetch %s " % rebase_remote , show = True , dir = test_master )
2010-09-26 03:18:00 +04:00
if options . fix_whitespace :
2014-02-17 12:15:30 +04:00
run_cmd ( " git rebase --force-rebase --whitespace=fix %s / %s " %
2012-09-22 02:23:21 +04:00
( rebase_remote , rebase_branch ) ,
show = True , dir = test_master )
2010-09-26 03:18:00 +04:00
else :
2014-02-17 12:15:30 +04:00
run_cmd ( " git rebase --force-rebase %s / %s " %
2012-09-22 02:23:21 +04:00
( rebase_remote , rebase_branch ) ,
show = True , dir = test_master )
diff = run_cmd ( " git --no-pager diff HEAD %s / %s " %
( rebase_remote , rebase_branch ) ,
dir = test_master , output = True )
2010-09-26 22:46:01 +04:00
if diff == ' ' :
2017-01-11 17:02:17 +03:00
do_print ( " No differences between HEAD and %s / %s - exiting " %
2018-07-30 09:16:12 +03:00
( rebase_remote , rebase_branch ) )
2010-09-26 22:46:01 +04:00
sys . exit ( 0 )
2012-09-22 02:23:21 +04:00
run_cmd ( " git describe %s / %s " %
( rebase_remote , rebase_branch ) ,
show = True , dir = test_master )
2011-02-07 03:41:21 +03:00
run_cmd ( " git describe HEAD " , show = True , dir = test_master )
2012-09-22 02:23:21 +04:00
run_cmd ( " git --no-pager diff --stat HEAD %s / %s " %
( rebase_remote , rebase_branch ) ,
show = True , dir = test_master )
2010-09-26 01:09:11 +04:00
2018-07-30 09:20:39 +03:00
2018-07-30 09:19:21 +03:00
def push_to ( push_url , push_branch = " master " ) :
2012-09-22 04:18:11 +04:00
push_remote = " pushto "
2017-01-11 17:02:17 +03:00
do_print ( " Pushing to %s " % push_url )
2010-09-26 02:30:13 +04:00
if options . mark :
2010-10-03 18:53:45 +04:00
run_cmd ( " git config --replace-all core.editor script/commit_mark.sh " , dir = test_master )
run_cmd ( " git commit --amend -c HEAD " , dir = test_master )
2010-10-01 01:42:02 +04:00
# the notes method doesn't work yet, as metze hasn't allowed refs/notes/* in master
# run_cmd("EDITOR=script/commit_mark.sh git notes edit HEAD", dir=test_master)
2012-09-22 04:18:11 +04:00
run_cmd ( " git remote add -t %s %s %s " %
( push_branch , push_remote , push_url ) ,
show = True , dir = test_master )
run_cmd ( " git push %s +HEAD: %s " %
( push_remote , push_branch ) ,
show = True , dir = test_master )
2010-09-26 02:30:13 +04:00
2018-07-30 09:21:29 +03:00
2015-04-14 08:18:02 +03:00
def send_email ( subject , text , log_tar ) :
2018-03-23 01:24:16 +03:00
if options . email is None :
do_print ( " not sending email because the recipient is not set " )
2018-09-03 13:20:31 +03:00
do_print ( " the text content would have been: \n \n Subject: %s \n \n %s " %
2018-03-23 01:24:16 +03:00
( subject , text ) )
return
2015-04-14 08:18:02 +03:00
outer = MIMEMultipart ( )
outer [ ' Subject ' ] = subject
outer [ ' To ' ] = options . email
outer [ ' From ' ] = options . email_from
2018-07-30 09:19:21 +03:00
outer [ ' Date ' ] = email . utils . formatdate ( localtime = True )
2015-04-14 08:18:02 +03:00
outer . preamble = ' Autobuild mails are now in MIME because we optionally attach the logs. \n '
2020-11-10 11:15:42 +03:00
outer . attach ( MIMEText ( text , ' plain ' , ' utf-8 ' ) )
2015-04-14 08:18:02 +03:00
if options . attach_logs :
2019-05-21 04:56:12 +03:00
with open ( log_tar , ' rb ' ) as fp :
msg = MIMEApplication ( fp . read ( ) , ' gzip ' , email . encoders . encode_base64 )
2015-04-14 08:18:02 +03:00
# Set the filename parameter
msg . add_header ( ' Content-Disposition ' , ' attachment ' , filename = os . path . basename ( log_tar ) )
outer . attach ( msg )
content = outer . as_string ( )
s = smtplib . SMTP ( options . email_server )
2019-04-03 03:17:17 +03:00
email_user = os . getenv ( ' SMTP_USERNAME ' )
email_password = os . getenv ( ' SMTP_PASSWORD ' )
if email_user is not None :
s . starttls ( )
s . login ( email_user , email_password )
2015-04-14 08:18:02 +03:00
s . sendmail ( options . email_from , [ options . email ] , content )
s . set_debuglevel ( 1 )
s . quit ( )
2010-09-30 21:41:36 +04:00
2018-07-30 09:20:39 +03:00
2015-05-28 04:46:23 +03:00
def email_failure ( status , failed_task , failed_stage , failed_tag , errstr ,
2016-03-14 04:18:54 +03:00
elapsed_time , log_base = None , add_log_tail = True ) :
2010-09-30 21:41:36 +04:00
''' send an email to options.email about the failure '''
2015-05-28 04:46:23 +03:00
elapsed_minutes = elapsed_time / 60.0
2012-09-22 04:34:38 +04:00
if log_base is None :
2012-09-24 13:53:22 +04:00
log_base = gitroot
2010-09-30 21:41:36 +04:00
text = '''
Dear Developer ,
2015-05-28 04:46:23 +03:00
Your autobuild on % s failed after % .1 f minutes
when trying to test % s with the following error :
2010-09-30 21:41:36 +04:00
% s
the autobuild has been abandoned . Please fix the error and resubmit .
2010-10-12 06:06:43 +04:00
A summary of the autobuild process is here :
2012-09-22 04:34:38 +04:00
% s / autobuild . log
2015-05-28 04:46:23 +03:00
''' % (platform.node(), elapsed_minutes, failed_task, errstr, log_base)
2015-05-04 10:21:53 +03:00
2016-07-27 05:28:04 +03:00
if options . restrict_tests :
text + = """
The build was restricted to tests matching % s \n """ % o ptions.restrict_tests
2010-10-12 06:06:43 +04:00
if failed_task != ' rebase ' :
text + = '''
2010-09-30 21:41:36 +04:00
You can see logs of the failed task here :
2010-09-25 23:51:51 +04:00
2012-09-22 04:34:38 +04:00
% s / % s . stdout
% s / % s . stderr
2010-09-30 21:41:36 +04:00
or you can get full logs of all tasks in this job here :
2012-09-22 04:34:38 +04:00
% s / logs . tar . gz
2010-09-30 21:41:36 +04:00
2010-10-02 06:53:34 +04:00
The top commit for the tree that was built was :
% s
2012-09-22 04:34:38 +04:00
''' % (log_base, failed_tag, log_base, failed_tag, log_base, top_commit_msg)
2015-04-14 08:18:02 +03:00
script:autobuild: Make sure we can send a failure mail
We should not run into an exception if the file doesn't exist.
Traceback (most recent call last):
File "script/autobuild.py", line 1781, in <module>
email_failure(-1, 'rebase', 'rebase', 'rebase',
File "script/autobuild.py", line 1677, in email_failure
f = open("%s/%s.stdout" % (gitroot, failed_tag), 'r')
FileNotFoundError: [Errno 2] No such file or directory:
'samba-autobuild/rebase.stdout'
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Mon Jan 30 10:00:27 UTC 2023 on atb-devel-224
2023-01-25 19:08:58 +03:00
log_stdout = " %s / %s .stdout " % ( gitroot , failed_tag )
if add_log_tail and os . access ( log_stdout , os . R_OK ) :
f = open ( log_stdout , ' r ' )
2016-03-14 04:18:54 +03:00
lines = f . readlines ( )
log_tail = " " . join ( lines [ - 50 : ] )
num_lines = len ( lines )
script:autobuild: Make sure we can send a failure mail
We should not run into an exception if the file doesn't exist.
Traceback (most recent call last):
File "script/autobuild.py", line 1781, in <module>
email_failure(-1, 'rebase', 'rebase', 'rebase',
File "script/autobuild.py", line 1677, in email_failure
f = open("%s/%s.stdout" % (gitroot, failed_tag), 'r')
FileNotFoundError: [Errno 2] No such file or directory:
'samba-autobuild/rebase.stdout'
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Mon Jan 30 10:00:27 UTC 2023 on atb-devel-224
2023-01-25 19:08:58 +03:00
log_stderr = " %s / %s .stderr " % ( gitroot , failed_tag )
if num_lines < 50 and os . access ( log_stderr , os . R_OK ) :
2016-03-14 04:18:54 +03:00
# Also include stderr (compile failures) if < 50 lines of stdout
script:autobuild: Make sure we can send a failure mail
We should not run into an exception if the file doesn't exist.
Traceback (most recent call last):
File "script/autobuild.py", line 1781, in <module>
email_failure(-1, 'rebase', 'rebase', 'rebase',
File "script/autobuild.py", line 1677, in email_failure
f = open("%s/%s.stdout" % (gitroot, failed_tag), 'r')
FileNotFoundError: [Errno 2] No such file or directory:
'samba-autobuild/rebase.stdout'
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Mon Jan 30 10:00:27 UTC 2023 on atb-devel-224
2023-01-25 19:08:58 +03:00
f = open ( log_stderr , ' r ' )
2018-07-30 09:18:25 +03:00
log_tail + = " " . join ( f . readlines ( ) [ - ( 50 - num_lines ) : ] )
2016-03-14 04:18:54 +03:00
text + = '''
The last 50 lines of log messages :
% s
''' % lo g_tail
f . close ( )
2015-04-14 08:18:02 +03:00
logs = os . path . join ( gitroot , ' logs.tar.gz ' )
2016-08-10 13:44:26 +03:00
send_email ( ' autobuild[ %s ] failure on %s for task %s during %s '
% ( options . branch , platform . node ( ) , failed_task , failed_stage ) ,
2015-04-14 08:18:02 +03:00
text , logs )
2010-09-25 23:51:51 +04:00
2018-07-30 09:20:39 +03:00
2015-05-28 04:46:23 +03:00
def email_success ( elapsed_time , log_base = None ) :
2010-10-01 13:28:48 +04:00
''' send an email to options.email about a successful build '''
2012-09-22 04:34:38 +04:00
if log_base is None :
2012-09-24 13:53:22 +04:00
log_base = gitroot
2010-10-01 13:28:48 +04:00
text = '''
Dear Developer ,
2015-05-28 04:46:23 +03:00
Your autobuild on % s has succeeded after % .1 f minutes .
2010-10-01 13:28:48 +04:00
2015-05-28 04:46:23 +03:00
''' % (platform.node(), elapsed_time / 60.)
2010-10-01 13:28:48 +04:00
2016-07-27 05:28:04 +03:00
if options . restrict_tests :
text + = """
The build was restricted to tests matching % s \n """ % o ptions.restrict_tests
2010-10-01 13:28:48 +04:00
if options . keeplogs :
text + = '''
you can get full logs of all tasks in this job here :
2012-09-22 04:34:38 +04:00
% s / logs . tar . gz
2010-10-01 13:28:48 +04:00
2012-09-22 04:34:38 +04:00
''' % lo g_base
2010-10-02 06:53:34 +04:00
text + = '''
The top commit for the tree that was built was :
% s
''' % top_commit_msg
2015-04-14 08:18:02 +03:00
logs = os . path . join ( gitroot , ' logs.tar.gz ' )
2016-08-10 13:44:26 +03:00
send_email ( ' autobuild[ %s ] success on %s ' % ( options . branch , platform . node ( ) ) ,
2015-04-14 08:18:02 +03:00
text , logs )
2010-10-01 13:28:48 +04:00
2010-10-02 06:53:34 +04:00
# get the top commit message, for emails
top_commit_msg = run_cmd ( " git log -1 " , dir = gitroot , output = True )
2010-09-25 23:51:51 +04:00
try :
2020-12-17 13:53:21 +03:00
if options . skip_dependencies :
run_cmd ( " stat %s " % testbase , dir = testbase , output = True )
else :
os . makedirs ( testbase )
2018-02-14 00:35:53 +03:00
except Exception as reason :
2010-09-26 01:09:11 +04:00
raise Exception ( " Unable to create %s : %s " % ( testbase , reason ) )
cleanup_list . append ( testbase )
2010-09-25 23:51:51 +04:00
2010-10-01 04:53:38 +04:00
if options . daemon :
logfile = os . path . join ( testbase , " log " )
2017-01-11 17:02:17 +03:00
do_print ( " Forking into the background, writing progress to %s " % logfile )
2010-10-01 04:53:38 +04:00
daemonize ( logfile )
2010-10-20 02:44:03 +04:00
write_pidfile ( gitroot + " /autobuild.pid " )
2015-05-28 04:46:23 +03:00
start_time = time . time ( )
2010-09-26 04:35:55 +04:00
while True :
try :
2017-01-11 16:13:00 +03:00
run_cmd ( " rm -rf %s " % test_tmpdir , show = True )
2016-12-16 15:35:36 +03:00
os . makedirs ( test_tmpdir )
2017-03-20 06:49:34 +03:00
# The waf uninstall code removes empty directories all the way
# up the tree. Creating a file in test_tmpdir stops it from
# being removed.
run_cmd ( " touch %s " % os . path . join ( test_tmpdir ,
" .directory-is-not-empty " ) , show = True )
2017-01-11 16:13:00 +03:00
run_cmd ( " stat %s " % test_tmpdir , show = True )
run_cmd ( " stat %s " % testbase , show = True )
2020-12-17 13:53:21 +03:00
if options . skip_dependencies :
run_cmd ( " stat %s " % test_master , dir = testbase , output = True )
else :
run_cmd ( " git clone --recursive --shared %s %s " % ( gitroot , test_master ) , show = True , dir = gitroot )
2012-01-24 04:43:46 +04:00
except Exception :
2010-09-26 04:35:55 +04:00
cleanup ( )
raise
try :
2019-05-23 05:07:49 +03:00
if options . rebase is not None :
rebase_tree ( options . rebase , rebase_branch = options . branch )
except Exception :
cleanup_list . append ( gitroot + " /autobuild.pid " )
cleanup ( )
elapsed_time = time . time ( ) - start_time
email_failure ( - 1 , ' rebase ' , ' rebase ' , ' rebase ' ,
' rebase on %s failed ' % options . branch ,
elapsed_time , log_base = options . log_base )
sys . exit ( 1 )
try :
2016-07-27 05:09:08 +03:00
blist = buildlist ( args , options . rebase , rebase_branch = options . branch )
2010-09-26 04:35:55 +04:00
if options . tail :
blist . start_tail ( )
2010-10-01 14:19:56 +04:00
( status , failed_task , failed_stage , failed_tag , errstr ) = blist . run ( )
2010-09-26 04:35:55 +04:00
if status != 0 or errstr != " retry " :
break
2020-11-20 12:20:14 +03:00
cleanup ( do_raise = True )
2012-01-24 04:43:46 +04:00
except Exception :
2010-09-26 04:35:55 +04:00
cleanup ( )
raise
2010-09-25 23:51:51 +04:00
2010-10-21 13:41:06 +04:00
cleanup_list . append ( gitroot + " /autobuild.pid " )
2017-01-11 16:13:00 +03:00
do_print ( errstr )
2010-09-25 23:51:51 +04:00
blist . kill_kids ( )
if options . tail :
2017-01-11 17:02:17 +03:00
do_print ( " waiting for tail to flush " )
2010-09-25 23:51:51 +04:00
time . sleep ( 1 )
2015-05-28 04:46:23 +03:00
elapsed_time = time . time ( ) - start_time
2010-09-25 23:51:51 +04:00
if status == 0 :
2010-09-26 02:30:13 +04:00
if options . passcmd is not None :
2017-01-11 17:02:17 +03:00
do_print ( " Running passcmd: %s " % options . passcmd )
2010-09-26 02:30:13 +04:00
run_cmd ( options . passcmd , dir = test_master )
if options . pushto is not None :
2012-09-22 04:26:10 +04:00
push_to ( options . pushto , push_branch = options . branch )
2015-04-14 08:18:02 +03:00
if options . keeplogs or options . attach_logs :
2010-09-25 23:51:51 +04:00
blist . tarlogs ( " logs.tar.gz " )
2017-01-11 17:02:17 +03:00
do_print ( " Logs in logs.tar.gz " )
2010-10-01 13:28:48 +04:00
if options . always_email :
2015-05-28 04:46:23 +03:00
email_success ( elapsed_time , log_base = options . log_base )
2010-09-25 23:51:51 +04:00
blist . remove_logs ( )
cleanup ( )
2017-01-11 17:02:17 +03:00
do_print ( errstr )
2010-09-25 23:51:51 +04:00
sys . exit ( 0 )
# something failed, gather a tar of the logs
blist . tarlogs ( " logs.tar.gz " )
2010-09-30 21:41:36 +04:00
if options . email is not None :
2015-05-28 04:46:23 +03:00
email_failure ( status , failed_task , failed_stage , failed_tag , errstr ,
elapsed_time , log_base = options . log_base )
2015-10-21 04:35:33 +03:00
else :
elapsed_minutes = elapsed_time / 60.0
2018-03-09 17:06:21 +03:00
print ( '''
2015-10-21 04:35:33 +03:00
####################################################################
AUTOBUILD FAILURE
2016-08-10 13:44:26 +03:00
Your autobuild [ % s ] on % s failed after % .1 f minutes
2015-10-21 04:35:33 +03:00
when trying to test % s with the following error :
% s
the autobuild has been abandoned . Please fix the error and resubmit .
####################################################################
2018-03-09 17:06:21 +03:00
''' % (options.branch, platform.node(), elapsed_minutes, failed_task, errstr))
2010-09-30 21:41:36 +04:00
2010-09-25 23:51:51 +04:00
cleanup ( )
2017-01-11 17:02:17 +03:00
do_print ( errstr )
do_print ( " Logs in logs.tar.gz " )
2010-09-30 20:37:42 +04:00
sys . exit ( status )