当前位置: 首页 > news >正文

Cypress自动化Github workflow

目录

Workflow

.github/workflows/build.yaml

jobs

build-deploy:

.github/wrokflows/execute-tests.yaml

输入参数

jobs

restart_failed_dp:

seed_data:

execute-tests:

Docker File

docker/Dockerfile.base

docker/service-dockerfile.base

Deploy

deploy/test-execute


Workflow

.github/workflows/build.yaml

创建docker image并推送到Amazon ECR

jobs

build-deploy:
runs-on: self-hostedsteps:- name: "Checkout source code"uses: actions/checkout@v2- name: "Prepare environment"id: preprun: |# Source our global environment variables & add them to GITHUB_ENV for subsequent stepssource .github/global.envcat .github/global.env >> ${GITHUB_ENV}# Configure our environment based on the branch, or if this is a PR buildif [[ '${{ github.ref }}' == refs/heads/${MAIN_BRANCH} ]]; thenecho "::set-output name=tag::${{ github.sha }}"source .github/auto.envcat .github/auto.env >> ${GITHUB_ENV}elseecho "This isn't either the main branch or a pull request. Exiting..."exit 1fiecho "::set-output name=kubernetes-namespace::${KUBERNETES_NAMESPACE}"- name: Build, tag, and push image to Amazon ECRenv:IMAGE_TAG: ${{ steps.prep.outputs.tag }}GITHUB_TOKEN: ${{ secrets.ORG_TOKEN }}run: |# This is needed because the Github Action environment variables have issues if the value contains spaces (e.g. 'EXTRA_DOCKER_ARGS')source .github/global.env# Build and push the image using the SHA tagdocker build -f ${{ env.DOCKERFILE }} -t ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME }}:${IMAGE_TAG} ${EXTRA_DOCKER_ARGS} .docker push ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME }}:${IMAGE_TAG}docker build -f ${{ env.SERVICE_DOCKERFILE }} -t ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME_SERVICE }}:latest .docker push ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME_SERVICE }}:latest# Push this image with the 'latest' tag if this is a "main branch" buildif [[ '${{ github.ref }}' == 'refs/heads/${{ env.MAIN_BRANCH }}' ]]; thendocker tag ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME }}:${IMAGE_TAG} ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME }}:latestdocker push ${{ env.ECR_REGISTRY }}/${{ env.APP_NAME }}:latestfi

备注:

以上脚本执行了下列命令

docker build -f docker/Dockerfile.base -t 590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest ${EXTRA_DOCKER_ARGS} .
docker push 590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest
docker build -f docker/service-dockerfile.base -t 590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation-service:latest .
docker push 590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation-service:latest

.github/wrokflows/execute-tests.yaml

输入参数

        environment, 必填,选择一个测试环境,可选值为qa,staging等

        platform,必填,选择哪一端的代码执行,可选值为web/android/ios等,主要是mobile的seed data也在该workflow中

        instanceCount,必填,选择调用多少AWS集群机来执行本次任务

        runId,选填,填入需要重跑的test run在testrails上面的id号

        reseed_test_data,必填,选择是否执行seed data,销毁并重新生成站点测试数据

        push_report,必填,选择是否发送测试报告到99u

        image_tag,必填,选择是否获取代码库中的最新代码

jobs

restart_failed_dp:

执行./deploy/at_restart_failed_dp建立DP索引​​​

runs-on: self-hostedsteps:- name: "Checkout source code"uses: actions/checkout@v2- name: "Prepare environment"id: preprun: |source .github/global.envcat .github/global.env >> ${GITHUB_ENV}source .github/auto.envcat .github/auto.env >> ${GITHUB_ENV}if [[ "$ENVIRONMENT" == "qa" ]]; thensource .github/qa.envcat .github/qa.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "sg-staging" ]]; thensource .github/sg-staging.envcat .github/sg-staging.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "sg-prod" ]]; thensource .github/sg-prod.envcat .github/sg-prod.env >> ${GITHUB_ENV}fichmod 777 ./deploy/at_restart_failed_dp- name: AWS assume cicd roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.GLOBAL_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: AWS assume one-eye roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.ONE_EYE_HELM_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: AT Restart Failed DPid: at_restart_failed_dpuses: docker://590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/infrastructure:latestenv:AT_DP_PASSWORD: ${{ secrets.AT_DP_PASSWORD }}STAGE: ${{ env.STAGE }}TEST_AWS_REGION: ${{ env.TEST_AWS_REGION }}TEST_AWS_REGION_SHORT: ${{ env.TEST_AWS_REGION_SHORT }}KUBERNETES_NAMESPACE: ${{ env.ONE_EYE_NS }}with:entrypoint: ./deploy/at_restart_failed_dp

 备注:

  • global.env存储docker注册服务地址、AWS身份认证信息、docker名称、镜像名称、主干分支名、cypress服务端口等全局参数信息
  • auto.env存储AWS Region信息、K8S命名空间、AWS身份认证信息、IMAGE_TAG和自动化测试报告的S3存放url及目录信息
  • qa.env存储被测系统所在的AWS Region信息、AWS身份认证信息、API接口域名信息等环境参数

seed_data:

执行./deploy/at_data_setup调用one-eye的pod造AT所需数据

runs-on: self-hostedneeds: restart_failed_dpsteps:- name: "Checkout source code"uses: actions/checkout@v2- name: "Prepare environment"id: preprun: |source .github/global.envcat .github/global.env >> ${GITHUB_ENV}source .github/auto.envcat .github/auto.env >> ${GITHUB_ENV}if [[ "$ENVIRONMENT" == "dev" ]]; thensource .github/dev.envcat .github/dev.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "nd" ]]; thensource .github/nd.envcat .github/nd.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "qa" ]]; thensource .github/qa.envcat .github/qa.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "sg-staging" ]]; thensource .github/sg-staging.envcat .github/sg-staging.env >> ${GITHUB_ENV}elif [[ "$ENVIRONMENT" == "sg-prod" ]]; thensource .github/sg-prod.envcat .github/sg-prod.env >> ${GITHUB_ENV}elseecho "Error env" $ENVIRONMENTexit 1fi- name: AWS assume cicd roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.GLOBAL_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: AWS assume one-eye roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.ONE_EYE_HELM_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: AT Data Setupid: at_data_setupuses: docker://590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/infrastructure:latestenv:RESEED_AT_DATA: ${{ env.RESEED_AT_DATA }}AT_DATA_POD_NAME: ${{ env.AT_DATA_POD_NAME }}STAGE: ${{ env.STAGE }}TEST_AWS_REGION: ${{ env.TEST_AWS_REGION }}TEST_AWS_REGION_SHORT: ${{ env.TEST_AWS_REGION_SHORT }}KUBERNETES_NAMESPACE: ${{ env.ONE_EYE_NS }}SEED_DATA_PASSWORD: ${{ env.SEED_DATA_PASSWORD }}PLATFORM: ${{ env.PLATFORM }}with:entrypoint: ./deploy/at_data_setup
execute-tests:

执行./deploy/test-execute启动K8S,分别启动initiator和worker进入测试执行

runs-on: self-hostedtimeout-minutes: 330needs: trigger_airflowsteps:- name: "Checkout source code"uses: actions/checkout@v2- name: "Prepare environment"id: preprun: |# Source our global environment variables & add them to GITHUB_ENV for subsequent stepssource .github/global.envcat .github/global.env >> ${GITHUB_ENV}# Source our environment variables for the "auto" account (where Automodo resides)source .github/auto.envcat .github/auto.env >> ${GITHUB_ENV}UNIQUE_ID=$(date +%s)echo UNIQUE_ID=$UNIQUE_ID >> $GITHUB_ENVIDENTITY_TOKEN=$(cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token)echo IDENTITY_TOKEN=${IDENTITY_TOKEN} >> $GITHUB_ENV- name: AWS assume cicd roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.GLOBAL_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: AWS assume helm roleuses: aws-actions/configure-aws-credentials@v1env:AWS_SDK_LOAD_CONFIG: falsewith:aws-region: ${{ env.AWS_REGION }}role-to-assume: ${{ env.HELM_AWS_ROLE_ARN }}role-duration-seconds: 1200role-session-name: GitHubAction- name: Run Testsid: run-testsuses: docker://590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/infrastructure:latestenv:STAGE: autoRELEASE_NAME: ${{ env.APP_NAME }}IMAGE_NAME: ${{ env.IMAGE_NAME }}IMAGE_TAG: ${{ github.event.inputs.image_tag }}HELM_AWS_ROLE_ARN: ${{ env.HELM_AWS_ROLE_ARN }}RESEED_AT_DATA: ${{ env.RESEED_AT_DATA }}with:entrypoint: ./deploy/test-execute

Docker File

docker/Dockerfile.base

# --- Build/test ---
FROM cypress/browsers:node16.14.2-slim-chrome100-ff99-edge as base# 安装 Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \&& apt-get update \&& apt-get install -y google-chrome-stableARG ENVIRONMENT=dockerWORKDIR /# Use bash instead of sh for easier logic below
SHELL ["/bin/bash", "-c"]ADD / ./
RUN npm ci --no-optionalENV ENVIRONMENT=
ENV DIRECTOR_ADDRESS=
ENV S3_REPORT_BUCKET_URL=
ENV S3_REPORT_BUCKET=
ENV AWS_REGION=
ENV RUN_ID=
ENV CI_BUILD_ID=
ENV TYPE=CMD ENVIRONMENT=${ENVIRONMENT} AWS_REGION=${AWS_REGION} S3_REPORT_BUCKET_URL=${S3_REPORT_BUCKET_URL} S3_REPORT_BUCKET=${S3_REPORT_BUCKET} DIRECTOR_ADDRESS=${DIRECTOR_ADDRESS} RUN_ID=${RUN_ID} CI_BUILD_ID=${CI_BUILD_ID} TYPE=${TYPE} node ./cypress/scripts/cicd.js

docker/service-dockerfile.base

# --- Build/test ---
FROM cypress/browsers:node16.14.2-slim-chrome100-ff99-edge as baseWORKDIR /# Use bash instead of sh for easier logic below
SHELL ["/bin/bash", "-c"]ADD / ./RUN npm ci --no-optionalCMD node ./cypress/service/service.js

Deploy

deploy/test-execute

#!/bin/bash# echo ${IDENTITY_TOKEN} > /tmp/token
set -eunset AWS_PROFILEexport KUBECONFIG="/dev/shm/cicd"
aws --region ${AWS_REGION} eks update-kubeconfig --name=ndpg-${AWS_REGION_SHORT}-${STAGE}-eks-cluster# kubectl complains if KUBECONFIG is world readable, so lock it down
chmod 600 "${KUBECONFIG}"cd deployif [ "$RESEED_AT_DATA" = "only" ];thenecho "find flag RESEED_AT_DATA is only, Skip run tests...."exit 0
fi# Clean up the old secrets
kubectl get secrets --no-headers=true | awk '/cypress-automation-config/{print $1}'| xargs  kubectl delete secrets || true# Deploy the director if none exists
if [ "$(kubectl get service -n ${KUBERNETES_NAMESPACE} ${RELEASE_NAME}-director -o jsonpath='{.metadata.name}')" != "${RELEASE_NAME}-director" ]; thenecho -e "Starting director、dashboard、api and service...\n"helmfile -f helmfile-director.yaml apply --suppress-secrets
fi# Run the initiator job
if [ ! ${RUN_ID} ]; thenecho -e "Creating the TestRail run...\n"
elseecho -e "Rerun tests that are not passed in the existing run, ${RUN_ID}...\n"
fi#通过执行helmfile.yaml拉取镜像文件590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest
INSTANCES=1 TYPE=initiator JOB_TIMEOUT=300 helmfile -f helmfile.yaml apply --suppress-secrets
#创建k8s容器如cypress-automation-qa-initiator-${UNIQUE_ID}
kubectl wait -n ${KUBERNETES_NAMESPACE} --for=condition=Complete --timeout=5m job/cypress-automation-${ENVIRONMENT}-initiator-${UNIQUE_ID}#通过执行helmfile.yaml拉取镜像文件590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest
echo -e "Starting workers...\n"
TYPE=worker JOB_TIMEOUT=9000 helmfile -f helmfile.yaml apply --suppress-secrets
echo -e "See the progress at https://pangaea.testrail.io/index.php?/runs/overview/5"
#创建k8s容器如cypress-automation-qa-worker-${UNIQUE_ID}
kubectl wait -n ${KUBERNETES_NAMESPACE} --for=condition=Ready --timeout=10m -l job-name=cypress-automation-${ENVIRONMENT}-worker-${UNIQUE_ID} podsecho -e "Done."

备注:

(1)通过执行helmfile.yaml拉取镜像文件590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest
(2)创建k8s容器如cypress-automation-qa-initiator-${UNIQUE_ID}
(3)通过执行helmfile.yaml拉取镜像文件590183924964.dkr.ecr.ap-southeast-1.amazonaws.com/cypress-automation:latest
(4)创建k8s容器如cypress-automation-qa-worker-${UNIQUE_ID}

当Dockerfile.base生成的镜像在容器中运行时,会执行./cypress/scripts/cicd.js开始进入测试

当service-dockerfile.base生成的镜像在容器中运行时,会执行./cypress/service/service.js启动事件监听并在监听到执行完成事件时,向99u发送报告消息

其中,initiator和worker的区别在于,initiator会在testrail中创建新的run或者获取re-run的runId
 

相关文章:

Cypress自动化Github workflow

目录 Workflow .github/workflows/build.yaml jobs build-deploy: .github/wrokflows/execute-tests.yaml 输入参数 jobs restart_failed_dp: seed_data: execute-tests: Docker File docker/Dockerfile.base docker/service-dockerfile.base Deploy deploy/tes…...

Hbase高阶知识:HBase的协处理器(Coprocessor)原理、使用实例、高级技巧和案例分析

目录 第一章 Hbase概述与基础知识 1.1 HBase的架构与数据模型 1.2 什么是协处理器 1.3 协处理器的优势 第二章 协处理器的工作原理 2.1 协处理器的运行机制 2.2 协处理器的注册与监听 2.3 协处理器与RegionServer的交互 第三章 协处理器的类型 3.1 端点协处理器 3.2…...

海尔嵌入式硬件校招面试题及参考答案

使用 QT 的经验及对控件和信号与槽机制的了解 我使用 QT 有一段时间了,在项目开发中积累了较为丰富的经验。 QT 中的控件丰富多样,涵盖了各种常见的界面元素需求。例如按钮、文本框、列表框、进度条等。这些控件具有良好的可定制性,可以通过属性设置、样式表等方式来调整外观…...

Leetcode基础算法篇|202409(4)贪心算法

贪心算法(Greedy Algorithm):一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法。 学习链接:leetcode-notes/docs/ch04/04.04/04.04.02-Exercises.md at main datawha…...

echarts 导出pdf空白原因

问题阐述 页面样式: 导出pdf: 导出pdf,统计图部分为空白。 问题原因 由于代码中进行了dom字符串的复制,而echarts用canvas绘制,canvas内部内容不会进行复制,只会复制canvas节点,因此导出pdf空白。 解决…...

数据结构及基本算法

目录 第一章 概论 第一节 引言 第二节 基本概念和常用术语 第三节 算法的描述与分析 第二章 线性表 第一节 线性表定义和基本运算个 一、线性表的逻辑定义 二、线性表的基本运算 第二节 线性表的顺序存储和基本运算的实现 一、线性表的顺序存储 二、顺序表上基本运算…...

vue3学习记录-computed

vue3学习记录-computed 1.为什么要用computed2.使用方法2.1 基本实例2.2 可写计算属性 1.为什么要用computed 写个购物车的案例 <script setup> import { ref, reactive,computed } from "vue" const tableData reactive([{ name: 商品1, price: 10, num: 1…...

SQLite3模块使用详解

目录 一、引言 1.1 SQLite3 简介 1.2 Python sqlite3 模块 二、连接数据库 2.1 导入 sqlite3 模块 2.2 连接数据库 2.3 创建游标对象 三、执行 SQL 语句 3.1 创建表 3.2 插入数据 3.3 查询数据 3.4 更新数据 3.5 删除数据 四、处理查询结果 4.1 fetchall() 4.2…...

防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)

实验要求 根据实验要求配置防火墙&#xff1a; 合理部署防火墙安全策略以及安全区域实现内网用户可以访问外网用户&#xff0c;反之不能访问内网用户和外网用户均可以访问公司服务器 实验配置 步骤一&#xff1a;配置各个终端、防火墙端口IP地址 终端以服务器为例&#xff…...

假期学习--iOS中的static关键字

iOS中的static关键字 OC的static关键字 OC也提供了Static关键字&#xff0c;但是这个static关键字不能用于修饰成员变量&#xff0c;也就是说Static是不被允许修饰实例变量&#xff0c;同时Static关键字也不被允许修饰方法。Static关键字可以修饰全局变量&#xff0c;局部变量…...

Maya没有Arnold材质球

MAYA 没有Arnold材质球_哔哩哔哩_bilibili...

面试知识点总结篇三

一、arm中断流程和函数 ARM 中断流程 中断触发保存上下文中断向量表执行ISR - 清除中断标志恢复上下文返回中断 二、STM32任务间通信有哪些方式 消息队列、 信号量、共享内存、任务通知 三、uboot内存没驱动之前是怎么操作的 硬件初始化内存检测设置内存映射控制台初始化…...

数据加密标准(DES)详解:原理、步骤及Python实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…...

每日OJ_牛客_OR59字符串中找出连续最长的数字串_双指针_C++_Java

目录 牛客_OR59字符串中找出连续最长的数字串 题目解析 C代码1 C代码2 C代码3 Java代码 牛客_OR59字符串中找出连续最长的数字串 字符串中找出连续最长的数字串_牛客题霸_牛客网 题目解析 双指针&#xff1a; 遍历整个字符串&#xff0c;遇到数字的时候&#xff0c;用双…...

虚幻引擎UE5如何云渲染,教程来了

​步骤一&#xff1a;获取云渲染权限 访问渲染101官网&#xff0c;使用云渲码6666进行注册。 下载并安装渲染客户端。 步骤二&#xff1a;设置渲染环境 确保云渲染环境与您的本地环境一致&#xff0c;避免出错。 步骤三&#xff1a;任务提交 完成环境配置后&#xff0c;解析…...

使用Python实现图形学光照和着色的光线追踪算法

目录 使用Python实现图形学光照和着色的光线追踪算法引言1. 光线追踪算法概述2. Python实现光线追踪算法2.1 向量类2.2 光源类2.3 材质类2.4 物体类2.5 光线追踪器类2.6 使用示例 3. 实例分析4. 光线追踪算法的优缺点4.1 优点4.2 缺点 5. 改进方向6. 应用场景结论 使用Python实…...

通过openAI的Chat Completions API实现一个支持追问的ChatGPT功能集成

文章目录 前言准备工作代码实现思路完整代码实现备注前言 本文介绍如何通过openAI的Chat Completions API实现一个支持追问的后台功能,追问打个比方,就是当你问了一句”窗前明月光的下一句是什么?“之后,想再往下问就可以直接问”再下一句呢?“,模型也能基于上下文理解你…...

8,STM32CubeMX配置SPI工程(读取norflash的ID)

1&#xff0c;前言 单片机型号&#xff1a;STM32F407 编程环境 &#xff1a;STM32CubeMX Keil v5 硬件连接 &#xff1a;SPI1&#xff0c;CS/SS--->PB14 注&#xff1a;本工程在1&#xff0c;STM32CubeMX工程基础&#xff08;配置Debug、时钟树&#xff09;基础上完…...

【MATLAB源码-第178期】基于matlab的8PSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyi…...

AIGC学习笔记—minimind详解+训练+推理

前言 这个开源项目是带我的一个导师&#xff0c;推荐我看的&#xff0c;记录一下整个过程&#xff0c;总结一下收获。这个项目的slogan是“大道至简”&#xff0c;确实很简。作者说是这个项目为了帮助初学者快速入门大语言模型&#xff08;LLM&#xff09;&#xff0c;通过从零…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

循环语句之while

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为&#xff1a; i); i i 1; } 下面的例子是一个无限循环&#xff0c;因…...

scan_mode设计原则

scan_mode设计原则 在进行mtp controller设计时&#xff0c;基本功能设计完成后&#xff0c;需要设计scan_mode设计。 1、在进行scan_mode设计时&#xff0c;需要保证mtp处于standby模式&#xff0c;不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可&#xf…...