Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

Commit

Permalink
Merge branch 'master' into feat.current_group_confirmation
Browse files Browse the repository at this point in the history
  • Loading branch information
liu-657667 committed Jan 17, 2024
2 parents aed700c + 08c0134 commit b4d326e
Show file tree
Hide file tree
Showing 445 changed files with 65,879 additions and 6,975 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,335 @@
name: Module Controller Integration Test Symmetric batch deploy
run-name: ${{ github.actor }} pushed module-controller code

on:
push:
branches:
- master
paths:
- 'module-controller/**'

pull_request:
branches:
- master
paths:
- 'module-controller/**'

# enable manually running the workflow
workflow_dispatch:

env:
CGO_ENABLED: 0
GOOS: linux
WORK_DIR: module-controller
TAG: ci-test-master-latest
DOCKERHUB_REGISTRY: serverless-registry.cn-shanghai.cr.aliyuncs.com
MODULE_CONTROLLER_IMAGE_PATH: opensource/test/module-controller
INTEGRATION_TESTS_IMAGE_PATH: opensource/test/module-controller-integration-tests
POD_NAMESPACE: default

defaults:
run:
working-directory: module-controller

jobs:
unit-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Docker login
uses: docker/[email protected]
with:
registry: ${{ env.DOCKERHUB_REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
logout: false

- name: Set up Docker buildx
uses: docker/setup-buildx-action@v2

- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ hashFiles('${{ env.WORK_DIR }}/*Dockerfile') }}

- name: Build and push module-controller Docker images
uses: docker/[email protected]
with:
context: ${{ env.WORK_DIR }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
file: ${{ env.WORK_DIR }}/Dockerfile
platforms: linux/amd64
push: true
tags: ${{ env.DOCKERHUB_REGISTRY }}/${{ env.MODULE_CONTROLLER_IMAGE_PATH }}:${{ env.TAG }}

- run: sleep 30

- name: Set up Minikube
run: |
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
- name: Start Minikube
run: minikube start

- name: Prepare development env
run: |
kubectl apply -f config/crd/bases/serverless.alipay.com_moduledeployments.yaml
kubectl apply -f config/crd/bases/serverless.alipay.com_modulereplicasets.yaml
kubectl apply -f config/crd/bases/serverless.alipay.com_modules.yaml
kubectl apply -f config/crd/bases/serverless.alipay.com_moduletemplates.yaml
kubectl apply -f config/rbac/role.yaml
kubectl apply -f config/rbac/role_binding.yaml
kubectl apply -f config/rbac/service_account.yaml
kubectl apply -f config/samples/ci/dynamic-stock-batch-deployment.yaml
kubectl apply -f config/samples/ci/module-deployment-controller.yaml
kubectl apply -f config/samples/ci/dynamic-stock-service.yaml
- run: sleep 60

- name: minikube logs
run: minikube logs

- name: get pod
run: |
kubectl get pod
- name: wait base pod available
run: |
kubectl wait --for=condition=available deployment/dynamic-stock-deployment --timeout=300s
- name: wait module controller pod available
run: |
kubectl wait --for=condition=available deployment/module-controller --timeout=300s
- name: apply moduledeployment symmetric batch release
run: |
kubectl apply -f config/samples/ci/module-deployment_v1alpha1_moduledeployment_symmetric_batch_deploy_provider.yaml
- name: get moduledeployment
run: |
kubectl get moduledeployment
- name: get modulereplicaset
run: |
kubectl get modulereplicaset
- run: sleep 15

- name: get module
run: |
kubectl get module -oyaml
- name: exist module
run: |
moduleCount=$(kubectl get module | wc -l)
if [[ $moduleCount -lt 1 ]]; then
echo "ERROR: 创建首批 module 资源失败"
exit 1
fi
- name: wait module available
run: |
# 定义要等待的资源名称和字段值
modulename=$(kubectl get module -o name)
desired_field_value="Available"
# 定义等待的超时时间(以秒为单位)
timeout_seconds=300
start_time=$(date +%s)
end_time=$((start_time + timeout_seconds))
while true; do
current_time=$(date +%s)
if [ $current_time -gt $end_time ]; then
echo "等待超时"
exit 1
fi
# 使用 kubectl get 命令获取资源对象的详细信息,并提取自定义字段的值
field_value=$(kubectl get $modulename -o custom-columns=STATUS:.status.status --no-headers)
if [ "$field_value" == "$desired_field_value" ]; then
echo "字段值已满足条件"
exit 0
else
echo "等待字段值满足条件..."
sleep 5 # 等待一段时间后再次检查
fi
done
- name: check moduledeployment pause
run: |
# 定义要等待的资源名称和字段值
moduledeploymentname=$(kubectl get moduledeployment -o name)
desired_field_value=true
# 定义等待的超时时间(以秒为单位)
timeout_seconds=300
start_time=$(date +%s)
end_time=$((start_time + timeout_seconds))
while true; do
current_time=$(date +%s)
if [ $current_time -gt $end_time ]; then
echo "等待超时"
exit 1
fi
# 使用 kubectl get 命令获取资源对象的详细信息,并提取自定义字段的值
field_value=$(kubectl get $moduledeploymentname -o custom-columns=PAUSE:.spec.pause --no-headers)
if [ "$field_value" == "$desired_field_value" ]; then
echo "字段值已满足条件,执行分组确认"
kubectl patch $moduledeploymentname -p '{"spec":{"pause":false}}' --type=merge
exit 0
else
echo "等待字段值满足条件..."
sleep 5 # 等待一段时间后再次检查
fi
done
- run: sleep 15

- name: get module
run: |
kubectl get module
- name: exist module more then 1
run: |
moduleCount=$(kubectl get module | wc -l)
if [[ $moduleCount -lt 2 ]]; then
echo "ERROR: 创建第二批 module 资源失败"
exit 1
fi
- name: check moduledeployment pause
run: |
# 定义要等待的资源名称和字段值
moduledeploymentname=$(kubectl get moduledeployment -o name)
desired_field_value=true
# 定义等待的超时时间(以秒为单位)
timeout_seconds=300
start_time=$(date +%s)
end_time=$((start_time + timeout_seconds))
while true; do
current_time=$(date +%s)
if [ $current_time -gt $end_time ]; then
echo "等待超时"
exit 1
fi
# 使用 kubectl get 命令获取资源对象的详细信息,并提取自定义字段的值
field_value=$(kubectl get $moduledeploymentname -o custom-columns=PAUSE:.spec.pause --no-headers)
if [ "$field_value" == "$desired_field_value" ]; then
echo "字段值已满足条件,执行分组确认"
kubectl patch $moduledeploymentname -p '{"spec":{"pause":false}}' --type=merge
exit 0
else
echo "等待字段值满足条件..."
sleep 5 # 等待一段时间后再次检查
fi
done
- name: get module
run: |
kubectl get module
- name: exist module more then 2
run: |
moduleCount=$(kubectl get module | wc -l)
if [[ $moduleCount -lt 3 ]]; then
echo "ERROR: 创建第三批 module 资源失败"
exit 1
fi
- name: wait module available
run: |
# 定义要等待的资源类型和期望的字段值
moduletype="module"
desired_field_value="Available"
# 定义等待的超时时间(以秒为单位)
timeout_seconds=300
start_time=$(date +%s)
end_time=$((start_time + timeout_seconds))
while true; do
current_time=$(date +%s)
if [ $current_time -gt $end_time ]; then
echo "等待超时"
exit 1
fi
# 获取所有的资源对象名,并循环处理
for modulename in $(kubectl get $moduletype -o name); do
# 使用 kubectl get 命令获取每个资源对象的详细信息,并提取自定义字段的值
field_value=$(kubectl get $modulename -o custom-columns=STATUS:.status.status --no-headers)
# 检查字段值是否满足期望
if [ "$field_value" != "$desired_field_value" ]; then
echo "等待字段值满足条件..."
sleep 5 # 等待一段时间后再次检查
continue 2 # 如果字段值未满足,则跳出循环,进入下一轮等待
fi
done
# 如果所有资源对象的字段值都满足期望,则结束脚本
echo "字段值已满足条件"
exit 0
done
- name: batch release successfully then check module install
run: |
label_selector="app=dynamic-stock"
max_attempts=10
timeout=300
interval=30
for ((i=0; i<$max_attempts; i++)); do
# 获取满足标签选择器条件的所有Pod
podnames=($(kubectl get pods -l $label_selector -o jsonpath='{.items[*].metadata.name}'))
# 初始化一个变量,用于检测是否所有Pod都满足条件
all_pods_condition_met=true
# 遍历所有Pod进行日志检索
for podname in "${podnames[@]}"; do
log_entry=$(kubectl exec -it $podname -- sh -c 'grep "Install Biz: provider:1.0.2 success" ~/logs/sofa-ark/*.log || true' 2>/dev/null)
# 如果没有找到日志条目,则将标志设置为false
if [ -z "$log_entry" ]; then
all_pods_condition_met=false
break
fi
done
# 如果所有Pod都满足条件,则退出循环
if $all_pods_condition_met; then
echo "所有Pod都满足条件。"
break
fi
# 如果这不是最后一次尝试,则等待一段时间后继续
if [ $i -lt $((max_attempts-1)) ]; then
echo "有些Pod未满足条件。等待 $interval 秒后进行下一次尝试。"
sleep $interval
else
# 如果是最后一次尝试,则输出超时消息
echo "已达到最大尝试次数。有些Pod未满足条件。"
fi
done
- name: delete deployment
run: |
kubectl delete -n default deployment dynamic-stock-deployment
22 changes: 2 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,28 +71,10 @@ SOFAServerless 技术体系是蚂蚁集团随着业务发展、研发运维的

## SOFAServerless 开源组件

| 系统/组件 | 职责描述 |
| ---- | ---- |
| <b>sofa-ark</b> | 原来的 sofa-ark 2.0 Java 合并部署与热部署框架。 |
| <b>arkctl</b> | 研发运维本地工具集,帮助开发者轻松拆分合并模块、开发测试、部署调试、瘦身模块等等。 |
| <b>arklet</b> | 一个客户端框架,对接 SOFAArk 实现 Biz 模块的热部署和热卸载,并且暴露 HTTP API 接口可以让上游系统或者开发者直接使用。 |
| <b>nodejslet</b> | 一个客户端框架,对接 NodeJS 原生 API 实现 NodeJS 模块的热替换,并且暴露 HTTP API 接口可以让上游系统或者开发者直接使用。 |
| <b>module-controller</b> | 模块运维、调度、弹性伸缩系统,清晰的定义 ModuleDeployment 相关模型和 API,并且既支持 K8S CR + ETCD 调和的实现方式又支持标准 HTTP/RPC + DB 的实现方式。底层对接编排模块热替换的客户端(arklet、nodejslet 等)。最终实现模块秒级发布运维能力,让开发者享受 Serverless 发布运维体验。 |
![image](https://github.com/sofastack/sofa-serverless/assets/101314559/995f1e17-f3be-4672-b1b8-c0c041590fb0)

<br/>

## SOFAServerless 开源版大体里程碑

SOFAServerless 开源版非常希望并且欢迎与社区同学一起共建,凡是 23 年下半年参与社区共建的同学我们都会颁发奖品。2023 年下半年初步的里程碑计划如下:

- <b>2023.8:</b>整体 0.1 版本发布
- <b>2023.8:</b>完成 SOFABoot 完整的部署功能验证,产出 benchmark 基线
- <b>2023.9:</b>发布基础运维和调度系统 ModuleController 0.5 版
- <b>2023.9:</b>发布研发运维工具 Arkctl 与 Arklet 0.5 版
- <b>2023.10:</b>发布模块半自动拆分工具 0.5 版
- <b>2023.10:</b>编写基础使用教程,新增 2+ SOFABoot 技术栈公司使用
- <b>2023.11:</b>支持 SpringBoot 完整能力和 5+ 社区常用中间件
- <b>2023.11:</b>SOFAServerless (ModuleController、Arkctl、Arklet、SpringBoot 兼容) 1.0 版本正式发布
- <b>2023.12:</b>基础自动弹性伸缩能力发布

更具体的里程碑细节随开源项目推进及时更新。
https://github.com/sofastack/sofa-serverless/releases
Loading

0 comments on commit b4d326e

Please sign in to comment.