Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .browserslistrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Firefox >= 49
Chrome >= 54
7 changes: 7 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 100
5 changes: 5 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
VUE_APP_I18N_LOCALE=zh-CN
VUE_APP_I18N_FALLBACK_LOCALE=en-US
VUE_APP_ROUTER_BASE_PATH=/
VUE_APP_PUBLIC_BASE_PATH=/
VUE_APP_API_URL=
6 changes: 6 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.eslintrc.js
.stylelintrc.js
.lintstagedrc.js
dist
node_modules
public
138 changes: 138 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
const path = require('path');

const vuejsAccessibilityOff = Object.keys(
require(path.resolve(path.dirname(require.resolve('eslint-plugin-vuejs-accessibility')), '../dist/index')).rules,
).reduce((rules, rule) => {
rules[`vuejs-accessibility/${rule}`] = 0;

return rules;
}, {});

module.exports = {
root: true,
env: {
es6: true,
node: true,
jest: true,
browser: true,
},
parser: 'vue-eslint-parser',
parserOptions: {
ecmaVersion: 2020,
parser: '@typescript-eslint/parser',
sourceType: 'module',
extraFileExtensions: ['.vue'],
},
plugins: ['vue', '@typescript-eslint'],
extends: [
'plugin:jsonc/recommended-with-json',
'plugin:vue/vue3-recommended',
'@vue/airbnb',
'@vue/typescript/recommended',
],
rules: {
"jsonc/indent": ["error", 2],
'@typescript-eslint/padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: ['interface', 'type'],
next: '*',
},
],
'padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: ['const', 'let', 'var'],
next: '*',
},
{
blankLine: 'any',
prev: ['const', 'let', 'var'],
next: ['const', 'let', 'var'],
},
{
blankLine: 'always',
prev: '*',
next: 'return',
},
{
blankLine: 'always',
prev: '*',
next: 'function',
},
],
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
'eol-last': ['error', 'always'],
'comma-spacing': [
'error',
{
before: false,
after: true,
},
],
quotes: ['error', 'single'],
'jsx-quotes': ['error', 'prefer-double'],
'vue/html-quotes': ['error', 'double', { avoidEscape: true }],
'max-statements-per-line': ['error', { max: 1 }],
'vue/multiline-html-element-content-newline': ['error'], // 多行html中的内容是否独占一行
'vue/singleline-html-element-content-newline': ['error'],
'vue/max-attributes-per-line': [
'error',
{
singleline: {
max: 1,
},
multiline: {
max: 1,
},
},
],
'array-element-newline': ['error', 'consistent'],
'array-bracket-newline': ['error', 'consistent'], // []新一行
'vue/array-bracket-newline': ['error', 'consistent'],
'comma-dangle': ['error', 'always-multiline'], // 最后一个对象元素加逗号
'object-property-newline': ['error', { allowAllPropertiesOnSameLine: false }],
'vue/object-property-newline': ['error', { allowAllPropertiesOnSameLine: false }],
'vue/space-infix-ops': ['error', { int32Hint: true }],
// 'vue/space-infix-ops': 0,
// "template-curly-spacing": ["error", "never"],
'vue/object-curly-spacing': ['error', 'always'], // 对象内的间距要求
'vue/comma-spacing': ['error'], // 对象内的逗号位置
'vue/key-spacing': ['error'], // 冒号位置

'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'import/prefer-default-export': 0,
'import/no-extraneous-dependencies': 0,
'import/no-unresolved': 0,
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
mjs: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
'no-shadow': 'off',
'@typescript-eslint/no-shadow': 'error',
curly: 'error', // 强制if括号包裹,无效
...vuejsAccessibilityOff,
},
overrides: [
{
files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
env: {
jest: true,
},
},
{
files: ["*.json", "*.json5", "*.jsonc"],
parser: "jsonc-eslint-parser",
}
],
};
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist


# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
211 changes: 211 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
variables:
CI_BUILDER_VERSION: v0.1.74
I18N_CHECK_VERSION: latest
default:
image: docker.m.daocloud.io/node:16.13.2
tags:
- k8s
retry:
max: 2
before_script:
- set -ex
- cd $CI_PROJECT_DIR
- env
- echo "before_script"
- node -v
- npm -v
- npm ci

stages:
- test
- build
- cve-scan
- deploy
- e2e
- version
- i18n-check
- release
- post-merge-build

lint_test:
stage: test
script:
- make lint
rules:
- if: '$RELEASE'
when: never
- if: '$CI_COMMIT_TAG'
when: never
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'

unit_test:
stage: test
coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
script:
- make unit-test
artifacts:
when: always
reports:
junit:
- junit.xml
rules:
- if: '$RELEASE'
when: never
- if: '$CI_COMMIT_TAG'
when: never
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'

build_test:
stage: build
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
tags:
- docker
before_script:
- docker -v #override the global before_script
script:
- export REGISTRY_SERVER_ADDRESS=$DEV_REGISTRY_SERVER_ADDRESS
- make release
rules:
- if: '$RELEASE'
when: never
- if: '$CI_COMMIT_TAG'
when: never
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'

build_prod:
stage: build
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
tags:
- docker
before_script:
- docker -v #override the global before_script
script:
- export REGISTRY_SERVER_ADDRESS=$PROD_REGISTRY_SERVER_ADDRESS
- make release
rules:
- if: '$CI_COMMIT_TAG'

cve_scan:
stage: cve-scan
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
tags:
- docker
script:
- export REGISTRY_SERVER_ADDRESS=$DEV_REGISTRY_SERVER_ADDRESS
- make cve-scan
rules:
- if: '$RELEASE'
when: never
- if: '$CI_COMMIT_TAG'
when: never
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'
before_script:
- docker -v #override the global before_script
- docker run -d --network none --name trivy-container release-ci.daocloud.io/ghcr/aquasecurity/trivy sleep 1000
- docker cp trivy-container:/usr/local/bin/trivy /usr/local/bin/trivy #Install trivy
- docker rm -f trivy-container

deploy_to_dev:
stage: deploy
image:
name: release.daocloud.io/frontend-ci/kubectl:v1.13.9
entrypoint: [""]
before_script: []
script:
- export kubeconfig=$DEV_KUBECONF
- export REGISTRY_SERVER_ADDRESS=$DEV_REGISTRY_SERVER_ADDRESS
- make deploy
rules:
- if: '$RELEASE'
when: never
- if: '$CI_COMMIT_TAG'
when: never
- if: '$CI_COMMIT_BRANCH == "master"'

deploy_to_test:
stage: deploy
image:
name: release.daocloud.io/frontend-ci/kubectl:v1.13.9
entrypoint: [""]
allow_failure: true
before_script: []
script:
- export dev_kubeconfig=$DEV_KUBECONF
- export test_kubeconfig=$TEST_KUBECONF
- export REGISTRY_SERVER_ADDRESS=$DEV_REGISTRY_SERVER_ADDRESS
- make deploy-test
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

change_backend_version:
stage: version
before_script:
- set -ex
- cd $CI_PROJECT_DIR
- env
- echo "before_script"
- node -v
- npm -v
- npm i esno@0.16.3 fs-extra@10.1.0 semver@7.3.8
script:
- make change-version
rules:
- if: '$CI_COMMIT_TAG'

cherry_pick:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
stage: post-merge-build
before_script:
- apt-get install jq -y
script:
- bash ./scripts/cherry-pick.sh

minor_release:
stage: release
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
before_script:
- set -ex
- env
- npm i esno@0.16.3 fs-extra@10.1.0
- npm i -g conventional-changelog-cli @jsdevtools/version-bump-prompt
script:
- make minor-release
rules:
- if: '$CI_COMMIT_BRANCH == "master" && $RELEASE == "minor"'

patch_release:
stage: release
image:
name: release-ci.daocloud.io/common-ci/common-ci-builder:$CI_BUILDER_VERSION
before_script:
- set -ex
- env
- npm i esno@0.16.3 fs-extra@10.1.0
- npm i -g conventional-changelog-cli @jsdevtools/version-bump-prompt
script:
- make patch-release
rules:
- if: '$CI_COMMIT_BRANCH =~ /^release/ && $RELEASE == "patch"'

i18n-check:
stage: i18n-check
image: release-ci.daocloud.io/common-ci/i18n-check:$I18N_CHECK_VERSION
retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
- scheduler_failure
before_script:
- set -ex
script:
- i18nCheck
rules:
- if: '$RELEASE'
Loading