-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathbuild-release-eks-snaps.groovy
165 lines (147 loc) · 6.38 KB
/
build-release-eks-snaps.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
@Library('juju-pipeline@master') _
def kube_version = params.k8s_tag
def kube_ersion = kube_version.substring(1)
def lxc_name = env.JOB_NAME+"-"+env.BUILD_NUMBER
def _find_eks_base(version, override){
if (override.length())
return override
// assumes the version looks like r'v\d.\d+.\d+'
def f_version = Float.parseFloat(version.substring(1, version.lastIndexOf('.')))
return f_version >= 1.99 ? "core22" : "core20";
}
def eks_base_override = params.eks_base_override
def EKS_BASE = _find_eks_base(kube_version, eks_base_override)
pipeline {
agent {
label "${params.build_node}"
}
/* XXX: Global $PATH setting doesn't translate properly in pipelines
https://stackoverflow.com/questions/43987005/jenkins-does-not-recognize-command-sh
*/
environment {
PATH = "${utils.cipaths}"
CK_SNAPS = "kubectl kubelet kubernetes-test kube-proxy"
EKS_SUFFIX = "-eks"
}
options {
ansiColor('xterm')
timestamps()
}
stages {
stage('Verify User') {
/* Do this early; we want to fail fast if we don't have valid creds. */
steps {
sh """
snapcraft login --with /var/lib/jenkins/.config/snapcraft/snapcraft-cpc.cfg
snapcraft whoami
snapcraft logout
"""
}
}
stage('Setup Source') {
steps {
sh """
CK_SNAP_BRANCH="${kube_version}"
CK_SNAP_REPO_PREFIX="https://git.launchpad.net/snap-"
for snap in ${CK_SNAPS}
do
CK_SNAP_REPO="\${CK_SNAP_REPO_PREFIX}\${snap}"
EKS_SNAP="\${snap}${EKS_SUFFIX}"
if git ls-remote --exit-code --heads \${CK_SNAP_REPO} \${CK_SNAP_BRANCH}
then
echo "Getting \${snap} from \${CK_SNAP_BRANCH} branch."
git clone \${CK_SNAP_REPO} --branch \${CK_SNAP_BRANCH} --depth 1 \${EKS_SNAP}
else
echo "ERROR: \${CK_SNAP_BRANCH} branch not found in the \${CK_SNAP_REPO} repo."
exit 1
fi
# eks snaps have a suffix and different base than ck; adjust snapcraft.yaml
cd \${EKS_SNAP}
sed -i -e "s/^name: \${snap}/name: \${EKS_SNAP}/" \
-e "s/^base: .*/base: ${EKS_BASE}/" \
-e "s/install-mode: .*/install-mode: disable/" snapcraft.yaml
# if we don't have any base defined at this point, add one
grep -q "^base: " snapcraft.yaml || echo "base: ${EKS_BASE}" >> snapcraft.yaml
echo "Prepared the following snapcraft.yaml:"
cat snapcraft.yaml
cd -
done
"""
}
}
stage('Setup Build Container'){
steps {
/* override sh for this step:
Needed because cilib.sh has some non POSIX bits.
*/
sh """#!/usr/bin/env bash
. \${WORKSPACE}/cilib.sh
ci_lxc_launch ubuntu:20.04 ${lxc_name}
until sudo lxc shell ${lxc_name} -- bash -c "snap install snapcraft --classic"; do
echo 'retrying snapcraft install in 3s...'
sleep 3
done
for snap in ${CK_SNAPS}
do
EKS_SNAP="\${snap}${EKS_SUFFIX}"
echo "Copying \${EKS_SNAP} into container."
sudo lxc file push \${EKS_SNAP} ${lxc_name}/ -p -r
done
# we'll upload from within the container; put creds in place
sudo lxc file push /var/lib/jenkins/.config/snapcraft/snapcraft-cpc.cfg ${lxc_name}/snapcraft-cpc.cfg
"""
}
}
stage('Build Snaps'){
steps {
sh """
for snap in ${CK_SNAPS}
do
EKS_SNAP="\${snap}${EKS_SUFFIX}"
echo "Building \${EKS_SNAP}."
# NB: kubelet snapcraft.yaml defines an alias, but
# aliases wont work in 'bash -c'. Define a func that
# is functionally equivalent to the alias. Single quote
# it because we need literal vars passed to 'bash -c'.
sudo lxc shell ${lxc_name} -- bash -c \
'set -a; add-arg() { \$SNAPCRAFT_PART_BUILD/shared/add-arg-to-configure-hook \$@; }; set +a; '"cd /\${EKS_SNAP};"' snapcraft --destructive-mode'
done
"""
}
}
stage('Upload Snaps'){
steps {
script {
if(params.dry_run) {
echo "Dry run; would have uploaded snaps to ${params.channels}"
} else {
sh """
BUILD_ARCH=\$(dpkg --print-architecture)
sudo lxc shell ${lxc_name} -- bash -c "snapcraft login --with /snapcraft-cpc.cfg"
for snap in ${CK_SNAPS}
do
EKS_SNAP="\${snap}${EKS_SUFFIX}"
BUILT_SNAP="\${EKS_SNAP}_${kube_ersion}_\${BUILD_ARCH}.snap"
echo "Uploading \${BUILT_SNAP}."
sudo lxc shell ${lxc_name} -- bash -c \
"snapcraft -v upload /\${EKS_SNAP}/\${BUILT_SNAP} --release ${params.channels}"
done
sudo lxc shell ${lxc_name} -- bash -c "snapcraft logout"
"""
}
}
}
}
}
post {
always {
/* override sh for this step:
Needed because cilib.sh has some non POSIX bits.
*/
sh """#!/usr/bin/env bash
. \${WORKSPACE}/cilib.sh
ci_lxc_delete ${lxc_name}
"""
}
}
}