背景

公司TAP项目出售给不同厂家会用到不同的主题色和logo,如果是每次打包手动修改就太麻烦且容易出错,通过在发版时构建镜像打包时选择主题和logo可以极大的提升效率。

实现

1.修改jenkinsfile文件

添加THEME和LOGO的环境变量选项,logo分别添加了AIPAAS和MINERVA两个可选项,theme也同理

pipeline {
  agent any
  options {
    skipStagesAfterUnstable()
    buildDiscarder(logRotator(numToKeepStr: '2'))
    disableConcurrentBuilds()
  }

  parameters {
    choice(name: "DEPLOY_TO", choices: "Dev\nTest\nDemo\nProd", description: "Which environment to deploy")
    choice(name: "THEME", choices: "sys_tianyi\ndefault\nsys_green\nsys_orange\nsys_pink", description: "Which environment to theme")
    choice(name: "LOGO", choices: "AIPAAS\nMINERVA", description: "Which environment to logo")
  }

  environment {
    MODULE NAME = "aiminerva-minerva-console"
    SERVICE_NAME_TEST = "minerva-portal-test"
    SERVICE_NAME_DEMO = "minerva-portal-demo"
    SERVICE_NAME_PROD = "minerva-portal-prd"
    MAIL_TO = "zhangbingbing@trendytech.com.cn"
    HARBOR_PROJECT = "minervav2"
    K8S_NAMESPACE = "ai-minerva"
    KUBE_CONFIG = "config"
  }

  ......
}

2.添加打包脚本build.js

主要添加打包命令参数,将theme和logo添加到vite打包的环境中

  const execa = require('execa');
  const env = process.env;
  const THEME = env.THEME;
  const LOGO = env.LOGO;
  async function build(theme, Logo) {
    try {
      const { stdout } = await execa('node', [
        ' -- max_old_space_size=6144',
        './node_modules/vite/bin/vite.js',
        'build',
        '--',
        `--theme=${theme}`,
        `--logo=${Logo}`,
      ]);

      await execa('node', ['scripts/modify-favicon.js']);

      console.log('Build output:', stdout);
    } catch (error) {
      console.error('Build failed:', error);
    }
  }
  build(THEME, LOGO);

modify-favicon.js

修改网页favicon图标

  const fs = require('fs');
  const env = process.env.LOGO || 'MINERVA';

  const updateLink = (path) => {
    const html = fs.readFileSync(path, 'utf-8');
    const newHtml = html.replace(
      /<link rel="shortcut icon" href="[^"]*"/,
      `<link rel="shortcut icon" href="/${env}.ico"`
    );
    fs.writeFileSync(path, newHtml);
  };

  updateLink('dist/pages/console/index.html');
  updateLink('dist/pages/portal/index.html');

3.修改package.json的打包命令

"build": "node scripts/build.js",

4.修改vite配置

获取打包文件命令中的theme和logo参数在打包时添加到js的window对象上

  import { defineConfig, loadEnv } from 'vite';

  export default ({ mode, command }) => {
    const theme =
      process.argv.find((arg) => arg.startsWith('--theme='))?.split('=')[1] ||
      'sys_tianyi';
    const logo =
      process.argv.find((arg) => arg.startsWith('--logo='))?.split('=')[1] ||
      'AIPAAS';
    const env = loadEnv(mode, process.cwd());

    return defineConfig({
      define: {
        __THEME__: JSON.stringify(theme),
        __LOGO__: JSON.stringify(logo),
      },
    });
  };

5.修改主题色配置文件setting.config.js

只需要将theme变量的参数改为__THEME__

  const app = config.app;
  export default {
    app: {
      // eslint-disable-next-line no-undef
      theme: __THEME__,
      colorScheme: 'light',
      elementSize: 'default',
      defaultLang: 'zh-cn',
      enablePermission: true,
      enableProgress: true,
      enableDynamicTitle: false,
      storagePrefix: `${app}_`,
      enableWatermark: false,
      enableErrorLog: true,
      routeBaseOn: 'frontend',
    },
  };

6.修改logo的引用

<script>
  const logo = new URL(`../../../assets/images/${__LOGO__}_logo.png`, import.meta.url);
</script>

<template>
  <router-link
    :to="to"
    class="title"
    :class="{ 'is-link': settingsStore.dashboard.enable }"
    :title="title"
  >
    <img v-if="showLogo" :src="logo" class="logo" />
  </router-link>
</template>