schutzbot: add CI integration

The CI is in two stages, for each supported distro.

First the RPMs are generated from the spec file in the repo for the
given distro and architecture.

Once all the RPM builds have succeeded successfully, a test machine is
provisioned with osbulid-composer installed, and koji API enabled.

The repository containing the RPMs of the code being tested is also
enabled on the test machine, and the cli client is installed.

Finally, the test/integration.sh script is executed, which currently
does nothing.

Signed-off-by: Tom Gundersen <teg@jklm.no>
This commit is contained in:
Tom Gundersen 2020-09-09 18:59:36 +01:00 committed by Christian Kellner
parent ec033ed623
commit a416570ea2
9 changed files with 450 additions and 0 deletions

View file

@ -73,6 +73,18 @@ rpmdirs_target = custom_target(
rpmbuild = find_program('rpmbuild', required: false)
srpm_target = custom_target(
'srpm',
command: [
rpmbuild, '-bs',
spec_file,
'--define', '_sourcedir ' + meson.build_root(),
'--define', '_topdir ' + rpmdirs_target.full_path()
],
output: 'srpms',
depends: [archive]
)
rpm_target = custom_target(
'rpm',
command: [

183
schutzbot/Jenkinsfile vendored Normal file
View file

@ -0,0 +1,183 @@
pipeline {
agent none
environment {
AWS_REGION = "us-east-2"
AWS_BUCKET = "imagebuilder-jenkins-testing-use2"
}
options {
timestamps()
ansiColor('xterm')
// Cancel the pipeline if it runs for more than three hours.
timeout(
time: 3,
unit: "HOURS"
)
}
stages {
stage("Prepare 🤔") {
agent { label "schutzbot" }
options {
// Don't checkout the git repository here. It just clogs
// up the Jenkins disk space and does nothing for us.
skipDefaultCheckout()
}
steps {
sh (
label: "Get environment variables",
script: "env | sort"
)
}
}
stage("Mock build 👷🏻") {
// Halt the pipeline immediately if a single mock build fails.
// A failure to build an RPM is serious and must be
// investigated.
failFast true
parallel {
stage('F32') {
agent { label "f32cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'mock.repo',
name: 'fedora32'
)
}
}
stage('EL8') {
agent { label "rhel8cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'mock.repo',
name: 'rhel8cdn'
)
}
}
}
}
stage("Testing 🍌") {
parallel {
stage('F32 Integration') {
agent { label "f32cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
unstash 'fedora32'
run_tests('integration')
}
post {
always {
preserve_logs('fedora32-integration')
}
}
}
stage('EL8 Integration') {
agent { label "rhel8cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
}
steps {
unstash 'rhel8cdn'
run_tests('integration')
}
post {
always {
preserve_logs('rhel8-integration')
}
}
}
}
}
}
post {
success {
node('schutzbot') {
script {
if (env.BRANCH_NAME == 'master') {
telegramSend "💚 CI passed for koji-osbuild master branch ${env.BUILD_URL}"
}
}
}
}
unsuccessful {
node('schutzbot') {
script {
if (env.BRANCH_NAME == 'master') {
telegramSend "💣 CI failed for koji-osbuild master branch ${env.BUILD_URL}"
}
}
}
}
}
}
// Set up a function to hold the steps needed to run the tests so we don't
// need to copy/paste the same lines over and over above.
void run_tests(test_type) {
// Get CI machine details.
sh (
label: "Get CI machine details",
script: "schutzbot/ci_details.sh"
)
// Deploy the Image Builder packages and services.
sh (
label: "Deploy",
script: "schutzbot/deploy.sh"
)
if (test_type == 'integration') {
sh (
label: "Integration tests",
script: "test/integration.sh"
)
}
}
// Move logs to a unique location and tell Jenkins to capture them on success
// or failure.
void preserve_logs(test_slug) {
// Save the systemd journal.
sh "journalctl --boot > systemd-journald.log"
// Make a directory for the log files and move the logs there.
sh "mkdir ${test_slug} && mv *.log *.jpg ${test_slug}/ || true"
// Artifact the logs.
archiveArtifacts (
allowEmptyArchive: true,
artifacts: "${test_slug}/*.log,${test_slug}/*.jpg"
)
}

48
schutzbot/ci_details.sh Executable file
View file

@ -0,0 +1,48 @@
#!/bin/bash
# Dumps details about the instance running the CI job.
PRIMARY_IP=$(ip route get 8.8.8.8 | head -n 1 | cut -d' ' -f7)
EXTERNAL_IP=$(curl --retry 5 -s -4 icanhazip.com)
PTR=$(curl --retry 5 -s -4 icanhazptr.com)
CPUS=$(nproc)
MEM=$(free -m | grep -oP '\d+' | head -n 1)
DISK=$(df --output=size -h / | sed '1d;s/[^0-9]//g')
HOSTNAME=$(uname -n)
USER=$(whoami)
ARCH=$(uname -m)
KERNEL=$(uname -r)
echo -e "\033[0;36m"
cat << EOF
------------------------------------------------------------------------------
CI MACHINE SPECS
------------------------------------------------------------------------------
Hostname: ${HOSTNAME}
User: ${USER}
Primary IP: ${PRIMARY_IP}
External IP: ${EXTERNAL_IP}
Reverse DNS: ${PTR}
CPUs: ${CPUS}
RAM: ${MEM} GB
DISK: ${DISK} GB
ARCH: ${ARCH}
KERNEL: ${KERNEL}
------------------------------------------------------------------------------
EOF
echo -e "\033[0m"
echo "List of installed packages:"
rpm -qa | sort
echo "------------------------------------------------------------------------------"
# Ensure cloud-init has completely finished on the instance. This ensures that
# the instance is fully ready to go.
while true; do
if [[ -f /var/lib/cloud/instance/boot-finished ]]; then
break
fi
echo -e "\n🤔 Waiting for cloud-init to finish running..."
sleep 5
done

69
schutzbot/deploy.sh Executable file
View file

@ -0,0 +1,69 @@
#!/bin/bash
set -euxo pipefail
function retry {
local count=0
local retries=5
until "$@"; do
exit=$?
count=$(($count + 1))
if [[ $count -lt $retries ]]; then
echo "Retrying command..."
sleep 1
else
echo "Command failed after ${retries} retries. Giving up."
return $exit
fi
done
return 0
}
# Get OS details.
source /etc/os-release
# Koji is only available in EPEL for RHEL.
if [[ $ID == rhel ]] && ! rpm -q epel-release; then
curl -Ls --retry 5 --output /tmp/epel.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo rpm -Uvh /tmp/epel.rpm
fi
# Register RHEL if we are provided with a registration script.
if [[ -n "${RHN_REGISTRATION_SCRIPT:-}" ]] && ! sudo subscription-manager status; then
sudo chmod +x $RHN_REGISTRATION_SCRIPT
sudo $RHN_REGISTRATION_SCRIPT
fi
# Restart systemd to work around some Fedora issues in cloud images.
sudo systemctl restart systemd-journald
# Remove Fedora's modular repositories to speed up dnf.
sudo rm -f /etc/yum.repos.d/fedora*modular*
# Enable fastestmirror and disable weak dependency installation to speed up
# dnf operations.
echo -e "fastestmirror=1\ninstall_weak_deps=0" | sudo tee -a /etc/dnf/dnf.conf
# Ensure we are using the latest dnf since early revisions of Fedora 31 had
# some dnf repo priority bugs like BZ 1733582.
# NOTE(mhayden): We can exclude kernel updates here to save time with dracut
# and module updates. The system will not be rebooted in CI anyway, so a
# kernel update is not needed.
if [[ $ID == fedora ]]; then
sudo dnf -y upgrade --exclude kernel --exclude kernel-core
fi
# Add osbuild team ssh keys.
cat schutzbot/team_ssh_keys.txt | tee -a ~/.ssh/authorized_keys > /dev/null
# Set up a dnf repository for the RPMs we built via mock.
sudo cp mock.repo /etc/yum.repos.d/
# Add any overlay repos
sudo cp schutzbot/repos/${ID}/${VERSION_ID}/* /etc/yum.repos.d/
# Install the Image Builder packages and the koji cli plugin.
retry sudo dnf -y install osbuild-composer-koji koji-osbuild-cli
# Start services.
sudo systemctl enable --now osbuild-composer.socket
sudo systemctl enable --now osbuild-composer-koji.socket

101
schutzbot/mockbuild.sh Executable file
View file

@ -0,0 +1,101 @@
#!/bin/bash
set -euo pipefail
# Colorful output.
function greenprint {
echo -e "\033[1;32m${1}\033[0m"
}
# Get OS and architecture details.
source /etc/os-release
ARCH=$(uname -m)
# Mock is only available in EPEL for RHEL.
if [[ $ID == rhel ]] && ! rpm -q epel-release; then
greenprint "📦 Setting up EPEL repository"
curl -Ls --retry 5 --output /tmp/epel.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo rpm -Uvh /tmp/epel.rpm
fi
# Register RHEL if we are provided with a registration script.
if [[ -n "${RHN_REGISTRATION_SCRIPT:-}" ]] && ! sudo subscription-manager status; then
greenprint "🪙 Registering RHEL instance"
sudo chmod +x $RHN_REGISTRATION_SCRIPT
sudo $RHN_REGISTRATION_SCRIPT
fi
# Install requirements for building RPMs in mock.
greenprint "📦 Installing mock requirements"
sudo dnf -y install createrepo_c meson mock ninja-build python3-pip rpm-build
# Install s3cmd if it is not present.
if ! s3cmd --version > /dev/null 2>&1; then
greenprint "📦 Installing s3cmd"
sudo pip3 -q install s3cmd
fi
# Jenkins sets a workspace variable as the root of its working directory.
WORKSPACE=${WORKSPACE:-$(pwd)}
# Mock configuration file to use for building RPMs.
MOCK_CONFIG="${ID}-${VERSION_ID%.*}-$(uname -m)"
# The commit we are testing
GIT_SHA=$(git rev-parse --short HEAD)
# Bucket in S3 where our artifacts are uploaded
REPO_BUCKET=osbuild-composer-repos
# Public URL for the S3 bucket with our artifacts.
MOCK_REPO_BASE_URL="http://${REPO_BUCKET}.s3-website.us-east-2.amazonaws.com"
# Directory to hold the RPMs temporarily before we upload them.
REPO_DIR=koji-osbuild/${GIT_SHA}/${ID}${VERSION_ID//./}_${ARCH}
# Full URL to the RPM repository after they are uploaded.
REPO_URL=${MOCK_REPO_BASE_URL}/${REPO_DIR}
# Print some data.
greenprint "🧬 Using mock config: ${MOCK_CONFIG}"
greenprint "📦 Git SHA: ${GIT_SHA}"
greenprint "📤 RPMS will be uploaded to: ${REPO_URL}"
# Build source RPMs.
greenprint "🔧 Building source RPMs."
meson build
ninja -C build srpms
# Compile RPMs in a mock chroot
greenprint "🎁 Building RPMs with mock"
sudo mock -v -r $MOCK_CONFIG --resultdir repo/$REPO_DIR --with=tests \
build/rpmbuild/SRPMS/*.src.rpm
# Change the ownership of all of our repo files from root to our CI user.
sudo chown -R $USER repo/${REPO_DIR%%/*}
# Move the logs out of the way.
greenprint "🧹 Retaining logs from mock build"
mv repo/${REPO_DIR}/*.log $WORKSPACE
# Create a repo of the built RPMs.
greenprint "⛓️ Creating dnf repository"
createrepo_c repo/${REPO_DIR}
# Upload repository to S3.
greenprint "☁ Uploading RPMs to S3"
pushd repo
s3cmd --acl-public sync . s3://${REPO_BUCKET}/
popd
# Create a repository file.
greenprint "📜 Generating dnf repository file"
tee mock.repo << EOF
[schutzbot-mock]
name=schutzbot mock ${GIT_SHA} ${ID}${VERSION_ID//./}
baseurl=${REPO_URL}
enabled=1
gpgcheck=0
# Default dnf repo priority is 99. Lower number means higher priority.
priority=5
EOF

View file

@ -0,0 +1,7 @@
[osbuild-mock]
name=osbuild mock osbuild/osbuild-composer/PR-952-98cb0e5 fedora32
baseurl=http://osbuild-composer-repos.s3-website.us-east-2.amazonaws.com/osbuild/osbuild-composer/PR-952/98cb0e5/fedora32_x86_64
enabled=1
gpgcheck=0
# Default dnf repo priority is 99. Lower number means higher priority.
priority=5

View file

@ -0,0 +1,7 @@
[osbuild-mock]
name=osbuild mock osbuild/osbuild-composer/PR-952-98cb0e5 rhel82
baseurl=http://osbuild-composer-repos.s3-website.us-east-2.amazonaws.com/osbuild/osbuild-composer/PR-952/98cb0e5/rhel82_x86_64
enabled=1
gpgcheck=0
# Default dnf repo priority is 99. Lower number means higher priority.
priority=5

View file

@ -0,0 +1,20 @@
# SSH keys from members of the osbuild team that are used in CI.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCxjfFIIlGfCn9iclHymWrEBrTU2lL6tkSGT1ep7dCPzw1jY6WnhQlPXMpePriNxNXlG8cWO9/RFpBd0z9FwNy+kfgh9fuyNY49I+Ma6OyTVBg5hNoFxfRXG5iHtc/SQlnbEFiKpSk4lipo4QZtBtmgAqgkSA6Dzhygb6u5M9ixTIx4WBjuSM0GXQzNjpefyiWu+sIR+h2UrQkKABuuIYQbrjl+FhVmaLvrvyTO2usOtvnYBjhbPwyO72WPjapKd/9hTaqPE1wFy6UF2nXc4Pgw0giQb6sibFTz7NTexW35Q98qpQOWMYKcpgZrlSaHHKZSMhtzO7MdZrOLFUXoS1AeAy4ghtcNrOBTlb5SvP73zz0qBRF2cCO4O0wp5wwqPhvw2ntb3pTLPtdetJ+V50QPnpnXySSnZp2zFwce21bXx67nh9lnhLrZgje7coQnPAFx/cl36ESJygiuPcBw+k18YulYMXUqaBtkwJLkRjDpjTX2e5MJ16oD7sJHc4/W5kyfLvdMsVhdq1CXHGVVOpzogb095VYi0RXFpnZR/1eVgC/R+WVytYfY80rfVOcdAo2GZfnJ5zYRUXJJ9MZkanxx3E7UOikEJN9sUj200z6Cyy0IfIqTbJ1B5f7fd3acRrL4DcYUdFI/1ByNW6F1j7cZiAGOJKNbzXF0T3tf8x0e1Q== major@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDE+WCsyhgXLEBvcNKmEO5w9cYsqlcTUpQLgtHAO8+Ub1bw3UTuiJ/Qd3QmAr6gnb1US0Zs8srTZ5W34jOmYcupmmujLEUUrc/Lj2UzIDWqYi04GD3nzGM/oRWT2glJUXBe63bdy38/GfGdNqp9ZkVgaOEkwVyaxAuNcgNXoEJroSWMStvnDki9SvmXn972QFn+vfQdSt+6z18YFqyE0UhNVX+VE6rezNFRzARCrd+nCc8fVdTRd2vQ+0McButDLzwRXEwLjNOPfXCvoI5EH8+uhOWzLlR9ChfsMcbsipDRHyee0hKWhqg/C8j2DCC9r0zHArPcvLi+qGNIxdSE+KXjWRInr/DSttN/MwDulhJ4uHQQA/PDM1W8yddZpfBv1PaDO+wsm6s2bMN1mzgUPAOZK+i6gaYuoVc89f6+aHJVEPgtqT9Zp+6PD13RWDV6jfi0pfmwRi/CXLlc588oU5D8LEmlUNnUvSNmyV7OJayIK+K6+e7hWGC6/UWess+WSBc= larskarlitski@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQR4bv/n0rVI0ZHV4QoEjNrnHsUFFAcLJ6FWnnJyI31aFXWjjPf3NkbynPqqv3ksk9mj6jJzIBnlo2lZ0kLKIlnblJAyz0GVctxPsBQjzijgLPWTWXS/cLoyLZNS7AsqyTe9rzUATDHmBSje5FaJ6Shas2fybiD5V56fVekgen+sKVBWyFAKsxlWV1EytH5WLn0X0H6K50eCA7sNDfNlGs8k8EXmQPmLOEV55nGI4xBxLmAwx/dn9F3t2EhBwGzw1B6Zc4HA/ayWtJcoARO3gNiazTHKZUz37AAoJ2MnLB698L39aYZ/M55zduSLcyUqF+DBHMfzHH3QRsG0kzv+X9 tgunders@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDV/HNj7nVUp+Yh2hAhHgU+R6X9tLAnApUALhPK8oqH/WG6SjXDiLLEoCSisqu+3+WQ3/UcJeoRl5jpyRAjhxnsz/o5tfLXFDJBZ1/njE9T+e73tjfgS6s+BRpCdEAv6/BUVCxz4B5yI7+5mph0JFpv/soe8uhR6MlxAVxAhaLla4S2UPcn6SciyVznIzrTWgfsSHk/o5hIDVfJ68qYVPWqZWmV86hjE/VhPVgmiqFFh2YsJO/FlH36+wtABcKHbovkCjqQ9PkUqfns+82CNjP/XQ6GJZVK5xpYT59ILjlFwA5s9SYkLcjI+Xy2GGNm4ftNqtoF57q33pfDkxQsYJ+D obudai@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDm5/cfoo+5LBS+0bZ51w8gnB8gUUnUf4Kl4TaLIJF0wBrsywMBXtyRZFhEf04U40bNvWoVjkA3ISvq2Y1PBTRYy78VI5LfOA9/39THVDUZy1l9siSXKpNKx3bUgWGQ17jql7zwzF/Ad4h7E2YD56gtfRXmmF2eFQ2q6OZBXxJgDpbyvBpV0HdmarKTnUSwuvCjkLBSbFSc9MGrFkkkfQjkXtDq6ovzaxr40+u2pEZn/GuwTGFi93Lyovfa/Z4fOrHbJD+AlSmRKUO9Wm+QkSyIuQYeQlr1lN2Mx5tgV2umuuM++mEZq0clfMl7LCz/BfvEUb7w6KxmR++G9nATv1s/ anilsson@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw6IgsAlMJQlOtJXvtlY1racZPntLiy4+iDwrPMCgbYbsylY5TI2S4JCzC3OsnOF/abozKOhTrX04KOSOPkG8iZjBEUsMX4rQXtdViyec8pAdKOimzN9tdlfC2joW8jPlr/wpKMnMRCQmNDUZIOl1ujyTeY592JE8sj9TTqyc+fk= bcl@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDCk/bA7cpp5ynNr+0SGFFjfdJY1M4EUGqbqbcEQ3uU/CX7AhDEHB2pZMAoCPenoIlB0tz3qTvhQqn9jskiT70qU7bDIRbouXit3Jo0YheYZB7+eD/zxAHropUqjA3Bs6JSoBf2z48FumiFfP+eI0UFJ601Zux2fJCTpLuiboEscegWGyzJrl8/b7XCppNusewM1POyErZDlgHh/2gD7rsupMQKxv3rDOexbGMsA3aGgdrPkvg966tCN5Fz7eBM1RQ3o2ywojTgX9I3U/VeZRJ3w1T1IRDAF/DIMh/dA0afsSXn/7PJUx4NiTRstaBbuYYOMs+PQYSE6o2MLdRXZMQA2Dve/dARkg8LO1gvgNEtNUnDcmVPBrKvULDY9viHrGym9Q0Uo6eaxkqQMjzunV5ozUK6pmuYrMK0dODsVDiB4Ja5CQ6pybAOi+i45FqTT8Wc032KbvydWFpnNCvq31vXfVIysqtGASbhWyvry/Qjr04fkcwQhv6Lnph0pAJr5x9ow5rQrQBJZA23hRXDRuUQqpmnFvzK9TWxb1YQSdyQtpuPplbFUfr5JvyCDwHSBzmPZQUESgddmwCmsO6j0KZVmyJkSbXcWW69LMKGmpb1+Fgg2oo9kAW3e89XWyC7VfLIw5Qog08GtlgcpW92w75nSu3wPMi3ww2g78aG5zgLGw== daherrma@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApQ0yn8aUPRXoJgGZpWXcOjMXjJgmq9KN/tg0iyK9nuR3uRfdiNGTpgKr7DY9HfdP07R09e/uZ8qnLcXUrXYfJj087JNTMHjT1Ifb0KUB9Mzy82RDUFuefds356arhzhW6YS4cOOgY2GmEt2KhftjdHRic/eElZW9I5mA3Oz/uDk= ckellner@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8E4VU/3riYCdVAQMBWpwXHiN2/MmUoriYDe6o+hNQ6E1aubdHJ4kYIBxLPYaRvy5sLrbXhsFQH3eNx3HD0TvLiaKU6p9Vj1vEJuTGxB0rIWFATGxvUmBRmUrPNSiWJNCfhjNHTHqboNTf9rX+qgQY5ZqobVpbWHm+sq9QFMtrrF29FiWyowQIFQEPVFx7069Hfk0/JZlEc6rwqX+uiLU8fWP8X1uyXVuNP1xODFX+E/+SC4AbF/wfLlzZ1DVAadzBmCqmqaYQ/dTutXXOeCkiyT8WsPMwp/3FVM+IBwNbyr99fxX0l9j99g7v3vBX3rxV1R4jdQg6htdB7f+ihLAjnAqdNM2ufj0zLn7luJ9icVmV88+DkZf85Y81y/wqqiXEA8BgLlR8zsgnO4RcJoZHq6IErCjvOHBD2rgUAPtJWRLGPUeO53nKyYSobLslIg5dK4klp94DBblV6R+e0tsZQMVvlyj2iBSY/aBR0Cm4em8sXsoZeUQ9+JW6KWXM0yCLAYzhPOsWVi+65qaGjM9JfJKkrdk70Bqx9CixY25WRHiEtUbTpzqNoVil8AB/Ajvofjd36GhQhcng4MKfAUnGm5QQo4k1XT0ExSAwBI3FkkUNZQREhzAdkFdbSo/Iteh2u/OENgJ84nonCUVVFm/vw4nhG+Vmi8E7PJno/jzwoQ== jgiardin@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDQqwlSYW+lD0qlxrol3JQgcN0QSaT9sm3vmhxX18OnP/3XyxZwgnEiJtIDnoZ2FAWOEKTQ9PP0Ab9gfko9mWl6OP5Nj0wT37ZeWYAJoOA3qLw1PCUF8caHs9NcgTEc2Gd+yKIxObQo2xGZQFLBW7owI4S9Rl1a30+5oLFRZJXx8Yd5+b1xFUU/4oOSkc3birHlwTZrFrW6H+AYT4u9ioSvBKtmj7KCqzbRW7p6Sk40p0EoCYU83ZsevzYXTHTAFRHD/gsRS4N7SOUClz+ZnakVBV7fa0ETLkfSmVplhlklBQjBM7OVLeghjlSRXhAcVV63iJfTMNlTjM47MB/C48L+AlH9KMYmbR1ur44NsNGFKTe08B3Q1YfcSR4no6B5iR+zgb6fpDolklAcW5qbHiOOad3Gd8M7VGpDrHZzQe7QGe6fVMKjVq7xfJFgvOaW44F7RTgL6FnT3bNoi6k26enl1O7WlM0v8j/SwtJlSl3I0HpJXLWP/sgr7U590hZSRgG2U5hoXV9YXUCyLFy4pom82CSkAPT2DybdbnhCf4FAnW2CuZMr7KXuVrHC11LA+S2HLN9Fc9f8SA745+0gO5GTvoSWEt6oAgqPWgK6xj3aeHqWN4WQvMHzdftLh4ZxjHd+c7VxreEMQgZJ124W5nUttn4S0xpJHFMADJ44Kjxg6w== jkozol-1@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDMk4+D+GkL/se9RYdQ6mmv0v7cG3gXPiZdLvsbRFk+JMgnLEFUu4uwRN9+huMWdTXYLVcCZVw1l9kmDAOwPKYCGwetOwYI73nYt4n7i9zSQqKknxEO2w+16PvWy6kbgk7zQp9YEqJlIeZbVXiDuFeFyqEH5TxdAfDLu0VG/Db0M1Cor3v7g0/utHWVfS0QiLMQ5xLZ3jAbn/uTjOzsvtA219BTfdx7IVxKmG9/zeLUqyHBcOquI2rUjgHj1FN4yMCob2pSmAfV2u1iQZYHghXlw/kzh4BODjOSWCO9v+621eBdDJ36hdMHWizevxLz9Tj7X1Pwz+4TS/WABXs5MXBFcxx65wpSBr84LfZfWebe+vFe3Kkmdop3FPt7uuZyl8xdRsvfoIG3qZg2izX4IAtXo9tR++yIsEkP/5k/NVwkq158molT0HUruuK9regPRRvf7j6psAH4bMhV3o430eD7ibC5g1yT3kKbGnbJJX+HHL0+lt8IKMPCHWEWOT8uR0x9VUbT4RYFXt53I/ZXHXop+eypEctoKlsgMv1rpPGwSnrhtK1hgf399ph7GDjixZiuzcTP+Ulmj3atB32UHR7mRjarnaCI1w7PJt8pmg9K+8/XUa51q7bap1PGwsJS0lZ3zJEXFPdJfqO8/fkhDb4NYPlX0/bg/LNI9YqPg8CWSw== jkozol-2@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDZ9VgDuObR96fouIDfvzTQxfvMdb4OaK9UPYtQkaVg25a+Yb734Xf0bPFGjM9vtvJmy19qUSlCioqmkEcwheczoDsI/nLBnlRFH3FTmRt3WGJdWcO5MkVXbQAlTqMAlMI86OkeV3jGi5aKYbQ2QJa2ilvQ4JjTEPcAdBmaV9iFgrh9DnIHiAG4RJhrl2BGyf29FIGHusQp7rQSvkwuFPsITjXLcwUKSKbI4+ycwmJN492ovcsiqzG5+YWx12fm3woUWvqFIrt70yc+C7QP68qKJE6qnzWtzZxqtdHR48US0l9xTWB78HGlu0chtTfcF9xT7gokHmx95RWmfXU2fygt1wEYiKNoQnhZTb71ay6fWgzZMOnWrQSyhvKQpIGdPuyevCG7aNtQYTfgCfmPAfZpR1hLQe0feTTLWeS/3aBHUYwYigskFfOZuKy/3Gd8UA2uLeFSOaQ4rYK7sk/FnhGkzxpnW0FR6EXpvWRWdiusjvIZJRyHqb8O3I2uY9aiqV92OaEzwrBlNqqqg0+a7sZOlV8ZtVtzuqBO3yD4tVLGMvO/f28GJ0FnHExrLWHCStqlRiZvqukoJrGBRHJS0j2UK8agwzDM0jHQ4mxbfOwf618puV/YeRhd77GsFcrPD0KONTMeOEoN1jETTBBGZ7Ly/0MsnpP0WR/s8uuvmT7Xaw== msehnout-1@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC1pAobLYTC9BepQi0MViep8sQ0+OpTxP5FSZyiww+IQHpiXPvAzzYL0CYGagvPCI9zPQXx852XjP4T4/Oda5ejcP4+RbT/6ndbUm78xlzRrkYi4dd7OVdmm/1vriK1Q5llcnh+69wao5lXXTZ/j84O2bzAFGnG8MJfMa0gRiqOBCt24EQW1a5NYgTAZQBuD92/pJqc1b1S+hZWerxSdtVrhHi8oRlCwYbVWyhxF+OygfZqe4UyaH5m+eHYLJsxOfwvl9aUvp0ahlOT92l74l0ILuzYSTYIFr/W46F/9tYxiV+rEzjX9niR3sUE9R4U6Jia2aIQXJ6gsftX0Oi5r8nr7DJSPzr4zYMPcxZMEe3nt9ig1dp5DEuT16/e9dgfOuPYBPuEpxVjUPgXeYXIEURRuN9WaCXTkhpAEjIlAzaZsUGMNOVIQsPaHyYnsN/Chk2t4wf/ZIXbGefsTqPLwedbhULPzojHJMfg6Jt2PmUkOhmDtY0jd1vE2cV8/o6refnInf8ePliYZeM7xaF3zZz6ZAmpVAwhkyzJA8AoC4Y4A8+nEWnE641B/l6hXeSd2gdmYSi8FkIstTq6+cUammnJRt/yWLQyYkG4T0RYe9Xp79ZdYC28WOCy6tCzin24a1Zxwf2bWUwnji/01GLxwBHL+wIGHA0noG6XNqbdhRumGQ== msehnout-2@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCv+bp9I2UqM4msF8D2deAp8s7LjdmH4zHZgioKFRcWMT7ibAVb9B/DNyV9E5VwNs/ofPVjstylHq8R4AJIJGVhVN8woeBjDYdniVJ42Ae7IqoERACDiqASERQSAtYSi+YNZ91jR7ERyHRYspy7lvLhWTyutZbavZa1rk1H9a2pDCfl2RK1Pb+oL41jFzHpupHdBNR0P9feJbbAvwqK6lZI0vMSdY8sJoiVq5MdvB2dy+S+BFs3TNNREaAr4l9XrJ42kmCkBSWVJkmQlCwT8CefZiTKecDNPQE0NI28ABUwQ2T3UElL65Uw5HrWNqIH6CcDfQPDgRfXnfLbPmJMTFQMWRy0H35EdCz0G21M+DfiSxgtOTL2gY872acqtyRwuOdD8/kKD7BuQtlsjpfJtORY+DIMHFF1hfNSWEDztD/4rP9eehYqY3s6UPMTeaowf+6QoAQqDvZG/RH85LhL1FV42N63cIPuTfPErw35hlOhYOUqYrApNtOdsOoEMUunGM= msehnout-3@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDjBCoSJv5HrA0PquLDJYU36oPI0H23AmU2gs8F3k6kBA71N9pHbs/C+YxFYyrsjLqaLwdo44sE2vXB5igJTZN/YpHYytbKHIGdnh3qc0myMvxDLJUxA1kxx3XfT8vbJ0AHrRIJdV6lxfrifI92a0vqRL1pAuWzW/NYytk6DeYDXbUy4xtHOlRIf2WXqZ2pZXsFleaYMdfmUP0y0awe5YDQsNkOBD2HDbU9669jP+UB0nirVuxDhZr1kZmQ8QdQxlePN5LN0RmbNY5Hm1/2SDuXhWh90/fbbWoCkrLTlkAUHckZPmGiEBhD2n4c7jHc25/fhaZsjZITRzHKP5wWW7LE3tXJVMF4eFEzgCoYEr6RpdEwQqQl86WiA0VuLQZbfju5T8t3y6PcGvXD5BF5BJuq710Uqw6y+gy4gNepO4U32jwBz2DDMMBhHsgjSmPfdTvqrjUnlt9NWTXnVDP34Zc5V+RwCgyB09gkwqW+Ae0jDoRSo1hTBSi7v9Gp5R/Hed0= msehnout-4@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRhju+UtbgUyUzE56Hr8fcRsy0lwk6SKDGn6M7TQ+B0EL5mMTmylbGZ4eP3h+II+GVF5DcoDfXolQvSVn6kSz5lSq/adlbAgGZdxd8Q6N1V+zmMejQf3ZpKQoFWFkmzQoHV+yJkMtWGz//RYqn6eHXvuyDxGyCsdEzBnt10VZL9/g+C45w8l5FlMdGHOhBIkZg1UDLL+2pu8/t4DuPskyr83Thrmb0eZBC4BLLS8Ob9BSZroUgDE1BoSGmfUVnt2Yipjj9qTJ1vWpZPGuqXyCtHHBneJA1b+Hu21CCX/FtSWBNgkbGW2l0rgl8py/GIjqYXPQG0UHkpg6RNlXDARb/GxJVRA2rILX7BsnndKlEh+Kw9Q/IgxpcR5RxZwbH1hYxX1igVyrRW2kAobJhazGV5gBfgm4tZ05dqBL6QX/PqTd6lC5jsyRStwCYIwkh0+Knl2WRagRK/matzvX6MmQXV/vArtY2S4sG73lWN/Af5PnWXQRHRTAyZdSbQC/Ti8c= msehnout-5@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDoVIpowzsQseMML/7I9LcA18G7quBjp2te6GHX9g2IrKh3PxssIS4jQSskRePaCl1yLWhTRDgADkDuOwd8SrQFy7eo7I/GD2wDcdLaWYy4GkdV1M9nhquqpbdLQ2m/3sRhqdHEHadGuw0iYdNgR0M5sNig+xL+G+G4MvjL7hcuaC7GUVbAFWQgePwFWLxjTmX2zmpKQMwk1r4n/i4Wj2GJ7CayxOc9qtnLdnZm9Tj3WA/aRLdbnlM0TCzXrtfO5OLVa9/n3AHY4qqZ1PmRCizLlLtvDeTjhM5qTYCk/xnUNCVnPhe+YqkqXlV6D/D7SI6EIiEd+GI+qJsHt9AgKZpr msehnout-6@redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDY/ylCrPBzil4TnZR4tWULpz3QgfBMQyEnMOHDAJNp/FK70hD+PUiRm3UY96pmGXonQvqiDoyPuVh025FkWshPK91Dyq8QD8h25q5C5Cg6kMgBpdGzbX44ksms1KyOHmSZ48MpWw3PFOrlNP1vysr6Imjz9Jixmx4sOZvqKnrbsbOW04gowVzpZM8m048lvf6/KhqeImfeSRc9Rtpos8GqEQVlwRevE1qBON963V1QtFOrm9weoQgb369SdqRRdxaGNAymNh3d78DneOWXmEyBflLSpIDx5I2s/1NB1Dp95Bp3VvlV3CH1HC7LAFKYi+xsz3/KHdgtvgShX6LFSdsp rvykydal@dhcp-lab-144.englab.brq.redhat.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtJv3QKdqQ+0+jJND7bXVq9ux87yyi4qyJk7iOsX2VsgAUuYXpBf337p5yNB3N1kjOwGYSDjvDvS7GuhdatuvJI3/xzcyodbwJp32AT76e9uvUQHTBBGmUvBLzw3nk8ZDNp5d4rt2cZvlhv7lzDSt30DF14ivg5Xp/V0tK0BEfFlvYHuHheDeiSOQRQ392J7TefPQOW+JpxANU4Bxc1aHIettaIqQMWm9r4ZELd8M83IYt5Btp1bPsnfYywQMYqNXyDuhwhcsBTR5kVObP0DwxKZbMNPmA2lBvrX2GMIa+qfvKIW87KooaoPLt7CR7/DKfQ1S492L1wIwNUPUBLsQD xiaofwan@dhcp-8-203.nay.redhat.com

3
test/integration.sh Executable file
View file

@ -0,0 +1,3 @@
#!/bin/bash
echo "IT IS ALIVE!"