168 lines
4.6 KiB
Groovy
168 lines
4.6 KiB
Groovy
/*
|
|
* Copyright (c) 2016-present Sonatype, Inc. All rights reserved.
|
|
* Includes the third-party code listed at http://links.sonatype.com/products/nxrm/attributions.
|
|
* "Sonatype" is a trademark of Sonatype, Inc.
|
|
*/
|
|
interface BaseImageReference
|
|
{
|
|
String getReference()
|
|
|
|
String getReference(String registryName)
|
|
}
|
|
|
|
class DefaultBaseImageReference
|
|
implements BaseImageReference
|
|
{
|
|
private String baseImage
|
|
|
|
private DockerImageHelper dockerImageHelper
|
|
|
|
DefaultBaseImageReference(String baseImage, DockerImageHelper dockerImageHelper) {
|
|
this.baseImage = baseImage
|
|
this.dockerImageHelper = dockerImageHelper
|
|
}
|
|
|
|
String getReference(String registryName = null) {
|
|
def imageDigest = dockerImageHelper.getImageFirstRepoDigest(baseImage)
|
|
if (imageDigest == null) {
|
|
return baseImage
|
|
}
|
|
return imageDigest
|
|
}
|
|
}
|
|
|
|
class RedHatBaseImageReference
|
|
implements BaseImageReference
|
|
{
|
|
final static RED_HAT_REGISTRY = "registry.access.redhat.com"
|
|
|
|
private String baseImage
|
|
|
|
private DockerImageHelper dockerImageHelper
|
|
|
|
private steps
|
|
|
|
RedHatBaseImageReference(String baseImage, DockerImageHelper dockerImageHelper, steps) {
|
|
this.baseImage = baseImage
|
|
this.dockerImageHelper = dockerImageHelper
|
|
this.steps = steps
|
|
}
|
|
|
|
String getReference(String registryName = RED_HAT_REGISTRY) {
|
|
def repoName = extractRedHatRepoName(baseImage, registryName)
|
|
def dockerImageId = dockerImageHelper.getImageId(baseImage)
|
|
if (repoName == null || dockerImageId == null) {
|
|
return null
|
|
}
|
|
|
|
def imageId = getRedHatImageId(dockerImageId)
|
|
def repoId = getRedHatRepoId(repoName, registryName)
|
|
if (imageId == null || repoId == null) {
|
|
def imageDigest = dockerImageHelper.getImageFirstRepoDigest(baseImage)
|
|
return imageDigest
|
|
}
|
|
|
|
def imageArch = dockerImageHelper.getImageArchitecture(baseImage)
|
|
if (imageArch != null) {
|
|
return "https://catalog.redhat.com/software/containers/${repoName}/${repoId}?architecture=${imageArch}&image=${imageId}"
|
|
}
|
|
else {
|
|
return "https://catalog.redhat.com/software/containers/${repoName}/${repoId}?image=${imageId}"
|
|
}
|
|
}
|
|
|
|
private static extractRedHatRepoName(baseImage, registryName) {
|
|
if (!baseImage.contains(registryName)) {
|
|
return null
|
|
}
|
|
def repositoryRegex = "${registryName}\\/(.*)"
|
|
def repository = (baseImage =~ repositoryRegex)[0][1]
|
|
return repository
|
|
}
|
|
|
|
private getRedHatImageId(dockerImageId) {
|
|
def imageSearchUrl =
|
|
"https://catalog.redhat.com/api/containers/v1/images?filter=docker_image_id==\"${dockerImageId}\""
|
|
def imageId = steps.sh(
|
|
script: "curl -s -L ${imageSearchUrl} | jq -r '.data[0]._id' ",
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
return imageId == "null" ? null : imageId
|
|
}
|
|
|
|
private getRedHatRepoId(repoName, registryName) {
|
|
def repoSearchUrl =
|
|
"https://catalog.redhat.com/api/containers/v1/repositories/registry/${registryName}/repository/${repoName}"
|
|
def repoId = steps.sh(
|
|
script: "curl -s -L ${repoSearchUrl} | jq -r '._id' ",
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
return repoId == "null" ? null : repoId
|
|
}
|
|
}
|
|
|
|
class DockerImageHelper
|
|
{
|
|
private steps
|
|
|
|
DockerImageHelper(steps) {
|
|
this.steps = steps
|
|
}
|
|
|
|
def getImageId(baseImage) {
|
|
pullImage(baseImage)
|
|
def dockerImageId = steps.sh(
|
|
script: "docker image inspect ${baseImage} | jq -r '.[0].Id' ",
|
|
returnStdout: true
|
|
).trim()
|
|
return dockerImageId == "null" ? null : dockerImageId
|
|
}
|
|
|
|
def getImageArchitecture(baseImage) {
|
|
pullImage(baseImage)
|
|
def imageArch = steps.sh(
|
|
script: "docker image inspect ${baseImage} | jq -r '.[0].Architecture' ",
|
|
returnStdout: true
|
|
).trim()
|
|
return imageArch == "null" ? null : imageArch
|
|
}
|
|
|
|
def getImageFirstRepoDigest(baseImage) {
|
|
pullImage(baseImage)
|
|
def imageDigest = steps.sh(
|
|
script: "docker image inspect ${baseImage} | jq -r '.[0].RepoDigests[0]'",
|
|
returnStdout: true
|
|
).trim()
|
|
return imageDigest == "null" ? null : imageDigest
|
|
}
|
|
|
|
private def pullImage(baseImage) {
|
|
if (!isPulled(baseImage)) {
|
|
steps.sh("docker pull ${baseImage}")
|
|
}
|
|
}
|
|
|
|
private def isPulled(baseImage) {
|
|
def status = steps.sh(
|
|
script: "docker image inspect ${baseImage} 1> /dev/null",
|
|
returnStatus: true
|
|
)
|
|
return status == 0
|
|
}
|
|
}
|
|
|
|
static BaseImageReference build(steps, String baseImage) {
|
|
def dockerHelper = new DockerImageHelper(steps)
|
|
|
|
if (baseImage.contains(RedHatBaseImageReference.RED_HAT_REGISTRY)) {
|
|
return new RedHatBaseImageReference(baseImage, dockerHelper, steps)
|
|
}
|
|
else {
|
|
return new DefaultBaseImageReference(baseImage, dockerHelper)
|
|
}
|
|
}
|
|
|
|
return this
|