feat: manually mirror opencoze's code from bytedance
Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
73
.codebase/pipelines/backend.yml
Normal file
73
.codebase/pipelines/backend.yml
Normal file
@@ -0,0 +1,73 @@
|
||||
name: "ci@backend pipeline"
|
||||
|
||||
trigger:
|
||||
change:
|
||||
paths:
|
||||
- "backend/**"
|
||||
|
||||
jobs:
|
||||
unit_test:
|
||||
image: hub.byted.org/codebase/ci_go_1_24:latest
|
||||
name: Unit Test
|
||||
steps:
|
||||
- id: mysql_scripts
|
||||
name: mysql scripts
|
||||
uses: actions/mysql-scripts@v1
|
||||
inputs:
|
||||
db_name: opencoze
|
||||
host: mysql
|
||||
path: "docker/atlas/migrations/*.sql"
|
||||
user: root
|
||||
password: root
|
||||
- name: Go Test
|
||||
uses: actions/codecov
|
||||
inputs:
|
||||
driver: go
|
||||
commands:
|
||||
- modules=`find . -name "go.mod" -exec dirname {} \;`
|
||||
- echo $modules
|
||||
- list=""
|
||||
- coverpkg=""
|
||||
- if [[ ! -f "go.work" ]];then go work init;fi
|
||||
- for module in $modules; do go work use $module; list=$module"/... "$list; coverpkg=$module"/...,"$coverpkg; done
|
||||
- go work sync
|
||||
- go test -coverprofile=coverage.out -gcflags="all=-l -N" -coverpkg=$coverpkg $list
|
||||
config:
|
||||
status:
|
||||
project:
|
||||
opencoze:
|
||||
minimum_coverage: 0%
|
||||
paths:
|
||||
- "!tests"
|
||||
- "!examples/**"
|
||||
- "!*/examples/**"
|
||||
- "!*/mock/**"
|
||||
- "!*/model/**"
|
||||
diff:
|
||||
eino:
|
||||
line_limit: 10 # 增量行数少于多少行时,默认置成功
|
||||
minimum_coverage: 0%
|
||||
paths:
|
||||
- "!tests"
|
||||
- "!examples/**"
|
||||
- "!*/examples/**"
|
||||
- "!*/mock/**"
|
||||
- "!*/model/**"
|
||||
- name: Sonar
|
||||
uses: actions/sonar@v1
|
||||
inputs:
|
||||
coverage_path: /tmp/coverage.out
|
||||
coverage_type: go
|
||||
disable_quality_gates: true
|
||||
exclusions_list:
|
||||
- "!tests"
|
||||
- "examples/**"
|
||||
- "*/mock/**"
|
||||
- "*/model/**"
|
||||
language: go
|
||||
services:
|
||||
- id: mysql
|
||||
image: hub.byted.org/ee/mysql:8.0
|
||||
envs:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: opencoze
|
||||
180
.codebase/pipelines/ci@fe-master.yaml
Normal file
180
.codebase/pipelines/ci@fe-master.yaml
Normal file
@@ -0,0 +1,180 @@
|
||||
name: CI@fe-master
|
||||
trigger:
|
||||
cron:
|
||||
push:
|
||||
branches: []
|
||||
paths:
|
||||
- "frontend/**"
|
||||
types: [branch]
|
||||
notification:
|
||||
when: failure
|
||||
# 搜索群名:Bot Studio Monorepo CI 报警群
|
||||
to: ['7350862409475031044']
|
||||
manual:
|
||||
notification:
|
||||
when: failure
|
||||
|
||||
jobs:
|
||||
lint: &base_job
|
||||
runs-on:
|
||||
env: online
|
||||
name: Lint
|
||||
image: hub.byted.org/base/bot_monorepo_ci_env:ae543e9bbc6d8155cffbd8f5ed27fb73
|
||||
# 从最近的 CI 执行记录看,install 步骤有概率会等待超时
|
||||
# 目前已 oncall,这里先设置一个超时时间,避免阻塞
|
||||
timeout: 30
|
||||
envs:
|
||||
RUSH_BUILD_CACHE_WRITE_ALLOWED: ${{RUSH_BUILD_CACHE_WRITE_ALLOWED}}
|
||||
RUSH_BUILD_CACHE_ENABLED: ${{RUSH_BUILD_CACHE_ENABLED}}
|
||||
RUSH_BUILD_CACHE_CREDENTIAL: ${{RUSH_BUILD_CACHE_CREDENTIAL}}
|
||||
ACCESS_TOKEN: ${{CI_BOT_ACCESS_TOKEN}}
|
||||
CI: 'true'
|
||||
RUN_BYTEST_COV: 'false' # disable Jupiter default behavior of invoke bytestcov
|
||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 'true'
|
||||
CYPRESS_INSTALL_BINARY: '0'
|
||||
TAIKO_SKIP_CHROMIUM_DOWNLOAD: '0'
|
||||
RE2_DOWNLOAD_SKIP_PATH: '1'
|
||||
RE2_DOWNLOAD_MIRROR: https://bnpm.bytedance.net/mirrors
|
||||
# https://typescript-eslint.io/packages/parser/#allowautomaticsingleruninference
|
||||
TSESTREE_SINGLE_RUN: 'true'
|
||||
# 使用云盘缓存:https://bytedance.larkoffice.com/wiki/A60lwgolSinteMkOz71cFPvFneg
|
||||
# TODO:不同job的缓存key暂时使用同一个,后续可以考虑区分
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-master-v2-lint
|
||||
size: 256
|
||||
steps:
|
||||
- &checkout_step
|
||||
id: Checkout
|
||||
uses: actions/checkout
|
||||
inputs:
|
||||
depth: 1
|
||||
- &proxy_step
|
||||
name: SetupProxy
|
||||
commands:
|
||||
- bash .codebase/scripts/env.sh
|
||||
- &init_env_step
|
||||
name: Initialization
|
||||
commands:
|
||||
- printenv
|
||||
- git config user.name ci_flow
|
||||
- git config user.email ci_flow@bytedance.com
|
||||
- &install_deps_step
|
||||
name: Install dependencies
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js install
|
||||
# 暂时不启用,因为eslintignore文件移除会导致解析报错,后期接入可考虑动态读取eslint ignore配置
|
||||
# - name: PreLint
|
||||
# parallel-with-next-step: true
|
||||
# commands:
|
||||
# - npx oxlint@latest -A all .
|
||||
- name: Lint
|
||||
commands:
|
||||
- NODE_OPTIONS="--max-old-space-size=4096" node common/scripts/install-run-rush.js lint
|
||||
|
||||
ts_check:
|
||||
<<: *base_job
|
||||
name: Check TS Type
|
||||
timeout: 30
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-master-v2-ts-check
|
||||
size: 256
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: Check TS Type
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js ts-check -v
|
||||
|
||||
build:
|
||||
<<: *base_job
|
||||
name: Build
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-master-v2-build
|
||||
size: 256
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: Build
|
||||
commands:
|
||||
- CUSTOM_VERSION=release REGION=sg BUILD_BRANCH=test node common/scripts/install-run-rush.js build -v
|
||||
|
||||
test:
|
||||
<<: *base_job
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-master-v2-test
|
||||
size: 256
|
||||
name: Test
|
||||
services:
|
||||
# 下面启动一个mysql和mongo服务,主要用于coze.hub.core相关服务的集成测试
|
||||
# id需要保持跟代码中连接的host一致
|
||||
- id: hub_mysql
|
||||
image: hub.byted.org/ee/mysql:5.7
|
||||
envs:
|
||||
MYSQL_ROOT_PASSWORD: test
|
||||
MYSQL_DATABASE: coze_hub
|
||||
MYSQL_USER: test
|
||||
MYSQL_PASSWORD: test
|
||||
MYSQL_TCP_PORT: 3306
|
||||
- id: hub_mongo
|
||||
image: hub.byted.org/ee/mongo:4.0.24
|
||||
commands:
|
||||
- mongod --replSet rs0
|
||||
- id: mongo-init
|
||||
image: hub.byted.org/ee/mongo:4.0.24
|
||||
commands:
|
||||
- sleep 10s
|
||||
- mongo mongodb://127.0.0.1:27017 --eval 'rs.initiate()'
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: wait mongo ready
|
||||
uses: actions/mongodb-scripts
|
||||
inputs:
|
||||
host: 127.0.0.1
|
||||
port: 27017
|
||||
- name: wait mysql ready
|
||||
uses: actions/mysql-scripts
|
||||
inputs:
|
||||
host: hub_mysql
|
||||
user: test
|
||||
password: test
|
||||
commands:
|
||||
- mysql -u test -ptest -h hub_mysql -P 3306 -e 'show databases;'
|
||||
# 服务发现
|
||||
- id: consul
|
||||
uses: actions/setup-consul
|
||||
- name: Test Coverage
|
||||
id: test
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js test:cov -v
|
||||
# https://bytedance.feishu.cn/wiki/wikcn9Z4azEdfJalVPKcOs9vxsR
|
||||
|
||||
security_scan:
|
||||
<<: *base_job
|
||||
name: Security Scan
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-master-v2-scan
|
||||
size: 256
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: build
|
||||
commands:
|
||||
- CUSTOM_VERSION=release REGION=sg node common/scripts/install-run-rush.js build -o app-botstudio-main -v
|
||||
- id: Argus
|
||||
commands:
|
||||
- npm i @ies/argus-scan@0.30.37 -g
|
||||
- bash .codebase/scripts/argus-scan.sh
|
||||
89
.codebase/pipelines/ci@fe-tsc.yaml
Normal file
89
.codebase/pipelines/ci@fe-tsc.yaml
Normal file
@@ -0,0 +1,89 @@
|
||||
name: CI@fe-tsc
|
||||
trigger:
|
||||
manual:
|
||||
change:
|
||||
# 临时支持 project-ide 项目需求,临时修改为如下格式
|
||||
# 后续需调整回 integration/**
|
||||
types: [create, push, restore]
|
||||
paths:
|
||||
- "frontend/**"
|
||||
notification:
|
||||
when: failure
|
||||
|
||||
jobs:
|
||||
ts_check: &base_job
|
||||
runs-on:
|
||||
env: online
|
||||
image: hub.byted.org/base/bot_monorepo_ci_env:ae543e9bbc6d8155cffbd8f5ed27fb73
|
||||
# 从最近的 CI 执行记录看,install 步骤有概率会等待超时
|
||||
# 目前已 oncall,这里先设置一个超时时间,避免阻塞
|
||||
timeout: 30
|
||||
if: ${{ !Event.Change.IsPreSubmit }}
|
||||
envs:
|
||||
targetBranch: ${{Event.Change.Target.Branch}}
|
||||
RUSH_BUILD_CACHE_WRITE_ALLOWED: ${{RUSH_BUILD_CACHE_WRITE_ALLOWED}}
|
||||
RUSH_BUILD_CACHE_ENABLED: ${{RUSH_BUILD_CACHE_ENABLED}}
|
||||
RUSH_BUILD_CACHE_CREDENTIAL: ${{RUSH_BUILD_CACHE_CREDENTIAL}}
|
||||
ACCESS_TOKEN: ${{CI_BOT_ACCESS_TOKEN}}
|
||||
CI: 'true'
|
||||
RUN_BYTEST_COV: 'false'
|
||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 'true'
|
||||
CYPRESS_INSTALL_BINARY: '0'
|
||||
TAIKO_SKIP_CHROMIUM_DOWNLOAD: '0'
|
||||
RE2_DOWNLOAD_SKIP_PATH: '1'
|
||||
RE2_DOWNLOAD_MIRROR: https://bnpm.bytedance.net/mirrors
|
||||
MERGE_REQUEST_TITLE: ${{Event.Change.Title}}
|
||||
TSESTREE_SINGLE_RUN: 'true'
|
||||
steps:
|
||||
- &checkout_step
|
||||
name: Checkout
|
||||
uses: actions/checkout
|
||||
inputs:
|
||||
submodules: true
|
||||
depth: 1
|
||||
|
||||
- &proxy_step
|
||||
name: SetupProxy
|
||||
commands:
|
||||
- bash .codebase/scripts/env.sh
|
||||
|
||||
- &remote_info_step
|
||||
id: RemoteInfo
|
||||
uses: 'actions/mr-remote-info'
|
||||
inputs:
|
||||
info_list: ['behind_commits', 'changed_files', 'changed_files_path']
|
||||
|
||||
- &cache_step
|
||||
id: Cache
|
||||
uses: actions/cache
|
||||
inputs:
|
||||
key: flow-monorepo-${{Event.Change.Source.Branch}}
|
||||
paths:
|
||||
- common/temp/pnpm-store
|
||||
restore_keys:
|
||||
- flow-monorepo-${{Event.Change.Source.Branch}}
|
||||
- flow-monorepo-store-master
|
||||
|
||||
- &init_env_step
|
||||
id: InitEnv
|
||||
name: Initialization
|
||||
commands:
|
||||
- printenv
|
||||
- git config user.name ci_flow
|
||||
- git config user.email ci_flow@bytedance.com
|
||||
- npm config set registry=https://registry.npmjs.org
|
||||
- pnpm config set network-concurrency 32
|
||||
- echo "$(<${{Steps.RemoteInfo.Outputs.changed_files_path}})"
|
||||
- echo "::set-output name=ShouldRunBuild::${{ Event.Change.IsPreSubmit || int(Steps.RemoteInfo.Outputs.behind_commits) <= 6 }}"
|
||||
|
||||
- &install_deps_step
|
||||
name: Install dependencies
|
||||
commands:
|
||||
- npx why-is-node-running@v2.x common/scripts/install-run-rush.js increment --action install -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
|
||||
- name: Prepare basic packages
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js pre-build -v
|
||||
- name: Check TS Type
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js increment --action ts-check -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
184
.codebase/pipelines/ci@fe.yml
Normal file
184
.codebase/pipelines/ci@fe.yml
Normal file
@@ -0,0 +1,184 @@
|
||||
name: CI@fe
|
||||
trigger:
|
||||
manual:
|
||||
change:
|
||||
source-branches: ['!release/**', '!task/**']
|
||||
types: [create, push, restore]
|
||||
paths:
|
||||
- "frontend/**"
|
||||
notification:
|
||||
when: failure
|
||||
|
||||
jobs:
|
||||
lint: &base_job
|
||||
runs-on:
|
||||
env: online
|
||||
image: hub.byted.org/base/bot_monorepo_ci_env:ae543e9bbc6d8155cffbd8f5ed27fb73
|
||||
# 从最近的 CI 执行记录看,install 步骤有概率会等待超时
|
||||
# 目前已 oncall,这里先设置一个超时时间,避免阻塞
|
||||
timeout: 30
|
||||
if: ${{ !Event.Change.IsPreSubmit }}
|
||||
envs:
|
||||
targetBranch: ${{Event.Change.Target.Branch}}
|
||||
RUSH_BUILD_CACHE_WRITE_ALLOWED: ${{RUSH_BUILD_CACHE_WRITE_ALLOWED}}
|
||||
RUSH_BUILD_CACHE_ENABLED: ${{RUSH_BUILD_CACHE_ENABLED}}
|
||||
RUSH_BUILD_CACHE_CREDENTIAL: ${{RUSH_BUILD_CACHE_CREDENTIAL}}
|
||||
ACCESS_TOKEN: ${{CI_BOT_ACCESS_TOKEN}}
|
||||
CI: 'true'
|
||||
RUN_BYTEST_COV: 'false'
|
||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 'true'
|
||||
CYPRESS_INSTALL_BINARY: '0'
|
||||
TAIKO_SKIP_CHROMIUM_DOWNLOAD: '0'
|
||||
BUILD_BRANCH: ${{Event.Change.Source.Branch}}
|
||||
RE2_DOWNLOAD_SKIP_PATH: '1'
|
||||
MERGE_REQUEST_TITLE: ${{Event.Change.Title}}
|
||||
TSESTREE_SINGLE_RUN: 'true'
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-ci-v2-lint
|
||||
size: 256
|
||||
steps:
|
||||
- &checkout_step
|
||||
name: Checkout
|
||||
uses: actions/checkout
|
||||
inputs:
|
||||
submodules: true
|
||||
depth: 1
|
||||
|
||||
- &proxy_step
|
||||
name: SetupProxy
|
||||
commands:
|
||||
- bash .codebase/scripts/env.sh
|
||||
|
||||
- &remote_info_step
|
||||
id: RemoteInfo
|
||||
uses: 'actions/mr-remote-info'
|
||||
inputs:
|
||||
info_list: ['behind_commits', 'changed_files', 'changed_files_path']
|
||||
|
||||
- &cache_step
|
||||
id: Cache
|
||||
uses: actions/cache
|
||||
inputs:
|
||||
key: flow-monorepo-${{Event.Change.Source.Branch}}
|
||||
paths:
|
||||
- common/temp/pnpm-store
|
||||
- packages/arch/idl/src/auto-generated
|
||||
restore_keys:
|
||||
- flow-monorepo-${{Event.Change.Source.Branch}}
|
||||
- flow-monorepo-store-master
|
||||
|
||||
- &init_env_step
|
||||
id: InitEnv
|
||||
name: Initialization
|
||||
commands:
|
||||
- printenv
|
||||
- git config user.name ci_flow
|
||||
- git config user.email ci_flow@bytedance.com
|
||||
- npm config set registry=https://registry.npmjs.org
|
||||
- pnpm config set network-concurrency 32
|
||||
- echo "$(<${{Steps.RemoteInfo.Outputs.changed_files_path}})"
|
||||
- echo "::set-output name=ShouldRunBuild::${{ Event.Change.IsPreSubmit || int(Steps.RemoteInfo.Outputs.behind_commits) <= 6 }}"
|
||||
|
||||
- &install_deps_step
|
||||
name: Install dependencies
|
||||
commands:
|
||||
- npx why-is-node-running@v2.x common/scripts/install-run-rush.js increment --action install -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
|
||||
- name: Check Lint
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js increment --action lint -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
|
||||
style_check:
|
||||
<<: *base_job
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-ci-v2-style-check
|
||||
size: 256
|
||||
name: Check Stylelint
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *remote_info_step
|
||||
- *cache_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: Check Stylelint
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js increment --action style -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
|
||||
build:
|
||||
<<: *base_job
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-ci-v2-build
|
||||
size: 256
|
||||
name: Build
|
||||
timeout: 20
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *remote_info_step
|
||||
- *cache_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: Build
|
||||
id: build
|
||||
if: ${{ Steps.InitEnv.Outputs.ShouldRunBuild }}
|
||||
commands:
|
||||
- node common/scripts/install-run-rush.js increment --action build -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
|
||||
test:
|
||||
<<: *base_job
|
||||
caches:
|
||||
- backend: ebs
|
||||
key: bot-studio-monorepo-ci-v2-test
|
||||
size: 256
|
||||
name: Test Coverage
|
||||
services:
|
||||
# 下面启动一个mysql和mongo服务,主要用于coze.hub.core相关服务的集成测试
|
||||
# id需要保持跟代码中连接的host一致
|
||||
- id: hub_mysql
|
||||
image: hub.byted.org/ee/mysql:5.7
|
||||
envs:
|
||||
MYSQL_ROOT_PASSWORD: test
|
||||
MYSQL_DATABASE: coze_hub
|
||||
MYSQL_USER: test
|
||||
MYSQL_PASSWORD: test
|
||||
MYSQL_TCP_PORT: 3306
|
||||
- id: hub_mongo
|
||||
image: hub.byted.org/ee/mongo:4.0.24
|
||||
commands:
|
||||
- mongod --replSet rs0
|
||||
- id: mongo-init
|
||||
image: hub.byted.org/ee/mongo:4.0.24
|
||||
commands:
|
||||
- sleep 10s
|
||||
- mongo mongodb://127.0.0.1:27017 --eval 'rs.initiate()'
|
||||
steps:
|
||||
- *checkout_step
|
||||
- *proxy_step
|
||||
- *remote_info_step
|
||||
- *cache_step
|
||||
- *init_env_step
|
||||
- *install_deps_step
|
||||
- name: wait mongo ready
|
||||
uses: actions/mongodb-scripts
|
||||
inputs:
|
||||
host: 127.0.0.1
|
||||
port: 27017
|
||||
- name: wait mysql ready
|
||||
uses: actions/mysql-scripts
|
||||
inputs:
|
||||
host: hub_mysql
|
||||
user: test
|
||||
password: test
|
||||
commands:
|
||||
- mysql -u test -ptest -h hub_mysql -P 3306 -e 'show databases;'
|
||||
# 服务发现
|
||||
- id: consul
|
||||
uses: actions/setup-consul
|
||||
- name: Test Coverage
|
||||
commands:
|
||||
- git fetch --filter=blob:none --unshallow -q
|
||||
- node common/scripts/install-run-rush.js increment --action test:cov -p ${{Steps.RemoteInfo.Outputs.changed_files_path}}
|
||||
14
.codebase/scripts/argus-scan.sh
Normal file
14
.codebase/scripts/argus-scan.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
# 暂时只扫描 app-botstudio-main 项目的产物
|
||||
result=$(argus scm -c apps/bot/dist_sg/static -n obric/cloud/bot_studio_oversea -l)
|
||||
|
||||
if echo "$result" | grep -q '::add-message level=error:::'; then
|
||||
if [ "$CI" ]; then
|
||||
echo '::add-message level=info::本地验证命令:`npm install -g @ies/argus-scan@0.30.37 && REGION=sg CUSTOM_VERSION=release rush build -o app-botstudio-main && argus scm -c apps/bot/dist_sg/static -n obric/cloud/bot_studio_oversea -l`'
|
||||
fi
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
94
.codebase/scripts/check-file-size.sh
Normal file
94
.codebase/scripts/check-file-size.sh
Normal file
@@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 设置默认值
|
||||
TARGET_BRANCH=${targetBranch}
|
||||
CI_MODE=${CI:-false}
|
||||
|
||||
# Specify the pattern you want to exclude, using *space* as the separator
|
||||
EXCLUDE_PATTERNS=(
|
||||
'**/pnpm-lock.yaml'
|
||||
'packages/arch/bot-api/src/auto-generate/**'
|
||||
'apps/bot-op/src/services/bam-auto-generate/**'
|
||||
'apps/prompt-platform/src/services/auto-generate/**'
|
||||
".cursor/api/**"
|
||||
"**/lib/**"
|
||||
"**/.*/**"
|
||||
'**/__tests__/**'
|
||||
'**/__test__/**'
|
||||
"**/__mocks__/**"
|
||||
"**/__mock__/**"
|
||||
"**/*.test.*/**"
|
||||
"**/*.spec.*/**"
|
||||
"**/__snapshots__/**"
|
||||
"**/*.snap"
|
||||
'**/e2e/**'
|
||||
'common/changes/**'
|
||||
'apps/fornax/**',
|
||||
"packages/arch/semi-theme-hand01",
|
||||
"packages/arch/arco-icon",
|
||||
"packages/arch/resources/**"
|
||||
)
|
||||
|
||||
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
|
||||
EXCLUDE_STRING+=":(exclude)$pattern "
|
||||
done
|
||||
|
||||
if [ "$CI_MODE" = true ]; then
|
||||
files=$(git diff --name-only --diff-filter=AM "origin/$TARGET_BRANCH..." $EXCLUDE_STRING)
|
||||
else
|
||||
files=$(git diff --name-only --diff-filter=AM --cached $EXCLUDE_STRING)
|
||||
fi
|
||||
|
||||
# 体积限制为512KB
|
||||
size_limit=$((512))
|
||||
large_files_info=""
|
||||
|
||||
IFS=$'\n' # 处理文件名存在空格情况
|
||||
for file in $files; do
|
||||
file_size=$(wc -c <"$file" 2>/dev/null)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "错误: 无法获取文件 '$file' 的大小"
|
||||
continue
|
||||
fi
|
||||
file_size_kb=$((file_size / 1024))
|
||||
echo "$file file size is $file_size_kb KB"
|
||||
if [ "$file_size_kb" -gt "$size_limit" ]; then
|
||||
large_files_info+="- \`$file\` ($file_size_kb KB)\n"
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
|
||||
output_conclusion() {
|
||||
local conclusion="$1"
|
||||
echo "$conclusion" >check-file-size.log
|
||||
echo "::update-check-run::check-file-size.log"
|
||||
}
|
||||
|
||||
if [ -n "$large_files_info" ]; then
|
||||
if [ "$CI_MODE" = true ]; then
|
||||
CONCLUSION="{
|
||||
\"name\": \"文件体积\",
|
||||
\"conclusion\": \"failed\",
|
||||
\"output\": {
|
||||
\"summary\": \"<h1>错误: 文件体积过大</h1> <br /> 以下文件体积超过限制 (${size_limit}KB): \\n \\n $large_files_info \\n \\n <br /> 你可以将资源上传到CDN并通过URL使用。详情请参考此[文档](https://bytedance.larkoffice.com/wiki/MjoIwfyGyiVCBFkBgnXc8LFTniX)。<br /> 如遇紧急情况,可以联系 [@fanwenjie.fe](https://code.byted.org/fanwenjie.fe) 跳过此错误。\"
|
||||
}
|
||||
}"
|
||||
output_conclusion "$CONCLUSION"
|
||||
else
|
||||
echo "错误: 以下文件体积超过限制 (${size_limit}KB):"
|
||||
echo -e "$large_files_info"
|
||||
echo "请将大文件上传到CDN并通过URL使用。详情请参考: https://bytedance.larkoffice.com/wiki/MjoIwfyGyiVCBFkBgnXc8LFTniX"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if [ "$CI_MODE" = true ]; then
|
||||
CONCLUSION="{
|
||||
\"name\": \"文件体积\",
|
||||
\"conclusion\": \"success\",
|
||||
\"output\": {
|
||||
\"summary\": \"GOOD\"
|
||||
}
|
||||
}"
|
||||
output_conclusion "$CONCLUSION"
|
||||
fi
|
||||
fi
|
||||
16
.codebase/scripts/check-merge-target.sh
Normal file
16
.codebase/scripts/check-merge-target.sh
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
SOURCE_BRANCH=${SOURCE_BRANCH}
|
||||
TARGET_BRANCH=${targetBranch}
|
||||
|
||||
if [[ $TARGET_BRANCH == "master" && !($SOURCE_BRANCH =~ ^release/ || $SOURCE_BRANCH =~ ^hotfix/ || $SOURCE_BRANCH =~ ^task/ || $SOURCE_BRANCH =~ ^fix/) ]]; then
|
||||
# 检查$SOURCE_BRANCH是否以'release/'或'hotfix/'或'task/'或'fix/'开头
|
||||
LATEST_BRANCH="release/$(date -d '+8 hour' +%Y%m%d)"
|
||||
CONCLUSION="{\"name\": \"Target Branch\", \"conclusion\": \"failed\", \"output\":{\"summary\":\"Error: Please don't merge to master directly, use [$LATEST_BRANCH](https://code.byted.org/obric/bot-studio-monorepo/commits/$LATEST_BRANCH) instead.\n You can contact [@fanwenjie.fe](https://code.byted.org/fanwenjie.fe) to skip this error.\" }}"
|
||||
else
|
||||
CONCLUSION="{\"name\": \"Target Branch\", \"conclusion\": \"success\", \"output\":{\"summary\":\"Good Pratice\" }}"
|
||||
fi
|
||||
|
||||
echo $CONCLUSION >>check-merge-target.log
|
||||
echo "::update-check-run::check-merge-target.log"
|
||||
55
.codebase/scripts/check-mr-size.sh
Normal file
55
.codebase/scripts/check-mr-size.sh
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
# Your target branch
|
||||
TARGET_BRANCH=$targetBranch
|
||||
|
||||
if [[ ${SOURCE_BRANCH} =~ ^integration/ || ${SOURCE_BRANCH} =~ ^release/ ]]; then
|
||||
# integration -> xxx or release/xxx -> master SKIP check-mr-size.
|
||||
echo "::add-message level=info::SKIP check-mr-size"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Specify the pattern you want to exclude, using *space* as the separator
|
||||
EXCLUDE_PATTERNS=(
|
||||
'**/pnpm-lock.yaml'
|
||||
'packages/arch/bot-api/src/auto-generate/**'
|
||||
'apps/bot-op/src/services/bam-auto-generate/**'
|
||||
'apps/prompt-platform/src/services/auto-generate/**'
|
||||
"**/lib/**"
|
||||
"**/.*/**"
|
||||
'**/__tests__/**'
|
||||
'**/__test__/**'
|
||||
"**/__mocks__/**"
|
||||
"**/__mock__/**"
|
||||
"**/*.test.*/**"
|
||||
"**/*.spec.*/**"
|
||||
"**/__snapshots__/**"
|
||||
"**/*.snap"
|
||||
'**/*.svg'
|
||||
'ee/e2e/bot-studio/**'
|
||||
'common/changes/**'
|
||||
'apps/fornax/**'
|
||||
"apps/api-builder/**"
|
||||
"packages/api-builder/**"
|
||||
)
|
||||
|
||||
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
|
||||
EXCLUDE_STRING+=":(exclude)$pattern "
|
||||
done
|
||||
|
||||
# Count the number of files changed but exclude certain files and folders
|
||||
file_changes=$(git diff --name-only "origin/$TARGET_BRANCH..." $EXCLUDE_STRING | wc -l)
|
||||
|
||||
# Count the number of line changes but exclude certain files and folders
|
||||
line_changes=$(git diff --shortstat "origin/$TARGET_BRANCH..." $EXCLUDE_STRING | awk '{print ($4>$6)?$4:$6}')
|
||||
|
||||
# Check if number of changed files is greater than 100 or if number of line changes is greater than 2000
|
||||
if [ "$file_changes" -gt 100 ] || [ "$line_changes" -gt 2000 ]; then
|
||||
CONCLUSION="{\"name\": \"MR Size\", \"conclusion\": \"failed\", \"output\":{\"summary\":\"Error: Too many changes. Number of changed files is **""$file_changes""**, number of changed lines is **""$line_changes""**.\n You can contact [@fanwenjie.fe](https://code.byted.org/fanwenjie.fe) to skip this error.\" }}"
|
||||
else
|
||||
CONCLUSION="{\"name\": \"MR Size\", \"conclusion\": \"success\", \"output\":{\"summary\":\"Good\" }}"
|
||||
fi
|
||||
|
||||
echo $CONCLUSION >>check-mr-size.log
|
||||
echo "::update-check-run::check-mr-size.log"
|
||||
14
.codebase/scripts/check-pre-commits.sh
Normal file
14
.codebase/scripts/check-pre-commits.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
PRE_COMMITS=$1
|
||||
|
||||
# 按 codebase 给出的口径,pre commits 超过 5 时容易导致 rebase 失败,因此主动给出警告,避免进入 CQ 后被弹出
|
||||
if [ $PRE_COMMITS -gt 5 ]; then
|
||||
CONCLUSION="{\"name\": \"Pre Commits Check\", \"conclusion\": \"failed\", \"output\":{\"summary\":\"分支已落后目标分支较多,非常容易导致进入 CQ 后被弹出,请执行 rebase/merge 同步代码后重试。\" }}"
|
||||
else
|
||||
CONCLUSION="{\"name\": \"Pre Commits Check\", \"conclusion\": \"success\", \"output\":{\"summary\":\"good\" }}"
|
||||
fi
|
||||
|
||||
echo $CONCLUSION >> check-pre-commits.log
|
||||
echo "::update-check-run::check-pre-commits.log"
|
||||
54
.codebase/scripts/check-squash.sh
Normal file
54
.codebase/scripts/check-squash.sh
Normal file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
basename=$(basename "$CHANGE_URL")
|
||||
lastParam=$(echo "$basename" | cut -d'/' -f1)
|
||||
|
||||
targetBranch="${targetBranch}"
|
||||
sourceBranch="${SOURCE_BRANCH}"
|
||||
mrTitle="${MR_TITLE}"
|
||||
mrDescription="${MR_DESCRIPTION}"
|
||||
|
||||
echo "::set-output name=mrId::$lastParam" # 输出 lastParam 的值
|
||||
|
||||
result=$(curl --location "https://code.byted.org/api/v4/projects/548801/merge_requests/$lastParam" \
|
||||
--header "Private-Token: $GITLAB_TOKEN")
|
||||
|
||||
commits=$(curl --location "https://code.byted.org/api/v4/projects/548801/merge_requests/$lastParam/commits" \
|
||||
--header "Private-Token: $GITLAB_TOKEN")
|
||||
|
||||
isSquash=$(echo "$result" | jq -r '.squash') # 使用jq提取isSquash的值
|
||||
|
||||
commitsCount=$(echo "$commits" | jq length)
|
||||
|
||||
echo "::set-output name=squash::$isSquash" # 输出 isSquash 的值
|
||||
echo "::set-output name=commitsCount::$commitsCount" # 输出 commitsCount 的值
|
||||
|
||||
if [[ $isSquash == true ]]; then
|
||||
# 勾选squash
|
||||
|
||||
if [[ $sourceBranch == release/* && $targetBranch == master ]]; then
|
||||
echo "::add-message level=error::**release 分支合入 master 时,不可开启 squash **"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $mrDescription == \[no-squash\]* ]]; then
|
||||
echo "::add-message level=error::**当前 MR 勾选了 Squash 选项,但是描述中包含[no-squash]**"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
# 没有勾选squash
|
||||
|
||||
if [[ $mrDescription == \[no-squash\]* ||
|
||||
$commitsCount -le 1 ||
|
||||
$mrTitle == WIP:* ||
|
||||
$mrTitle == wip:* ||
|
||||
$sourceBranch == release/* ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "::add-message level=error::**当前 MR 应该勾选 Squash 选项**"
|
||||
exit 1
|
||||
|
||||
fi
|
||||
53
.codebase/scripts/checksum-by-change.js
Normal file
53
.codebase/scripts/checksum-by-change.js
Normal file
@@ -0,0 +1,53 @@
|
||||
const fs = require('fs/promises');
|
||||
const path = require('path');
|
||||
const crypto = require('crypto');
|
||||
|
||||
// node scripts/checksum-by-change.js /usr/changed-path.json
|
||||
// change-path 文件来自 ci
|
||||
const changedPath = process.argv[2];
|
||||
const readJson = async jsonFile => {
|
||||
const content = await fs.readFile(jsonFile, 'utf-8');
|
||||
let _val = null;
|
||||
try {
|
||||
eval(`_val = ${content}`);
|
||||
return _val;
|
||||
} catch (e) {
|
||||
console.error(`json parse failure: `, e);
|
||||
}
|
||||
};
|
||||
|
||||
const readChangedPackages = async changedPath => {
|
||||
const [changedFiles, { projects }] = await Promise.all([
|
||||
readJson(changedPath),
|
||||
readJson(path.resolve(__dirname, '../../rush.json')),
|
||||
]);
|
||||
const changedProjects = projects
|
||||
.filter(project => {
|
||||
const { projectFolder } = project;
|
||||
const endsWithSlash = projectFolder.endsWith('/');
|
||||
const compareFolder = `${projectFolder}${endsWithSlash ? '' : '/'}`;
|
||||
if (!changedFiles) {
|
||||
// changed-path.json 内容可能为null
|
||||
return true;
|
||||
}
|
||||
const matched = changedFiles.find(file => file.startsWith(compareFolder));
|
||||
return !!matched;
|
||||
})
|
||||
.map(({ packageName }) => packageName)
|
||||
.sort((r1, r2) => r1.localeCompare(r2));
|
||||
return changedProjects;
|
||||
};
|
||||
|
||||
async function main() {
|
||||
if (!changedPath || changedPath.length <= 0) {
|
||||
throw new Error(`Please pass the correct "changedPath" path`);
|
||||
}
|
||||
const changedPackages = await readChangedPackages(changedPath);
|
||||
|
||||
const hash = crypto.createHash('md5');
|
||||
changedPackages.forEach(r => hash.update(r));
|
||||
const hashValue = hash.digest('hex');
|
||||
console.log(`::set-output name=hash::${hashValue}`);
|
||||
}
|
||||
|
||||
main();
|
||||
26
.codebase/scripts/env.sh
Normal file
26
.codebase/scripts/env.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo ::set-env name=no_proxy::cn.goofy.app,.cn.goofy.app,goofy.app,.goofy.app,localhost,.byted.org,byted.org,.bytedance.net,bytedance.net,127.0.0.1,127.0.0.0/8,169.254.0.0/16,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16,10.0.0.0/8,::1,fe80::/10,fd00::/8
|
||||
echo ::set-env name=all_proxy::http://sys-proxy-rd-relay.byted.org:3128
|
||||
echo ::set-env name=http_proxy::http://sys-proxy-rd-relay.byted.org:3128
|
||||
echo ::set-env name=https_proxy::http://sys-proxy-rd-relay.byted.org:3128
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Setup common env for CI & SCM
|
||||
# 1. 忽略不影响构建的 install
|
||||
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=true
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
export TAIKO_SKIP_CHROMIUM_DOWNLOAD=0
|
||||
export CUSTOM_VERSION="inhouse"
|
||||
export RE2_DOWNLOAD_SKIP_PATH=1
|
||||
export RE2_DOWNLOAD_MIRROR="https://bnpm.bytedance.net/mirrors"
|
||||
export PUPPETEER_SKIP_DOWNLOAD=true
|
||||
|
||||
# 2. 在 CI 环境生效:
|
||||
echo ::set-env name=PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD::$PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD
|
||||
echo ::set-env name=CYPRESS_INSTALL_BINARY::$CYPRESS_INSTALL_BINARY
|
||||
echo ::set-env name=TAIKO_SKIP_CHROMIUM_DOWNLOAD::$TAIKO_SKIP_CHROMIUM_DOWNLOAD
|
||||
echo ::set-env name=RE2_DOWNLOAD_SKIP_PATH::$RE2_DOWNLOAD_SKIP_PATH
|
||||
echo ::set-env name=RE2_DOWNLOAD_MIRROR::$RE2_DOWNLOAD_MIRROR
|
||||
echo ::set-env name=PUPPETEER_SKIP_DOWNLOAD::$PUPPETEER_SKIP_DOWNLOAD
|
||||
Reference in New Issue
Block a user