Jenkins 构建前端服务更新控制

在当今的快节奏开发环境中,确保前端服务的高效和可靠更新至关重要。本文将介绍如何通过AWS服务(如ECS和S3)以及Jenkins进行参数化构建,实现前端服务的自动化部署和更新控制。我们将深入了解使用Python脚本管理部署流程,以及如何在Jenkins中配置参数化构建,使得服务的部署更加灵活和可配置。

部署脚本

Python脚本管理部署流程

首先,让我们来看一下负责编排部署流程的Python脚本。该脚本使用Boto3库与AWS服务进行交互,并利用Requests库发起HTTP请求。以下是关键功能的概述:

#!/usr/bin/python3
import os
import requests
import boto3
import jsondef get_secret(secret_name, region_name):"""Retrieves the specified secret from AWS Secrets Manager.Args:secret_name (str): The name of the secret.region_name (str): The AWS region where the secret is stored.Returns:dict: The decoded JSON representation of the secret."""session = boto3.session.Session()client = session.client(service_name='secretsmanager', region_name=region_name)get_secret_value_response = client.get_secret_value(SecretId=secret_name)return json.loads(get_secret_value_response['SecretString'])def send_dingding(service_name, token):"""Sends a message to DingTalk notifying the successful restart of a service.Args:service_name (str): Name of the service being restarted.token (str): DingTalk access token."""headers = {'Content-Type': 'application/json'}message = f"<font face='黑体' color='#00EC00'>Restart {service_name} Success</font>\n"data = {"msgtype": "markdown", "markdown": {"title": f"Restart {service_name} Success", "text": message}}response = requests.post(f"https://oapi.dingtalk.com/robot/send?access_token={token}", headers=headers, json=data)print(response.text)def update_ecs_service(service_name, cluster_name='frontend-pro'):"""Updates the ECS service with a new deployment.Args:service_name (str): Name of the ECS service.cluster_name (str): Name of the ECS cluster."""boto3.client('ecs').update_service(cluster=cluster_name, service=service_name, taskDefinition=service_name,forceNewDeployment=True)print("****************************更新容器************************************")def upload_to_s3(service_name):"""Uploads code to S3 bucket.Args:service_name (str): Name of the service."""s3_client = boto3.client('s3')print("****************************上传代码************************************")s3_client.sync(f"s3://deploy-github-fe/{service_name}/", f"s3://govee-static/prod/{service_name}/",acl='public-read')def clear_url_cache():"""Clears the URL cache by sending an HTTP POST request."""response = requests.post("https://apph5-api.my.com/h5/v1/commom/cache/reset")print(response.text)def deploy_services(service_names):"""Deploys services based on their names.Args:service_names (list): List of service names to be deployed."""for service_name in service_names:if service_name == "pro-trade-fe":upload_to_s3(service_name)update_ecs_service(service_name)send_dingding(service_name, os.environ['DINGDING_TOKEN'])elif service_name in ["pro-auth-fe", "prod-h5-game-fe"]:upload_to_s3(service_name)clear_url_cache()send_dingding(service_name, os.environ['DINGDING_TOKEN'])elif service_name == "prod-life-web-fe":update_ecs_service(service_name)send_dingding(service_name, os.environ['DINGDING_TOKEN'])elif service_name in ["prod-app-h5-fe", "prod-app-hd-fe"]:upload_to_s3(service_name)update_ecs_service(service_name)clear_url_cache()send_dingding(service_name, os.environ['DINGDING_TOKEN'])elif service_name == "prod-minger-os-web-fe":update_ecs_service(service_name)send_dingding(service_name, os.environ['DINGDING_TOKEN'])else:upload_to_s3(service_name)update_ecs_service(service_name)clear_url_cache()send_dingding(service_name, os.environ['DINGDING_TOKEN'])if __name__ == "__main__":# Get DingDing token from AWS Secrets Managersecrets = get_secret('base', 'us-east-1')token = secrets.get('BUILD1_TOKEN', '')  # Retrieve the token, default to empty string if not found# Get service names from environment variableservice_names = os.environ['SERVICE_NAMES'].split(',')# Execute deploymentdeploy_services(service_names)

关键功能解析

  • ​get_secret​​:从AWS Secrets Manager检索指定的秘密。
  • ​send_dingding​​:向DingTalk发送有关服务重新启动的消息。
  • ​update_ecs_service​​:使用新的部署更新ECS服务。
  • ​upload_to_s3​​:将代码上传到S3桶。
  • ​clear_url_cache​​:通过发送HTTP POST请求清除URL缓存。
  • ​deploy_services​​:部署服务的主要函数。

Shell脚本管理部署流程

#!/bin/bash# Function to get secret from AWS Secrets Manager
get_secret() {secret_name=$1region_name=$2aws secretsmanager get-secret-value --secret-id $secret_name --region $region_name --query 'SecretString' --output text
}# Function to send DingTalk message
send_dingding() {service_name=$1token=$2message="<font face='黑体' color='#00EC00'>Restart $service_name Success</font>"curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=$token" -H "Content-Type: application/json" \-d "{\"msgtype\": \"markdown\", \"markdown\": {\"title\": \"Restart $service_name Success\", \"text\": \"$message\"}}"
}# Function to update ECS service
update_ecs_service() {service_name=$1cluster_name='frontend-pro'aws ecs update-service --cluster $cluster_name --service $service_name --task-definition $service_name --force-new-deploymentecho "****************************更新容器************************************"
}# Function to upload to S3
upload_to_s3() {service_name=$1aws s3 sync "s3://deploy-github-fe/$service_name/" "s3://govee-static/prod/$service_name/" --acl public-readecho "****************************上传代码************************************"
}# Function to clear URL cache
clear_url_cache() {curl -s -X POST "https://apph5-api.my.com/h5/v1/commom/cache/reset"echo "****************************清理URL缓存************************************"
}# Function to deploy services
deploy_services() {service_names=$@for service_name in $service_names; docase $service_name in"pro-trade-fe")upload_to_s3 $service_nameupdate_ecs_service $service_namesend_dingding $service_name $DINGDING_TOKEN;;"pro-auth-fe"|"prod-h5-game-fe")upload_to_s3 $service_nameclear_url_cachesend_dingding $service_name $DINGDING_TOKEN;;"prod-life-web-fe")update_ecs_service $service_namesend_dingding $service_name $DINGDING_TOKEN;;"prod-app-h5-fe"|"prod-app-hd-fe")upload_to_s3 $service_nameupdate_ecs_service $service_nameclear_url_cachesend_dingding $service_name $DINGDING_TOKEN;;"prod-minger-os-web-fe")update_ecs_service $service_namesend_dingding $service_name $DINGDING_TOKEN;;*)upload_to_s3 $service_nameupdate_ecs_service $service_nameclear_url_cachesend_dingding $service_name $DINGDING_TOKEN;;esacdone
}# Main execution
secrets=$(get_secret 'base' 'us-east-1')
export DINGDING_TOKEN=$(echo $secrets | jq -r .BUILD1_TOKEN)# Get service names from environment variable
service_names=${SERVICE_NAMES//,/ }# Execute deployment
deploy_services $service_names

Jenkins中的参数化构建

为了使部署流程更加灵活和可配置,我们将该脚本集成到Jenkins中,并使用Extended Choice Parameter插件进行参数化构建。这使用户能够在Jenkins构建期间选择要部署的服务。

Jenkins配置

  • Extended Choice Parameter:
  • Name: SERVICE_NAMES
  • Parameter Type: Check Boxes
  • Number of Visible Items: 10
  • Delimiter:,
  • Quote Value: prod-app-hd-fe, prod-app-h5-fe, prod-govee-life-web-fe, prod-community-web-fe, prod-app-platform-fe, pro-trade-fe, pro-auth-fe, prod-h5-game-fe, pro-app-h5-fe, prod-promotion-app-h5-fe, prod-desktop-web-fe, prod-app-mall-fe, prod-minger-os-web-fe

结论

通过自动化部署流水线,我们不仅节省了时间,还减少了人为错误的风险。通过Python脚本和Jenkins的集成,只需几次点击即可轻松部署前端服务到AWS。根据您的特定用例进行定制,享受简化的部署流程。

在您的博文中,您可以进一步优化、整理和详细说明脚本的生产控制、开发最佳实践等方面的内容,以使读者更好地理解和应用这一自动化流程。祝愉快编写博文!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式系统(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

echarts条纹进度条

drawmonthqualified(){this.monthqualified echarts.init(document.getElementById(monthqualified));this.monthqualified.setOption({grid: {top: "15%",left:"20%",right:20%,bottom: "0%" //也可设置left和right设置距离来控制图表的大小},…

【致远OA】获取指定人员的协同待发列表

接口请求说明 V6.0接口更新:不在传入ticket&#xff0c;改为传memberId人员ID V6.0之前http请求方式&#xff1a;GET http://ip:port/seeyon/rest/affairs/draft 如 http://127.0.0.1/seeyon/rest/affairs/draft?ticketxxxxxx V6.0http请求方式&#xff1a;GET http://ip:p…

SpringBoot中WebSokcet无法注入Bean对象的解决方案

一、业务场景 Slf4j Component ServerEndpoint("/ws/{userId}") public class WebSocketServer {Autowiredprivate IChatService chatService;public static Map<Long, Session> sessionMap new ConcurrentHashMap<>();OnOpenpublic void onOpen(Sessi…

常见网络协议

1.DNS协议 &#xff08;域名系统&#xff09; DNS协议使用的端口号是53 位于OSI模型中的应用层 DNS系统的作用&#xff1a;将域名&#xff08;网址&#xff09;解析为IP地址。 DNS的基本原理是&#xff1a;将域名映射到IP地址 DNS工作流程 当用户给定一个域名&#xff0…

物联网技术如何影响我们的生活

随着科技的不断进步&#xff0c;物联网技术已经深刻地融入了我们的日常生活。物联网&#xff0c;即物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;&#xff0c;指的是通过互联网连接各种物理设备和对象&#xff0c;使它们能够进行数据交换和实时通信。这项技…

【十三】【动态规划】1745. 分割回文串 IV、132. 分割回文串 II、516. 最长回文子序列,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

移动端APP版本治理

1、背景 在许多公司&#xff0c;APP版本都是不受重视的&#xff0c;产品忙着借鉴&#xff0c;开发埋头编码&#xff0c;测试想着不粘锅。 只有在用户反馈app不能用的时候&#xff0c;你回复客服说&#xff0c;让用户升级最新版本&#xff0c;是不是很真实。 而且业界也很少有…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

开发环境 目录记录

2023.12.27 jdk17 位置在 C:\DevelopTools\JavaDevelopTools\jdk17,配置了JAVA_HOME到环境变量&#xff0c;JAVA_HOME\bin到PATHapache-maven-3.6.1 位置在 C:\DevelopTools\JavaDevelopTools\apache-maven-3.6.1,配置了MAVEN_HOME到环境变量&#xff0c;MAVEN_HOME\bin到PA…

周赛378(中心扩散法、分组循环)

文章目录 周赛378[2980. 检查按位或是否存在尾随零](https://leetcode.cn/problems/check-if-bitwise-or-has-trailing-zeros/)转换题意 [2981. 找出出现至少三次的最长特殊子字符串 I](https://leetcode.cn/problems/find-longest-special-substring-that-occurs-thrice-i/)中…

[情商-7]:如何回答没有标准答案的两难问题

目录 前言&#xff1a; 一、用“逻辑推理思维”回答两难问题 二、用“情绪思维”回答两难问题 1.1 关注提问者提出问题背后的情绪状态和情绪/情感诉求 1.2 常见的常见的情绪和情感诉求 1.3 女性情感分析 1.4 理解女性情感的语言 1.5 如何通过语言理解女性的情绪需求 三…

模拟Spring事件监听机制

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 之前我们一起学习了Spr…

Maven下载和安装的详细教程

文章目录 一、Maven下载和安装1.1 下载 Maven1.2 配置环境变量 参考资料 一、Maven下载和安装 1.1 下载 Maven 打开 Maven 的官方网站Maven – Download Apache Maven&#xff0c;下载最新版本的 Maven 在可选择的版本中&#xff0c;不同版本的区别在于: binary是已经编译过的…

从零开始了解大数据(七):总结

系列文章目录 从零开始了解大数据(一)&#xff1a;数据分析入门篇-CSDN博客 从零开始了解大数据(二)&#xff1a;Hadoop篇-CSDN博客 从零开始了解大数据(三)&#xff1a;HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四)&#xff1a;MapReduce篇-CSDN博客 从零开始了解大…

jdk9之后springboot项目访问外置jar包配置

启动命令增加 --add-opens java.base/jdk.internal.loaderALL-UNNAMED解释 --add-opens java.base/jdk.internal.loaderALL-UNNAMED 是 Java 9 引入的一个命令行选项&#xff0c;用于解决模块化系统&#xff08;Module System&#xff09;中的模块访问限制问题。 在 Java 9 中…

013、方法

1. 方法和函数的区别 方法与函数十分相似&#xff1a;它们都使用fn关键字及一个名称来进行声明&#xff1b;它们都可以拥有参数和返回值&#xff1b;另外&#xff0c;它们都包含了一段在调用时执行的代码。 但是&#xff0c;方法与函数依然是两个不同的概念&#xff0c;因为方法…

如何压缩图片?电脑图片压缩的方法

如果图片体积过大不仅会占用过多的内存&#xff0c;还容易在平时处理和上传的时候被限制&#xff0c;传输起来也比较慢&#xff0c;这个时候最简单的方法就是通过专业的图片处理工具压缩图片大小&#xff0c;现如今有许多在线处理工具可以选择&#xff0c;今天分享的压缩图就是…

模型融合之模型堆叠

一、理论 模型堆叠&#xff08;Model Stacking&#xff09;是一种集成学习的方法&#xff0c;其本质是将多个基学习器&#xff08;Individual Learner&#xff09;的预测结果作为新的特征&#xff0c;再训练一个元学习器&#xff08;Meta Learner&#xff09;来进行最终的预测。…

【JUC的四大同步辅助类】

文章目录 一、CountDownLatch二、CyclicBarrier三、Semaphore四、Phaser 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CountDownLatch CountDownLatch如同火箭发射&#xff0c;计数只能不断减减&#xff0c;当到达0时即发射 场景示例&#xff1…