前言

在持续集成/持续交付(CI/CD)实践中,自动化部署是一个非常重要的环节。通过自动化部署,我们可以减少人工操作,提高效率,降低风险。本文将介绍如何使用Jenkins自动化更新Stable Diffusion服务。

准备工作

  1. 确保已经安装并配置好Jenkins。
  2. 在Jenkins中安装必要的插件,如AWS CLI、Docker等。
  3. 准备好Stable Diffusion服务的代码库,并将其添加到Jenkins中。

创建Jenkins任务

  1. 在Jenkins中创建一个新的任务,选择"构建一个自由风格的软件项目"。
  2. 配置任务的通用选项,如描述、JDK版本等。
  3. 添加构建步骤,选择"执行Shell"。
  4. 在Shell脚本中添加更新Stable Diffusion服务的命令,例如:
#!/bin/bash

# 设置环境变量
ENV=test
HOST=10.0.9.136
USER=${ENV}-sd-ai
VERSION=$(date +%Y%m%d%H%M%S)
DINGDING_TOKEN=81e0f99e387c24ccc1c008f1de939d500745be7667e62b4a53df3e5d582ae6ce
API_IMAGE=820700710667.dkr.ecr.us-east-1.amazonaws.com/ai/sdwebuieks:${ENV}
QUEU_IMAGE=820700710667.dkr.ecr.us-east-1.amazonaws.com/ai/queue_agenteks:${VERSION}

# 登录 ECR 并获取镜像
get_image(){
  local DEV_QUEUE_AGENT=$(cat /root/dev_queue_agenteks.txt)
  # 使用 AWS CLI 获取登录凭证并登录 ECR
  sudo /usr/local/bin/aws ecr get-login-password --region us-east-1 | sudo docker login --username AWS --password-stdin 820700710667.dkr.ecr.us-east-1.amazonaws.com
  # 拉取开发环境镜像、重新标记并推送到测试环境
  docker pull "${DEV_QUEUE_AGENT_IMAGE}"
  docker tag "${DEV_QUEUE_AGENT_IMAGE}" "${QUEU_IMAGE}"
  docker push "${QUEU_IMAGE}"
  # 更新镜像记录文件并清理本地镜像
  echo "${QUEU_IMAGE}" >/root/"${ENV}"_queue_agenteks.txt
  docker rmi -f "${DEV_QUEUE_AGENT_IMAGE}" "${QUEU_IMAGE}"
}

# 获取 BottleRocket 镜像快照 ID
get_snapshot_id(){
  local SNAPSHOT_LOG="/root/stable-diffusion-on-eks/utils/bottlerocket-images-cache/${ENV}-sd-log.txt"
  cd /root/stable-diffusion-on-eks/utils/bottlerocket-images-cache || return
  # 生成镜像快照并获取快照 ID
  ./snapshot.sh "${API_IMAGE},${QUEU_IMAGE}" | tee "${SNAPSHOT_LOG}"
  export SNAPSHOT_ID=$(grep -oEi 'snap-[a-z0-9]+' "${SNAPSHOT_LOG}" | tail -1)
}

# 更新 EKS 服务
update_service(){
  local NODETEMPLATES=("sd-01-sd-on-eks-nodetemplate-gpu" "sd-02-sd-on-eks-nodetemplate-gpu" "sd-03-sd-on-eks-nodetemplate-gpu")
  local DEPLOYMENTS=("sd-01-sd-on-eks-inference-api" "sd-02-sd-on-eks-inference-api" "sd-03-sd-on-eks-inference-api")
  # 更新 AWSNodeTemplate
  for nodetemplate in "${NODETEMPLATES[@]}"; do
      ssh "${USER}@${HOST}" "kubectl patch AWSNodeTemplate ${nodetemplate} --type='json' -p '[{\"op\":\"replace\", \"path\":\"/spec/blockDeviceMappings/1/ebs/snapshotID\", \"value\":\"${SNAPSHOT_ID}\"}]'"
  done
  # 更新 Deployment 镜像
  for deployment in "${DEPLOYMENTS[@]}"; do
    ssh "${USER}@${HOST}" "kubectl set image deployment/${deployment} inference-api=${API_IMAGE}"
    ssh "${USER}@${HOST}" "kubectl set image deployment/${deployment} queue-agent=${QUEU_IMAGE}"
  done

# 发送 DingDing 通知
send_dingding(){
  curl "https://oapi.dingtalk.com/robot/send?access_token=${DINGDING_TOKEN}" \
      -H 'Content-Type: application/json' \
      -d ' {"msgtype": "markdown","markdown": {"title":"Update '"${ENV}-sdoneks"' Success","text": "<font face='"'黑体'"' color='"'#00EC00'"'>Update '"${ENV}-sdoneks"' Success</font>\n"}}'
}

# 主函数
main() {
  get_image
  get_snapshot_id
  update_service
  send_dingding
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  1. 保存任务配置。

配置构建触发器

  1. 在任务配置页面,选择"配置"。
  2. 在"构建触发器"部分,选择适当的触发器,如定时构建、GitHub webhook等。
  3. 保存配置。

运行Jenkins任务

  1. 在Jenkins中手动触发任务构建,或等待触发器触发构建。
  2. 查看控制台输出,确保构建成功。
  3. 检查Stable Diffusion服务是否已成功更新。

总结

通过使用Jenkins自动化更新Stable Diffusion服务,我们可以减少人工操作,提高效率,降低风险。同时,也可以根据实际需求,对Jenkins任务进行定制和扩展,例如添加测试、通知等步骤。希望本文对您有所帮助。