| // 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() |
| } |