引言
在云原生应用开发中,AWS Fargate 是一种无服务器容器编排服务,能够简化容器的部署和管理。结合 Jenkins,我们可以实现对 AWS Fargate 服务的自动构建和更新控制。本文将介绍如何通过 Python 脚本实现 Fargate 服务的自动构建和部署,并通过 DingDing 机器人发送通知。
Jenkins 构建 AWS Fargate 服务的意义与目的
AWS Fargate 提供了一种简化容器部署的方式,但仍需要处理构建和部署的复杂性。通过使用 Jenkins,我们可以实现以下目标:
- 自动化构建: 使用 Jenkins Pipeline 自动构建 Docker 镜像,并推送到 Amazon Elastic Container Registry (ECR)。
- 参数化控制: 使用 Jenkins Extended Choice Parameter 插件,通过参数化控制构建和更新的 Fargate 服务。
- 集成 AWS 服务: 使用 Boto3 SDK 集成 Jenkins 与 AWS 服务,包括 ECS(Elastic Container Service)。
- 实时通知: 使用 DingDing 机器人,实现 Fargate 服务部署成功后的实时通知。
Jenkins 构建 AWS Fargate 服务的实现代码详解
Python 更新服务脚本
#!/usr/bin/python3
import boto3
import os
import requests
import json
def get_secret(secret_name, region_name):
"""
从AWS Secrets Manager获取指定的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_message(service_name, token):
"""
向DingDing发送一条消息,通知服务重启成功。
"""
headers = {'Content-Type': 'application/json'}
data = {
"msgtype": "markdown",
"markdown": {
"title": f"Restart {service_name} Success",
"text": f"<font face='黑体' color='#00EC00'>Restart {service_name} Success</font>\n"
}
}
response = requests.post(f"https://oapi.dingtalk.com/robot/send?access_token={token}", headers=headers, data=json.dumps(data))
print(response.text)
def restart_services(cluster_name, service_names, task_definition, token):
"""
重启指定的ECS服务,并向DingDing发送通知。
"""
client = boto3.client('ecs')
for service_name in service_names:
client.update_service(
cluster=cluster_name,
service=service_name,
taskDefinition=task_definition,
forceNewDeployment=True
)
send_dingding_message(service_name, token)
def get_task_definition(cluster_name, service_name):
"""
获取指定服务的任务定义。
"""
client = boto3.client('ecs')
response = client.describe_services(
cluster=cluster_name,
services=[service_name]
)
return response['services'][0]['taskDefinition']
def get_task_name(task_definition):
"""
从任务定义的ARN中获取任务名称。
"""
return task_definition.split('/')[-1].split(':')[0]
# 从环境变量获取集群名称和服务名称列表
cluster_name = 'pro'
service_names = os.environ['SERVICE_NAMES'].split(',')
service_name = service_names[0] # 获取第一个服务名称以获取任务定义
task_definition = get_task_definition(cluster_name, service_name)
task_name = get_task_name(task_definition)
# 从Secrets Manager获取DingDing token
secrets = get_secret('base', 'us-east-1')
token = secrets['BUILD1_TOKEN']
restart_services(cluster_name, service_names, task_name, token)
使用 Extended Choice Parameter 进行参数化构建
在 Jenkins Job 的配置中,使用 Extended Choice Parameter 插件,定义了一个名为 SERVICE_NAMES
的参数,其值为要构建和更新的 Fargate 服务的名称列表。
Extended Choice Parameter:
- Name: SERVICE_NAMES
- Type: Single Select
- Choices: pro-os-trade,pro-gin-action-be,pro-appmetrics
总结
通过 Jenkins 构建 AWS Fargate 服务的自动化流程,我们实现了对 Fargate 服务更新控制的一体化解决方案。使用参数化构建,我们可以轻松选择并部署特定的 Fargate 服务,同时通过 DingDing 机器人实时通知,提高了构建过程的可视化和沟通效果。这种自动化流程不仅减轻了开发人员的负担,还提高了整个团队的工作效率。
标签:task,Fargate,service,AWS,Jenkins,name From: https://blog.51cto.com/jiemei/8843466