Skip to content

Commit 6a6065a

Browse files
Merge pull request #1060 from Nordix/erja/pre-release-testing
Add pipeline for testing with k8s' pre-release versions
2 parents 39cc2c6 + 5fa8640 commit 6a6065a

File tree

7 files changed

+230
-13
lines changed

7 files changed

+230
-13
lines changed

jenkins/image_building/build-image.sh

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,33 @@ trap cleanup EXIT
1616
# Make sure we run everything in the repo root
1717
cd "${REPO_ROOT}" || true
1818

19+
export AGENT_OS="${AGENT_OS:-"ubuntu"}"
20+
1921
export IMAGE_OS="${IMAGE_OS}"
2022
export IMAGE_TYPE="${IMAGE_TYPE}"
2123

22-
# Disable needrestart interactive mode
23-
sudo sed -i "s/^#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf > /dev/null || true
24+
# Jenkins agent OS-specific package installation and configuration
25+
if [[ "${AGENT_OS}" == "ubuntu" ]]; then
26+
# Disable needrestart interactive mode
27+
sudo sed -i "s/^#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf > /dev/null || true
28+
29+
sudo apt-get update
30+
sudo apt-get install -y python3-dev python3-pip python3-venv qemu qemu-kvm
31+
32+
python3 -m venv venv
33+
elif [[ "${AGENT_OS}" == "centos" ]]; then
34+
# Install EPEL repository for additional packages
35+
sudo yum install -y epel-release
2436

25-
sudo apt-get update
26-
sudo apt-get install -y python3-dev python3-pip python3-venv qemu qemu-kvm
27-
python3 -m venv venv
37+
# Install required packages
38+
sudo yum install -y python3-devel python3-pip qemu-kvm
39+
sudo pip3 install virtualenv
40+
41+
python3 -m virtualenv venv
42+
else
43+
echo "Unsupported AGENT_OS: ${AGENT_OS}"
44+
exit 1
45+
fi
2846

2947
# shellcheck source=/dev/null
3048
. venv/bin/activate

jenkins/image_building/dib_elements/centos-node/install.d/55-install

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,41 @@ net.bridge.bridge-nf-call-ip6tables = 1
2020
EOF
2121

2222
sudo yum install -y container-selinux
23-
sudo yum install -y kubelet-"${KUBERNETES_BINARIES_VERSION//v}" kubeadm-"${KUBERNETES_BINARIES_VERSION//v}" kubectl-"${KUBERNETES_BINARIES_VERSION//v}" cri-o-"${CRIO_BINARIES_VERSION//v}" cri-tools-"${CRICTL_BINARIES_VERSION//v}"
23+
24+
if [[ "${PRE_RELEASE:-}" == "true" ]]; then
25+
# See https://github.com/containernetworking/plugins/releases
26+
CNI_PLUGINS_VERSION="v1.7.1"
27+
28+
# Kubernetes release tooling
29+
# See https://github.com/kubernetes/release/releases
30+
RELEASE_VERSION="${RELEASE_VERSION:-v0.18.0}"
31+
32+
case $(uname -m) in
33+
x86_64) ARCH="amd64" ;;
34+
aarch64) ARCH="arm64" ;;
35+
*) echo "Unsupported architecture: $(uname -m)"; exit 1 ;;
36+
esac
37+
38+
DEST="/opt/cni/bin"
39+
sudo mkdir -p "${DEST}"
40+
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "${DEST}" -xz
41+
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C /usr/local/bin -xz
42+
43+
sudo curl -L --remote-name-all https://dl.k8s.io/release/${KUBERNETES_VERSION}/bin/linux/${ARCH}/{kubeadm,kubelet}
44+
curl -LO "https://dl.k8s.io/release/${KUBERNETES_VERSION}/bin/linux/${ARCH}/kubectl"
45+
46+
sudo install kubeadm kubelet /usr/bin/
47+
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
48+
49+
curl -L --output 10-kubeadm.conf "https://github.com/kubernetes/release/raw/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf"
50+
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
51+
sudo mv 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
52+
curl -L --output kubelet.service "https://github.com/kubernetes/release/raw/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service"
53+
sudo mv kubelet.service /usr/lib/systemd/system/kubelet.service
54+
else
55+
sudo yum install -y kubelet-"${KUBERNETES_BINARIES_VERSION//v}" kubeadm-"${KUBERNETES_BINARIES_VERSION//v}" kubectl-"${KUBERNETES_BINARIES_VERSION//v}" cri-tools-"${CRICTL_BINARIES_VERSION//v}"
56+
fi
57+
58+
sudo yum install -y cri-o-"${CRIO_BINARIES_VERSION//v}"
2459

2560
sudo pip install kubernetes

jenkins/image_building/dib_elements/centos-node/pre-install.d/55-setup-repos

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ export CRIO_MINOR_VERSION=${CRIO_VERSION%.*}
88
sudo sed -i 's/enforcing/disabled/g' /etc/selinux/config /etc/selinux/config
99

1010
# migrate to the Kubernetes community-owned repositories
11-
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
11+
if [[ "${PRE_RELEASE:-}" != "true" ]]; then
12+
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
1213
[kubernetes]
1314
name=Kubernetes
14-
baseurl=https://pkgs.k8s.io/core:/stable:/$KUBERNETES_MINOR_VERSION/rpm/
15+
baseurl=https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/rpm/
1516
enabled=1
1617
gpgcheck=1
17-
gpgkey=https://pkgs.k8s.io/core:/stable:/$KUBERNETES_MINOR_VERSION/rpm/repodata/repomd.xml.key
18+
gpgkey=https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/rpm/repodata/repomd.xml.key
1819
EOF
20+
fi
1921

2022
cat <<EOF | tee /etc/yum.repos.d/cri-o.repo
2123
[cri-o]

jenkins/image_building/dib_elements/ubuntu-node/install.d/55-install

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,35 @@ KUBERNETES_DEB_VERSION="${KUBERNETES_VERSION//v}"-\*
2020
CRIO_DEB_VERSION="${CRIO_VERSION//v}"-\*
2121
CRICTL_DEB_VERSION="${CRICTL_VERSION//v}"-\*
2222

23-
sudo apt-get install -y kubelet="${KUBERNETES_DEB_VERSION}" kubeadm="${KUBERNETES_DEB_VERSION}" kubectl="${KUBERNETES_DEB_VERSION}" cri-o="${CRIO_DEB_VERSION}" cri-tools="${CRICTL_DEB_VERSION}"
24-
sudo apt-mark hold kubelet kubeadm kubectl cri-o cri-tools
23+
if [[ "${PRE_RELEASE:-}" == "true" ]]; then
24+
# See https://github.com/containernetworking/plugins/releases
25+
CNI_PLUGINS_VERSION="v1.7.1"
26+
27+
# Kubernetes release tooling
28+
# See https://github.com/kubernetes/release/releases
29+
RELEASE_VERSION="${RELEASE_VERSION:-v0.18.0}"
30+
31+
ARCH=$(dpkg --print-architecture)
32+
DEST="/opt/cni/bin"
33+
sudo mkdir -p "${DEST}"
34+
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "${DEST}" -xz
35+
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C /usr/local/bin -xz
36+
37+
sudo curl -L --remote-name-all "https://dl.k8s.io/release/${KUBERNETES_VERSION}/bin/linux/${ARCH}/{kubeadm,kubelet}"
38+
curl -LO "https://dl.k8s.io/release/${KUBERNETES_VERSION}/bin/linux/${ARCH}/kubectl"
39+
40+
sudo install kubeadm kubelet /usr/bin/
41+
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
42+
43+
curl -L --output 10-kubeadm.conf "https://github.com/kubernetes/release/raw/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf"
44+
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
45+
sudo mv 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
46+
curl -L --output kubelet.service "https://github.com/kubernetes/release/raw/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service"
47+
sudo mv kubelet.service /usr/lib/systemd/system/kubelet.service
48+
else
49+
sudo apt-get install -y kubelet="${KUBERNETES_DEB_VERSION}" kubeadm="${KUBERNETES_DEB_VERSION}" kubectl="${KUBERNETES_DEB_VERSION}" cri-tools="${CRICTL_DEB_VERSION}"
50+
sudo apt-mark hold kubelet kubeadm kubectl cri-tools
51+
fi
52+
53+
sudo apt-get install -y cri-o="${CRIO_DEB_VERSION}"
54+
sudo apt-mark hold cri-o

jenkins/image_building/dib_elements/ubuntu-node/pre-install.d/55-setup-repos

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ set -eux
55
export KUBERNETES_MINOR_VERSION=${KUBERNETES_VERSION%.*}
66
export CRIO_MINOR_VERSION=${CRIO_VERSION%.*}
77

8-
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/deb/Release.key" | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
9-
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
8+
if [[ "${PRE_RELEASE:-}" != "true" ]]; then
9+
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/deb/Release.key" | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
10+
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR_VERSION}/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
11+
fi
12+
1013
curl -fsSL "https://download.opensuse.org/repositories/isv:/cri-o:/stable:/${CRIO_MINOR_VERSION}/deb/Release.key" | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
1114
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/${CRIO_MINOR_VERSION}/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
1215

jenkins/jobs/image_building.pipeline

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pipeline {
7373
echo "Building ${IMAGE_OS} ${IMAGE_TYPE} image"
7474
script {
7575
sh """
76+
def AGENT_OS = "ubuntu"
7677
./jenkins/image_building/build-image.sh
7778
"""
7879
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
script {
2+
UPDATED_REPO = "https://github.com/${env.REPO_OWNER}/${env.REPO_NAME}.git"
3+
echo "Test triggered from ${UPDATED_REPO}"
4+
ci_git_url = "https://github.com/metal3-io/project-infra.git"
5+
6+
if ( "${env.REPO_OWNER}" == 'metal3-io' && "${env.REPO_NAME}" == 'project-infra' ) {
7+
ci_git_branch = (env.PULL_PULL_SHA) ?: 'main'
8+
ci_git_base = (env.PULL_BASE_REF) ?: 'main'
9+
// Fetch the base branch and the ci_git_branch when running on project-infra PR
10+
refspec = '+refs/heads/' + ci_git_base + ':refs/remotes/origin/' + ci_git_base + ' ' + ci_git_branch
11+
} else {
12+
ci_git_branch = 'main'
13+
refspec = '+refs/heads/*:refs/remotes/origin/*'
14+
}
15+
echo "Checkout ${ci_git_url} branch ${ci_git_branch}"
16+
}
17+
18+
pipeline {
19+
agent { label "metal3ci-8c16gb-${IMAGE_OS}" }
20+
environment {
21+
AGENT_OS = "${IMAGE_OS}"
22+
REPO_ORG = "${env.REPO_OWNER}"
23+
REPO_NAME = "${env.REPO_NAME}"
24+
UPDATED_REPO = "${UPDATED_REPO}"
25+
REPO_BRANCH = "${env.PULL_BASE_REF ?: capm3_release_branch}"
26+
UPDATED_BRANCH = "${env.PULL_PULL_SHA ?: capm3_release_branch}"
27+
BUILD_TAG = "${env.BUILD_TAG}"
28+
PR_ID = "${env.PULL_NUMBER ?: ''}"
29+
IMAGE_OS = "${IMAGE_OS}"
30+
PRE_RELEASE = "true" // Affects the way k8s is installed in node image building
31+
IMAGE_TYPE = "node"
32+
KUBERNETES_VERSION = "v1.34.0-beta.0"
33+
CRICTL_VERSION = "${CRICTL_VERSION}"
34+
CRIO_VERSION = "${CRIO_VERSION}"
35+
CAPM3RELEASEBRANCH = "${capm3_release_branch}"
36+
BMORELEASEBRANCH = "${bmo_release_branch}"
37+
CAPI_VERSION = "${CAPI_VERSION}"
38+
CAPM3_VERSION = "${CAPM3_VERSION}"
39+
GINKGO_FOCUS = "${GINKGO_FOCUS}"
40+
GINKGO_SKIP = "${GINKGO_SKIP}"
41+
NUM_NODES = "${NUM_NODES}"
42+
TARGET_NODE_MEMORY = "${TARGET_NODE_MEMORY}"
43+
}
44+
stages {
45+
stage("Checkout CI Repo") {
46+
options {
47+
timeout(time: 5, unit: 'MINUTES')
48+
}
49+
steps {
50+
checkout([
51+
$class: 'GitSCM',
52+
branches: [[name: ci_git_branch]],
53+
doGenerateSubmoduleConfigurations: false,
54+
extensions: [
55+
[$class: 'WipeWorkspace'],
56+
[$class: 'CleanCheckout'],
57+
[$class: 'CleanBeforeCheckout']
58+
],
59+
submoduleCfg: [],
60+
userRemoteConfigs: [[url: ci_git_url, refspec: refspec]]
61+
])
62+
}
63+
}
64+
stage("Build disk image") {
65+
options {
66+
timeout(time: 1, unit: 'HOURS')
67+
}
68+
steps {
69+
echo "Building ${IMAGE_OS} node image"
70+
script {
71+
sh """
72+
./jenkins/image_building/build-image.sh
73+
"""
74+
}
75+
}
76+
}
77+
stage("Run e2e tests") {
78+
options {
79+
timeout(time: 3, unit: 'HOURS')
80+
}
81+
steps {
82+
script {
83+
START_TIME = System.currentTimeMillis()
84+
85+
// Set image name and location as env variables
86+
// to use the local image in the testing
87+
def img_name = readFile("image_name.txt").trim()
88+
89+
env.IMAGE_NAME = "${img_name}.qcow2"
90+
env.IMAGE_LOCATION = env.WORKSPACE
91+
92+
echo "Set IMAGE_NAME to: ${env.IMAGE_NAME}"
93+
echo "Set IMAGE_LOCATION to: ${env.IMAGE_LOCATION}"
94+
}
95+
echo "Testing with the new ${IMAGE_OS} node image"
96+
withCredentials([string(credentialsId: 'metal3-clusterctl-github-token', variable: 'GITHUB_TOKEN')]) {
97+
ansiColor('xterm') {
98+
timestamps {
99+
sh './jenkins/scripts/dynamic_worker_workflow/e2e_tests.sh'
100+
}
101+
}
102+
}
103+
}
104+
post {
105+
always {
106+
script {
107+
END_TIME = System.currentTimeMillis()
108+
if ((((END_TIME - START_TIME) / 1000) - 10800) > 0) {
109+
echo 'Failed due to timeout'
110+
currentBuild.result = 'FAILURE'
111+
}
112+
timestamps {
113+
sh './jenkins/scripts/dynamic_worker_workflow/fetch_logs.sh'
114+
archiveArtifacts "logs-${env.BUILD_TAG}.tgz"
115+
}
116+
}
117+
}
118+
cleanup {
119+
script {
120+
timestamps {
121+
sh './jenkins/scripts/dynamic_worker_workflow/run_clean.sh'
122+
}
123+
}
124+
}
125+
}
126+
}
127+
}
128+
}

0 commit comments

Comments
 (0)