svn commit: r263767 - in user/jmmv/autotest/node: . configs/kyua1 configs/kyua2
Julio Merino
jmmv at FreeBSD.org
Wed Mar 26 10:17:19 UTC 2014
Author: jmmv
Date: Wed Mar 26 10:17:17 2014
New Revision: 263767
URL: http://svnweb.freebsd.org/changeset/base/263767
Log:
Make setup.sh allow a controlled deployment of specific autotest versions.
With this change, setup.sh will fetch a separate copy of autotest (and its
dependencies!) based on a revision specification in a per-host
configuration file. This separate copy is the one used on the worker node
to run the tests.
Additionally, setup.sh will register itself as a cron job to maintain the
autotest code and all configuration files up-to-date.
The goal of this change is to permit having one of the kyua[123] workers
as a canary of configuration changes while the others remain stable. This
is much necessary as I've been known to routinely break the nodes when I
manually push to them untested changes.
Added:
user/jmmv/autotest/node/configs/kyua1/host.conf (contents, props changed)
user/jmmv/autotest/node/configs/kyua2/host.conf (contents, props changed)
Modified:
user/jmmv/autotest/node/setup.sh
Directory Properties:
user/jmmv/autotest/node/ (props changed)
Added: user/jmmv/autotest/node/configs/kyua1/host.conf
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/jmmv/autotest/node/configs/kyua1/host.conf Wed Mar 26 10:17:17 2014 (r263767)
@@ -0,0 +1,12 @@
+# $FreeBSD$
+#
+# Configuration to bootstrap autotest on this host and to maintain the host
+# up-to-date with changes to the autotest code, its configuration files and
+# its dependencies.
+#
+
+AUTOTEST_SVNROOT="svn://svn.freebsd.org/base/user/jmmv"
+AUTOTEST_REVISION="r263766"
+
+SHTK_REMOTE="https://github.com/jmmv/shtk/"
+SHTK_REVISION="shtk-1.5"
Added: user/jmmv/autotest/node/configs/kyua2/host.conf
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/jmmv/autotest/node/configs/kyua2/host.conf Wed Mar 26 10:17:17 2014 (r263767)
@@ -0,0 +1,12 @@
+# $FreeBSD$
+#
+# Configuration to bootstrap autotest on this host and to maintain the host
+# up-to-date with changes to the autotest code, its configuration files and
+# its dependencies.
+#
+
+AUTOTEST_SVNROOT="svn://svn.freebsd.org/base/user/jmmv"
+AUTOTEST_REVISION="r263766"
+
+SHTK_REMOTE="https://github.com/jmmv/shtk/"
+SHTK_REVISION="shtk-1.5"
Modified: user/jmmv/autotest/node/setup.sh
==============================================================================
--- user/jmmv/autotest/node/setup.sh Wed Mar 26 08:43:05 2014 (r263766)
+++ user/jmmv/autotest/node/setup.sh Wed Mar 26 10:17:17 2014 (r263767)
@@ -32,41 +32,271 @@
# Configures the current machine as an autotest node.
shtk_import cli
+shtk_import config
-# Installs any required packages and ensures they are up-to-date.
-install_deps() {
- pkg update
- pkg install -y qemu-devel kyua
- pkg upgrade -y
+# List of valid configuration variables.
+#
+# Please remember to update sysbuild.conf(5) if you change this list.
+SETUP_CONFIG_VARS="ATF_REMOTE ATF_REVISION \
+ AUTOTEST_SVNROOT AUTOTEST_REVISION \
+ ROOT \
+ SHTK_REMOTE SHTK_REVISION"
+
+
+# Paths to installed files.
+#
+# Can be overriden for test purposes only.
+: ${SETUP_ETCDIR="__AUTOTEST_ETCDIR__"}
+: ${SETUP_ROOT="__AUTOTEST_ROOT__"}
+
+
+# Packages needed to bootstrap autotest.
+PACKAGES="automake autoconf kyua libtool qemu-devel"
+
+
+# Sets defaults for configuration variables and hooks that need to exist.
+#
+# This function should be before the configuration file has been loaded. This
+# means that the user can undefine a required configuration variable, but we let
+# him shoot himself in the foot if he so desires.
+setup_set_defaults() {
+ shtk_config_set ATF_REMOTE "https://github.com/jmmv/atf/"
+ shtk_config_set ATF_REVISION "HEAD"
+ shtk_config_set AUTOTEST_SVNROOT \
+ "svn://svn.FreeBSD.org/base/user/jmmv/autotest/"
+ shtk_config_set AUTOTEST_REVISION "HEAD"
+ shtk_config_set ROOT "${SETUP_ROOT}"
+ shtk_config_set SHTK_REMOTE "https://github.com/jmmv/shtk/"
+ shtk_config_set SHTK_REVISION "HEAD"
+}
+
+
+# Prints the source directory of a specific component.
+#
+# \param component Name of the source component.
+srcdir() {
+ local component="${1}"; shift
+
+ echo "$(shtk_config_get ROOT)/src/${component}"
+}
+
+
+# Prints the directory of the installed built programs.
+localdir() {
+ echo "$(shtk_config_get ROOT)/local"
+}
+
+
+# Fetches a repository from git and syncs it to a specific revision.
+#
+# \param remote Address of the repository.
+# \param revision Revision to sync to.
+# \param target Directory into which to fetch the sources.
+fetch_git() {
+ local remote="${1}"; shift
+ local revision="${1}"; shift
+ local target="${1}"; shift
+
+ if [ ! -d "${target}" ]; then
+ mkdir -p "$(dirname "${dir}")"
+ git clone "${remote}" "${target}"
+ fi
+
+ cd "${target}"
+ git fetch
+ git checkout "${revision}"
+ cd -
}
-# Builds the source code.
+# Builds a source package.
#
-# \param ... Arguments to make. Use to pass variable overrides for the host,
-# such as the location of shtk(1).
+# \param dir Directory in which the source code lives.
build() {
- make -C "$(shtk_cli_dirname)" clean
- make -C "$(shtk_cli_dirname)" all "${@}"
+ local dir="${1}"; shift
+
+ (
+ cd "${dir}"
+ PATH="$(localdir)/bin:$(localdir)/sbin:${PATH}"
+ PKG_CONFIG_PATH="$(localdir)/share/pkgconfig:/usr/libdata/pkgconfig"; \
+ export PKG_CONFIG_PATH
+ autoreconf -is -I "$(srcdir atf)/atf-c" -I "$(srcdir atf)/atf-sh"
+ ./configure --prefix "$(localdir)"
+ gmake -j4
+ gmake install
+ )
+}
+
+
+# Dumps the loaded configuration.
+#
+# \params ... The options and arguments to the command.
+setup_config() {
+ [ ${#} -eq 0 ] || shtk_cli_usage_error "config does not take any arguments"
+
+ for var in ${SETUP_CONFIG_VARS}; do
+ if shtk_config_has "${var}"; then
+ echo "${var} = $(shtk_config_get "${var}")"
+ else
+ echo "${var} is undefined"
+ fi
+ done
+}
+
+
+# Installs a cron job to periodically run setup.
+setup_enable_cron() {
+ local dir="$(cd $(shtk_cli_dirname) && pwd)"
+
+ local timespec="30 */1 * * *"
+ local entry="( cd '${dir}'"
+ entry="${entry}; svnlite update"
+ entry="${entry}; make"
+ entry="${entry}; ./setup all"
+ entry="${entry} ) >/dev/null 2>/dev/null # AUTOTEST"
+
+ crontab -l | awk "
+/# AUTOTEST/ {
+ next
+}
+
+END {
+ print \"${timespec} ${entry}\"
+}
+" | crontab -
}
# Sets up rc.conf to start autotest_node on boot.
-enable_daemon() {
- grep "local_startup.*$(shtk_cli_dirname)/rc.d" /etc/rc.conf \
- || echo "local_startup=\"\${local_startup} $(shtk_cli_dirname)/rc.d\"" \
+setup_enable_daemon() {
+ local dir="$(srcdir autotest)/node"
+
+ grep "local_startup.*${dir}/rc.d" /etc/rc.conf \
+ || echo "local_startup=\"\${local_startup} ${dir}/rc.d\"" \
>>/etc/rc.conf
grep "autotest_node_enable=yes" /etc/rc.conf \
|| echo "autotest_node_enable=yes" >>/etc/rc.conf
- "$(shtk_cli_dirname)/rc.d/autotest_node" start
+ #"${dir}/rc.d/autotest_node" start
+}
+
+
+# Fetches the source code of ATF to have access to its autoconf files.
+# TODO(jmmv): Remove once we install the atf-*.m4 files in the base system.
+setup_sync_atf() {
+ local dir="$(srcdir atf)"
+
+ fetch_git "$(shtk_config_get ATF_REMOTE)" \
+ "$(shtk_config_get ATF_REVISION)" "${dir}"
+}
+
+
+# Syncs and builds autotest to a specific revision.
+setup_sync_autotest() {
+ local dir="$(srcdir autotest)"
+ mkdir -p "$(dirname "${dir}")"
+
+ local svnroot="$(shtk_config_get AUTOTEST_SVNROOT)"
+ local revision="$(shtk_config_get AUTOTEST_REVISION)"
+ if [ -d "${dir}" ]; then
+ ( cd "${dir}" && svnlite update -r "${revision}" )
+ else
+ svnlite co "${svnroot}@${revision}" "$(dirname "${dir}")"
+ fi
+
+ make -C "${dir}/node" clean
+ make -C "${dir}/node" SHTK="$(localdir)/bin/shtk" all "${@}"
+}
+
+
+# Installs any required packages and ensures they are up-to-date.
+setup_sync_packages() {
+ pkg update
+ pkg install -y ${PACKAGES}
+ pkg upgrade -y
+}
+
+
+# Syncs and builds shtk to a specific revision.
+setup_sync_shtk() {
+ local dir="$(srcdir shtk)"
+
+ fetch_git "$(shtk_config_get SHTK_REMOTE)" \
+ "$(shtk_config_get SHTK_REVISION)" "${dir}"
+ build "${dir}"
+}
+
+
+# Performs the host setup.
+#
+# This operation can be run both to set up a new host or to update an existing
+# host to newer autotest sources or configurations.
+setup_all() {
+ setup_sync_packages
+ setup_sync_atf
+ setup_sync_shtk
+ setup_sync_autotest
+ setup_enable_daemon
+ setup_enable_cron
}
# Program entry.
main() {
- install_deps
- build "${@}"
- enable_daemon
+ local config_file="${SETUP_ETCDIR}/host.conf"
+ local expert_mode=false
+
+ shtk_config_init ${SETUP_CONFIG_VARS}
+
+ local OPTIND
+ while getopts ':c:o:X' arg "${@}"; do
+ case "${arg}" in
+ c) # Name of the configuration to load.
+ config_file="${OPTARG}"
+ ;;
+
+ o) # Override for a particular configuration variable.
+ shtk_config_override "${OPTARG}"
+ ;;
+
+ X) # Enable expert-mode.
+ expert_mode=true
+ ;;
+
+ \?)
+ shtk_cli_usage_error "Unknown option -${OPTARG}"
+ ;;
+ esac
+ done
+ shift $((${OPTIND} - 1))
+
+ [ ${#} -ge 1 ] || shtk_cli_usage_error "No command specified"
+
+ local exit_code=0
+
+ local command="${1}"; shift
+ local function="setup_$(echo ${command} | tr - _)"
+ case "${command}" in
+ all|config)
+ setup_set_defaults
+ shtk_config_load "${config_file}"
+ "${function}" "${@}" || exit_code="${?}"
+ ;;
+
+ enable-cron|enable-daemon|sync-atf|sync-autotest|sync-packages|sync-shtk)
+ shtk_bool_check "${expert_mode}" \
+ || shtk_cli_usage_error "Using ${command} requires expert" \
+ "mode; try passing -X"
+ setup_set_defaults
+ shtk_config_load "${config_file}"
+ "${function}" "${@}" || exit_code="${?}"
+ ;;
+
+ *)
+ shtk_cli_usage_error "Unknown command ${command}"
+ ;;
+ esac
+
+ return "${exit_code}"
}
More information about the svn-src-user
mailing list