apache--tvm
203 行
6.4 KiB
Django/Jinja
203 行
6.4 KiB
Django/Jinja
// 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}-${hash}-${env.BUILD_NUMBER}".replace('/', '_')
|
|
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()
|
|
}
|