summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2018-03-22 13:10:35 +0100
committerJoffrey F <joffrey@docker.com>2018-03-22 13:50:24 +0100
commita030b3ac8879671fb6e43999bc9c30898567af95 (patch)
tree5ce11602dbc17625d333eda83976d3c17b8d6c5e
parent7a28cad58ec7c279b91c75a3aa701bb89e0e75cd (diff)
downloaddocker-py-dynamic_test_versions.tar.gz
Generate test engines list dynamicallydynamic_test_versions
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r--Jenkinsfile29
-rw-r--r--scripts/versions.py71
2 files changed, 92 insertions, 8 deletions
diff --git a/Jenkinsfile b/Jenkinsfile
index 1323f4b..211159b 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -5,13 +5,6 @@ def imageNamePy2
def imageNamePy3
def images = [:]
-def dockerVersions = [
- "17.06.2-ce", // Latest EE
- "17.12.1-ce", // Latest CE stable
- "18.02.0-ce", // Latest CE edge
- "18.03.0-ce-rc4" // Latest CE RC
-]
-
def buildImage = { name, buildargs, pyTag ->
img = docker.image(name)
try {
@@ -37,9 +30,27 @@ def buildImages = { ->
}
}
+def getDockerVersions = { ->
+ def dockerVersions = ["17.06.2-ce"]
+ wrappedNode(label: "ubuntu && !zfs") {
+ def result = sh(script: """docker run --rm \\
+ --entrypoint=python \\
+ ${imageNamePy3} \\
+ /src/scripts/versions.py
+ """, returnStdout: true
+ )
+ dockerVersions = dockerVersions + result.trim().tokenize(' ')
+ }
+ return dockerVersions
+}
+
def getAPIVersion = { engineVersion ->
def versionMap = ['17.06': '1.30', '17.12': '1.35', '18.02': '1.36', '18.03': '1.37']
- return versionMap[engineVersion.substring(0, 5)]
+ def result = versionMap[engineVersion.substring(0, 5)]
+ if (!result) {
+ return '1.37'
+ }
+ return result
}
def runTests = { Map settings ->
@@ -94,6 +105,8 @@ def runTests = { Map settings ->
buildImages()
+def dockerVersions = getDockerVersions()
+
def testMatrix = [failFast: false]
for (imgKey in new ArrayList(images.keySet())) {
diff --git a/scripts/versions.py b/scripts/versions.py
new file mode 100644
index 0000000..77aaf4f
--- /dev/null
+++ b/scripts/versions.py
@@ -0,0 +1,71 @@
+import operator
+import re
+from collections import namedtuple
+
+import requests
+
+base_url = 'https://download.docker.com/linux/static/{0}/x86_64/'
+categories = [
+ 'edge',
+ 'stable',
+ 'test'
+]
+
+
+class Version(namedtuple('_Version', 'major minor patch rc edition')):
+
+ @classmethod
+ def parse(cls, version):
+ edition = None
+ version = version.lstrip('v')
+ version, _, rc = version.partition('-')
+ if rc:
+ if 'rc' not in rc:
+ edition = rc
+ rc = None
+ elif '-' in rc:
+ edition, rc = rc.split('-')
+
+ major, minor, patch = version.split('.', 3)
+ return cls(major, minor, patch, rc, edition)
+
+ @property
+ def major_minor(self):
+ return self.major, self.minor
+
+ @property
+ def order(self):
+ """Return a representation that allows this object to be sorted
+ correctly with the default comparator.
+ """
+ # rc releases should appear before official releases
+ rc = (0, self.rc) if self.rc else (1, )
+ return (int(self.major), int(self.minor), int(self.patch)) + rc
+
+ def __str__(self):
+ rc = '-{}'.format(self.rc) if self.rc else ''
+ edition = '-{}'.format(self.edition) if self.edition else ''
+ return '.'.join(map(str, self[:3])) + edition + rc
+
+
+def main():
+ results = set()
+ for url in [base_url.format(cat) for cat in categories]:
+ res = requests.get(url)
+ content = res.text
+ versions = [
+ Version.parse(
+ v.strip('"').lstrip('docker-').rstrip('.tgz').rstrip('-x86_64')
+ ) for v in re.findall(
+ r'"docker-[0-9]+\.[0-9]+\.[0-9]+-.*tgz"', content
+ )
+ ]
+ sorted_versions = sorted(
+ versions, reverse=True, key=operator.attrgetter('order')
+ )
+ latest = sorted_versions[0]
+ results.add(str(latest))
+ print(' '.join(results))
+
+if __name__ == '__main__':
+ main()