From 32edd5fb3cdb3cc3b420bcf5d16829bfbc2d43ef Mon Sep 17 00:00:00 2001 From: zhaoyingbo <zhaoyingbo@xiaomi.com> Date: Fri, 22 Nov 2024 11:18:43 +0000 Subject: [PATCH] =?UTF-8?q?feat(base):=20=E4=BC=98=E5=8C=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=9F=BA=E7=A1=80=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- .env.prod | 1 - .gitea/workflows/cicd.yaml.template | 64 ++++++++++++------------- .gitlab-ci.yml | 38 +++++++++++++++ bun.lockb | Bin 131450 -> 137225 bytes db/prisma/index.ts | 5 ++ db/prisma/user/index.ts | 19 -------- Dockerfile => docker/deploy/Dockerfile | 0 eslint.config.js | 59 +++++++++++++---------- index.ts | 6 +++ package.json | 9 ++-- routes/event/index.ts | 7 +++ 12 files changed, 130 insertions(+), 82 deletions(-) delete mode 100644 .env.prod create mode 100644 .gitlab-ci.yml create mode 100644 db/prisma/index.ts delete mode 100644 db/prisma/user/index.ts rename Dockerfile => docker/deploy/Dockerfile (100%) create mode 100644 routes/event/index.ts diff --git a/.env b/.env index 85b3b8d..8f327ff 100644 --- a/.env +++ b/.env @@ -4,6 +4,8 @@ # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. # See the documentation for all the connection string options: https://pris.ly/d/connection-strings +# prod envrionment needs to be set to production NODE_ENV=dev -DATABASE_URL="mysql://root:rootpassword@localhost:3306/testdb" \ No newline at end of file + +# DATABASE_URL="mysql://root:rootpassword@localhost:3306/testdb" \ No newline at end of file diff --git a/.env.prod b/.env.prod deleted file mode 100644 index 995fca4..0000000 --- a/.env.prod +++ /dev/null @@ -1 +0,0 @@ -NODE_ENV=production \ No newline at end of file diff --git a/.gitea/workflows/cicd.yaml.template b/.gitea/workflows/cicd.yaml.template index 216ee74..badab36 100644 --- a/.gitea/workflows/cicd.yaml.template +++ b/.gitea/workflows/cicd.yaml.template @@ -1,5 +1,8 @@ -name: CI Monitor CI/CD -on: [push] +name: Egg Gitlab CR CI/CD +on: + push: + branches: + - master jobs: build-image: @@ -7,43 +10,29 @@ jobs: container: catthehacker/ubuntu:act-latest steps: - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: - registry: git.yingbo.im:333 - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} + registry: micr.cloud.mioffice.cn + username: ${{ secrets.MI_DOCKER_USERNAME }} + password: ${{ secrets.MI_DOCKER_PASSWORD }} - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: + file: ./docker/deploy/Dockerfile push: true - tags: git.yingbo.im:333/zhaoyingbo/ci_monitor:${{ github.sha }} + tags: ${{ env.DOCKER_IMAGE }}:${{ github.sha }} - deploy: - needs: build-image + refresh-image: runs-on: ubuntu-latest container: catthehacker/ubuntu:act-latest steps: - # 检出代码 - - name: Check out repository code - uses: actions/checkout@v3 - # 使用scp命令将docker-compose.yml文件上传到服务器 - - name: Upload docker-compose.yml to server - uses: appleboy/scp-action@master - with: - host: ${{ secrets.SERVER_HOST }} - username: ${{ secrets.SERVER_USERNAME }} - key: ${{ secrets.SERVER_KEY }} - port: ${{ secrets.SERVER_PORT }} - source: docker-compose.yml - target: /home/${{ secrets.SERVER_USERNAME }}/docker/ci_monitor - # 登录服务器,执行docker-compose命令 - - name: Login to the server and execute docker-compose command + - name: Login to the server and refresh the image uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} @@ -51,7 +40,18 @@ jobs: key: ${{ secrets.SERVER_KEY }} port: ${{ secrets.SERVER_PORT }} script: | - docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} git.yingbo.im:333 - cd /home/${{ secrets.SERVER_USERNAME }}/docker/ci_monitor - sed -i "s/sha/${{ github.sha }}/g" docker-compose.yml - docker compose up -d --force-recreate --no-deps ci_monitor + docker pull ${{ env.DOCKER_IMAGE }}:${{ github.sha }} + docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }} + docker rmi $(docker images | grep "${{ env.DOCKER_IMAGE }}" | grep -v "${{ github.sha }}" | awk '{print $3}') + + fast-deploy: + runs-on: ubuntu-latest + container: cr.d.xiaomi.net/bigdata-fe/matrix-cli + steps: + - name: Set matrix-cli config + run: matrix-cli config set --access-key ${{ secrets.MATRIX_AK }} --secret-key ${{ secrets.MATRIX_SK }} + - name: Use matrix-cli to deploy + run: matrix-cli deploy --project 462609 --deploy-space egg-gitlab-cr-prev --reason "${{ github.event.head_commit.message }}" --deploy-percentage 1 --tag ${{ github.sha }} + +env: + DOCKER_IMAGE: micr.cloud.mioffice.cn/egg/replace_me diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..a80ee06 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,38 @@ +variables: + REGISTRY: micr.cloud.mioffice.cn + IMAGE_NAME: micr.cloud.mioffice.cn/egg/replace_me + MATRIX_PROJECT: 462609 + MATRIX_SPACE: egg-gitlab-cr-prev + MATRIX_AK: CAKBCYGR0BI2BGMVUF8 + +stages: + - build + - deploy + +default: + tags: + - fe-bj + +build: + stage: build + only: + - master + image: docker:latest + services: + - docker:dind + script: + - cp $ENV .env + - docker login -u $MATRIX_AK -p $MATRIX_SK $REGISTRY + - docker build -t $IMAGE_NAME:$CI_COMMIT_SHA -f ./docker/deploy/Dockerfile . + - docker push $IMAGE_NAME:$CI_COMMIT_SHA + - docker logout $REGISTRY + - docker rmi $IMAGE_NAME:$CI_COMMIT_SHA + +deploy: + stage: deploy + only: + - master + image: cr.d.xiaomi.net/bigdata-fe/matrix-cli + script: + - matrix-cli config set --access-key $MATRIX_AK --secret-key $MATRIX_SK + - matrix-cli deploy --project $MATRIX_PROJECT --deploy-space $MATRIX_SPACE --reason "$CI_COMMIT_MESSAGE" --deploy-percentage 1 --tag $CI_COMMIT_SHA diff --git a/bun.lockb b/bun.lockb index 08d5c0e8bf49558cc732acd919c592c91943893c..810110674bed8146be646c7c639ad1fd15ed9188 100755 GIT binary patch delta 26799 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 delta 23219 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 F{{?lN`$Yf% diff --git a/db/prisma/index.ts b/db/prisma/index.ts new file mode 100644 index 0000000..fdc7831 --- /dev/null +++ b/db/prisma/index.ts @@ -0,0 +1,5 @@ +import { PrismaClient } from "@prisma/client" + +const prisma = new PrismaClient() + +export default prisma diff --git a/db/prisma/user/index.ts b/db/prisma/user/index.ts deleted file mode 100644 index 3b76fe4..0000000 --- a/db/prisma/user/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PrismaClient } from "@prisma/client" - -const prisma = new PrismaClient() - -const main = async () => { - const user = await prisma.user.create({ - data: { - name: "Alice", - email: "alice@example.com", - }, - }) - console.log(user) - const users = await prisma.user.findMany() - console.log(users) -} - -main().then(() => { - prisma.$disconnect() -}) diff --git a/Dockerfile b/docker/deploy/Dockerfile similarity index 100% rename from Dockerfile rename to docker/deploy/Dockerfile diff --git a/eslint.config.js b/eslint.config.js index 88e3a2b..7540c69 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,26 +1,35 @@ -export default { - languageOptions: { - ecmaVersion: 2021, - sourceType: "module", - }, - ignores: ["*.js", "*.cjs", "*.mjs", "/src/Backup/*"], - plugins: ["@typescript-eslint", "simple-import-sort"], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier", - ], - rules: { - "@typescript-eslint/no-explicit-any": "off", - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - }, - overrides: [ - { - files: ["**/*.ts", "**/*.tsx"], - languageOptions: { - parser: "@typescript-eslint/parser", - }, +import pluginJs from "@eslint/js" +import simpleImportSort from "eslint-plugin-simple-import-sort" +import unusedImports from "eslint-plugin-unused-imports" +import globals from "globals" +import tseslint from "typescript-eslint" + +export default [ + { files: ["**/*.{js,mjs,cjs,ts}"] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + plugins: { + "simple-import-sort": simpleImportSort, + "unused-imports": unusedImports, }, - ], -} + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "no-unused-vars": "off", // Turn off base rule + "unused-imports/no-unused-imports": "error", // Enable plugin rule + "unused-imports/no-unused-vars": [ + "warn", + { + vars: "all", + varsIgnorePattern: "^_", + args: "after-used", + argsIgnorePattern: "^_", + }, + ], + }, + }, +] diff --git a/index.ts b/index.ts index e900d7d..83f7f75 100644 --- a/index.ts +++ b/index.ts @@ -25,3 +25,9 @@ Bun.serve({ }, port: 3000, }) + +// // 关闭数据库连接 +// process.on("SIGINT", async () => { +// await prisma.$disconnect() +// process.exit(0) +// }) diff --git a/package.json b/package.json index 9681fc1..a22832f 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "module": "index.ts", "type": "module", "scripts": { - "start": "dotenvx run -f .env.prod -- bun run index.ts", - "dev": "dotenvx run -f .env -- bun run index.ts --watch", + "start": "bun run index.ts", + "dev": "bun run index.ts --watch", "lint": "oxlint --fix .", "prepare": "husky", "prettier": "prettier --write .", @@ -13,7 +13,6 @@ "lint-staged": { "*.{js,jsx,ts,tsx}": [ "oxlint --fix", - "eslint --fix", "prettier --write" ] }, @@ -28,10 +27,12 @@ "bun-types": "latest", "eslint": "^9.2.0", "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-unused-imports": "^4.1.4", "husky": "^9.1.6", "lint-staged": "^15.2.10", "oxlint": "^0.11.1", - "prettier": "^3.3.3" + "prettier": "^3.3.3", + "typescript-eslint": "^8.15.0" }, "peerDependencies": { "typescript": "^5.0.0" diff --git a/routes/event/index.ts b/routes/event/index.ts new file mode 100644 index 0000000..078d6f7 --- /dev/null +++ b/routes/event/index.ts @@ -0,0 +1,7 @@ +const templateFunc = () => {} + +const template = { + templateFunc, +} + +export default template