blob: 9d8bf2fb07cd9f2e42c893b92055955eb55edbca [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
{% include "utils/base.groovy.j2" with context %}
{% import 'utils/macros.j2' as m with context -%}
def ecr_push(full_name) {
aws_account_id = sh(
returnStdout: true,
script: 'aws sts get-caller-identity | grep Account | cut -f4 -d\\"',
label: 'Get AWS ID'
).trim()
def ecr_name = "${aws_account_id}.{{ aws_ecr_url }}/${full_name}"
try {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION={{ aws_default_region }}',
"AWS_ECR_REPO=${aws_account_id}.{{ aws_ecr_url }}"]) {
sh(
script: '''
set -eux
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPO
''',
label: 'Log in to ECR'
)
sh(
script: """
set -x
. ${jenkins_scripts_root}/retry.sh
docker tag ${full_name} \$AWS_ECR_REPO/${full_name}
retry 5 docker push \$AWS_ECR_REPO/${full_name}
""",
label: 'Upload image to ECR'
)
}
} finally {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION={{ aws_default_region }}',
"AWS_ECR_REPO=${aws_account_id}.{{ aws_ecr_url }}"]) {
sh(
script: 'docker logout $AWS_ECR_REPO',
label: 'Clean up login credentials'
)
}
}
return ecr_name
}
def build_image(image_name) {
hash = sh(
returnStdout: true,
script: 'git log -1 --format=\'%h\''
).trim()
def full_name = "${image_name}:${env.BRANCH_NAME.replace('/', '-')}-${hash}-${env.BUILD_NUMBER}"
sh(
script: "${docker_build} ${image_name} --spec ${full_name}",
label: 'Build docker image'
)
return ecr_push(full_name)
}
def update_docker(ecr_image, hub_image) {
if (ecr_image == null) {
sh("image was not rebuilt, skipping")
return
}
if (!ecr_image.contains("amazonaws.com")) {
sh("echo \"Skipping '${ecr_image}' -> '${hub_image}' since it doesn\'t look like an ECR image\"")
return
}
docker_init(ecr_image)
sh(
script: """
set -eux
. ${jenkins_scripts_root}/retry.sh
docker tag \
${ecr_image} \
${hub_image}
retry 5 docker push ${hub_image}
""",
label: "Update ${hub_image} on Docker Hub",
)
}
def deploy() {
stage('Deploy') {
if (env.BRANCH_NAME == 'main') {
parallel(
{% call m.deploy_step(
name="Upload built Docker images",
feature_flag="env.DEPLOY_DOCKER_IMAGES == 'yes' && rebuild_docker_images && upstream_revision != null",
ws="tvm/deploy-docker",
) %}
init_git()
try {
withCredentials([string(
credentialsId: 'dockerhub-tlcpackstaging-key',
variable: 'DOCKERHUB_KEY',
)]) {
sh(
script: 'docker login -u tlcpackstaging -p ${DOCKERHUB_KEY}',
label: 'Log in to Docker Hub',
)
}
def date_Ymd_HMS = sh(
script: 'python3 -c \'import datetime; print(datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))\'',
label: 'Determine date',
returnStdout: true,
).trim()
def tag = "${date_Ymd_HMS}-${upstream_revision.substring(0, 8)}"
{% for image in images %}
update_docker(built_{{ image.name }}, "tlcpackstaging/{{ image.name }}:${tag}")
{% endfor %}
} finally {
sh(
script: 'docker logout',
label: 'Clean up login credentials'
)
}
{% endcall %}
{% call m.deploy_step(
name="Tag tlcpackstaging to tlcpack",
feature_flag="env.DEPLOY_DOCKER_IMAGES == 'yes'",
ws="tvm/tag-images",
) %}
init_git()
withCredentials([string(
credentialsId: 'dockerhub-tlcpack-key',
variable: 'TLCPACK_TOKEN',
)]) {
try {
sh(
script: 'echo $TLCPACK_TOKEN | docker login --username octomldriazati --password-stdin',
label: 'Log in to Docker Hub'
)
{% for image in images %}
if ({{ image.name }}.contains("tlcpackstaging")) {
// Push image to tlcpack
def tag = {{ image.name }}.split(":")[1]
sh(
script: """
set -eux
. ${jenkins_scripts_root}/retry.sh
docker pull tlcpackstaging/{{ image.name }}:${tag}
docker tag tlcpackstaging/{{ image.name }}:${tag} tlcpack/{{ image.name.replace("_", "-") }}:${tag}
retry 5 docker push tlcpack/{{ image.name.replace("_", "-") }}:${tag}
""",
label: 'Tag tlcpackstaging/{{ image.name }} image to tlcpack',
)
}
{% endfor %}
} finally {
sh(
script: 'docker logout',
label: 'Clean up login credentials'
)
}
}
{% endcall %}
)
}
}
}
if (rebuild_docker_images) {
stage('Docker Image Build') {
parallel(
{% for image in images %}
'{{ image.name }}': {
node('{{ image.platform }}') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// {{ image.name }} = build_image('{{ image.name }}')
built_{{ image.name }} = build_image('{{ image.name }}');
}
}
},
{% endfor %}
)
}
deploy()
}