From: Michal Nowikowski Date: Thu, 26 Sep 2019 13:20:05 +0000 (+0200) Subject: [hammer] added support for building kea on alpine and producing apk packages X-Git-Tag: tmark-pre-35~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2F772-alpine-package;p=thirdparty%2Fkea.git [hammer] added support for building kea on alpine and producing apk packages --- diff --git a/hammer.py b/hammer.py index 74036e28dd..16f39ae11b 100755 --- a/hammer.py +++ b/hammer.py @@ -55,6 +55,7 @@ SYSTEMS = { '10'], 'freebsd': ['11.2', '12.0'], + 'alpine': ['3.10'] } # pylint: disable=C0326 @@ -86,6 +87,7 @@ IMAGE_TEMPLATES = { 'debian-10-virtualbox': {'bare': 'debian/buster64', 'kea': 'godfryd/kea-debian-10'}, 'freebsd-11.2-virtualbox': {'bare': 'generic/freebsd11', 'kea': 'godfryd/kea-freebsd-11.2'}, 'freebsd-12.0-virtualbox': {'bare': 'generic/freebsd12', 'kea': 'godfryd/kea-freebsd-12.0'}, + 'alpine-3.10-lxc': {'bare': 'godfryd/lxc-alpine-3.10', 'kea': 'godfryd/kea-alpine-3.10'}, } LXC_VAGRANTFILE_TPL = """# -*- mode: ruby -*- @@ -170,6 +172,18 @@ def get_system_revision(): revision = revision[0] elif system == 'centos': revision = revision[0] + else: + if os.path.exists('/etc/os-release'): + vals = {} + with open('/etc/os-release') as f: + for l in f.readlines(): + if '=' in l: + key, val = l.split('=', 1) + vals[key.strip()] = val.strip() + system = vals['ID'] + revision = vals['VERSION_ID'] + if system == 'alpine': + revision = revision.rsplit('.', 1)[0] elif system == 'FreeBSD': system = system.lower() revision = platform.release() @@ -308,6 +322,18 @@ def _prepare_installed_packages_cache_for_rpms(): return pkg_cache +def _prepare_installed_packages_cache_for_alpine(): + pkg_cache = {} + + _, out = execute("apk list -I\\n'", timeout=15, capture=True, quiet=True) + + for line in out.splitlines(): + name = line.strip() + pkg_cache[name] = dict(status='ii') + + return pkg_cache + + def install_pkgs(pkgs, timeout=60, env=None, check_times=False, pkg_cache={}): """Install native packages in a system. @@ -323,11 +349,13 @@ def install_pkgs(pkgs, timeout=60, env=None, check_times=False, pkg_cache={}): pkgs = pkgs.split() # prepare cache if needed - if not pkg_cache and system in ['centos', 'rhel', 'fedora', 'debian', 'ubuntu']: + if not pkg_cache and system in ['centos', 'rhel', 'fedora', 'debian', 'ubuntu']:#, 'alpine']: # TODO: complete caching support for alpine if system in ['centos', 'rhel', 'fedora']: pkg_cache.update(_prepare_installed_packages_cache_for_rpms()) elif system in ['debian', 'ubuntu']: pkg_cache.update(_prepare_installed_packages_cache_for_debs()) + elif system in ['alpine']: + pkg_cache.update(_prepare_installed_packages_cache_for_alpine()) # check if packages actually need to be installed if pkg_cache: @@ -355,8 +383,10 @@ def install_pkgs(pkgs, timeout=60, env=None, check_times=False, pkg_cache={}): cmd = 'sudo apt install --no-install-recommends -y' elif system == 'freebsd': cmd = 'sudo pkg install -y' + elif system == 'alpine': + cmd = 'sudo apk add' else: - raise NotImplementedError + raise NotImplementedError('no implementation for %s' % system) pkgs = ' '.join(pkgs) cmd += ' ' + pkgs @@ -663,13 +693,14 @@ class VagrantEnv(object): os.makedirs(pkgs_dir) if self.system in ['ubuntu', 'debian']: - # TODO: change to pkgs folder execute('scp -F %s -r default:/home/vagrant/kea-src/isc-kea_* .' % ssh_cfg_path, cwd=pkgs_dir) execute('scp -F %s -r default:/home/vagrant/kea-src/*deb .' % ssh_cfg_path, cwd=pkgs_dir) elif self.system in ['fedora', 'centos', 'rhel']: execute('scp -F %s -r default:/home/vagrant/pkgs/* .' % ssh_cfg_path, cwd=pkgs_dir) + elif self.system in ['alpine']: + execute('scp -F %s -r default:/home/vagrant/packages/vagrant/x86_64/* .' % ssh_cfg_path, cwd=pkgs_dir) else: - raise NotImplementedError + raise NotImplementedError('no implementation for %s' % self.system) if upload: repo_url = _get_full_repo_url(repository_url, self.system, self.revision, pkg_version) @@ -684,10 +715,15 @@ class VagrantEnv(object): upload_cmd += ' --upload-file %s ' file_ext = '.rpm' + elif self.system == 'alpine': + upload_cmd += ' --upload-file %s ' + file_ext = '' + repo_url = urljoin(repo_url, '%s/v%s/x86_64/' % (pkg_isc_version, self.revision)) + upload_cmd += ' ' + repo_url for fn in os.listdir(pkgs_dir): - if not fn.endswith(file_ext): + if file_ext and not fn.endswith(file_ext): continue fp = os.path.join(pkgs_dir, fn) cmd = upload_cmd % fp @@ -819,6 +855,7 @@ def _install_gtest_sources(): cmd = 'wget --no-verbose -O /tmp/gtest.tar.gz ' cmd += 'https://github.com/google/googletest/archive/release-1.8.0.tar.gz' execute(cmd) + execute('sudo mkdir -p /usr/src') execute('sudo tar -C /usr/src -zxf /tmp/gtest.tar.gz') os.unlink('/tmp/gtest.tar.gz') @@ -830,11 +867,16 @@ def _configure_mysql(system, revision, features): execute('sudo systemctl start mariadb.service') time.sleep(5) - if system == 'freebsd': + elif system == 'freebsd': cmd = "echo 'SET PASSWORD = \"\";' " cmd += "| sudo mysql -u root --password=\"$(sudo cat /root/.mysql_secret | grep -v '#')\" --connect-expired-password" execute(cmd, raise_error=False) + elif system == 'alpine': + execute('sudo rc-update add mariadb') + execute('sudo /etc/init.d/mariadb setup', raise_error=False) + execute('sudo /etc/init.d/mariadb start') + cmd = "echo 'DROP DATABASE IF EXISTS keatest;' | sudo mysql -u root" execute(cmd) cmd = "echo 'DROP USER 'keatest'@'localhost';' | sudo mysql -u root" @@ -894,6 +936,9 @@ def _configure_pgsql(system, features): if system == 'freebsd': # echo or redirection to stdout is needed otherwise the script will hang at "line = p.stdout.readline()" execute('sudo service postgresql start && echo "PostgreSQL started"') + elif system == 'alpine': + execute('sudo rc-update add postgresql') + execute('sudo /etc/init.d/postgresql start') else: execute('sudo systemctl enable postgresql.service') execute('sudo systemctl start postgresql.service') @@ -1012,7 +1057,7 @@ def _install_freeradius_client(system, revision, features, env, check_times): elif system in ['debian', 'ubuntu']: install_pkgs('nettle-dev', env=env, check_times=check_times) else: - raise NotImplementedError + raise NotImplementedError('no implementation for %s' % system) # checkout sources, build them and install execute('rm -rf freeradius-client') @@ -1287,8 +1332,37 @@ def prepare_system_local(features, check_times): execute('sudo service mysql-server start', env=env, check_times=check_times, raise_error=False) + # prepare alpine + elif system == 'alpine': + + execute('sudo adduser vagrant abuild') + + packages = ['gcc', 'g++', 'make', 'autoconf', 'automake', 'libtool', 'openssl-dev', + 'boost-libs', 'boost-dev'] + + if 'docs' in features: + packages.extend(['py-sphinx', 'py-sphinx_rtd_theme']) + + if 'unittest' in features: + _install_gtest_sources() + + if 'mysql' in features: + packages.extend(['mariadb-dev', 'mariadb', 'mariadb-client']) + + if 'pgsql' in features: + packages.extend(['postgresql-dev', 'postgresql']) + + if 'native-pkg' in features: + packages.extend(['alpine-sdk']) + + install_pkgs(packages, env=env, timeout=6 * 60, check_times=check_times) + + # log4cplus needs to be taken from extra repository, edge testing + execute('sudo apk add log4cplus log4cplus-dev --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted', + env=env, timeout=60, check_times=check_times) + else: - raise NotImplementedError + raise NotImplementedError('no implementation for %s' % system) if 'mysql' in features: _configure_mysql(system, revision, features) @@ -1361,7 +1435,7 @@ def _build_binaries_and_run_ut(system, revision, features, tarball_path, env, ch cmd += ' --with-cql=/usr/bin/pkg-config' if 'unittest' in features: # prepare gtest switch - use downloaded gtest sources only if it is not present as native package - if system in ['centos', 'fedora', 'rhel', 'freebsd']: + if system in ['centos', 'fedora', 'rhel', 'freebsd', 'alpine']: cmd += ' --with-gtest-source=/usr/src/googletest-release-1.8.0/googletest/' elif system == 'debian' and revision == '8': cmd += ' --with-gtest-source=/usr/src/googletest-release-1.8.0/googletest/' @@ -1373,7 +1447,7 @@ def _build_binaries_and_run_ut(system, revision, features, tarball_path, env, ch else: cmd += ' --with-gtest-source=/usr/src/googletest/googletest' else: - raise NotImplementedError + raise NotImplementedError('no implementation for %s' % system) if 'docs' in features and not (system == 'rhel' and revision == '8'): cmd += ' --enable-generate-docs' if system == 'debian' and revision == '8': @@ -1408,7 +1482,7 @@ def _build_binaries_and_run_ut(system, revision, features, tarball_path, env, ch if 'distcheck' in features: cmd = 'make distcheck' else: - cmd = 'make -C doc/sphinx -j%s' % cpus + cmd = 'make -j%s' % cpus execute(cmd, cwd=src_path, env=env, timeout=timeout, check_times=check_times, dry_run=dry_run) if 'unittest' in features: @@ -1474,7 +1548,8 @@ def _build_binaries_and_run_ut(system, revision, features, tarball_path, env, ch if 'install' in features: execute('sudo make install', timeout=2 * 60, cwd=src_path, env=env, check_times=check_times, dry_run=dry_run) - execute('sudo ldconfig', dry_run=dry_run) # TODO: this shouldn't be needed + if system != 'alpine': + execute('sudo ldconfig', dry_run=dry_run) # TODO: this shouldn't be needed if 'forge' in features: if 'mysql' in features: @@ -1483,123 +1558,160 @@ def _build_binaries_and_run_ut(system, revision, features, tarball_path, env, ch execute('kea-admin db-init pgsql -u keauser -p keapass -n keadb', dry_run=dry_run) -def _build_native_pkg(system, revision, features, tarball_path, env, check_times, dry_run, ccache_dir, - pkg_version, pkg_isc_version, repository_url): - """Build native (RPM or DEB) packages.""" +def _build_rpm(system, revision, features, tarball_path, env, check_times, dry_run, + pkg_version, pkg_isc_version, repo_url): + # install our freeradius-client but now from rpm + cmd = 'bash -c "cat <