<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DevOps与工具 on 码上生长 - 探索个人成长的无限可能</title>
    <link>https://dstweihao.cn/categories/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/</link>
    <description>Recent content in DevOps与工具 on 码上生长 - 探索个人成长的无限可能</description>
    <generator>Hugo -- 0.144.2</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 21 Aug 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://dstweihao.cn/categories/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>AgileTC测试用例管理平台的基本使用</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/agiletc%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/agiletc%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;h1 id=&#34;1-背景&#34;&gt;1. 背景&lt;/h1&gt;
&lt;p&gt;使用企业微信在线文档对测试用例进行管理，存在以下问题，比如新建版本，每次都要设置下执行测试用例那一栏，要提供通过、失败、阻塞等选项，操作异常繁琐，比如版本管理问题，多个版本之后，想要追溯老版本测试了哪些功能，很难进行筛选，比如测试用例越来越多，文档打开慢的问题等等。&lt;/p&gt;
&lt;h1 id=&#34;2-调研&#34;&gt;2. 调研&lt;/h1&gt;
&lt;p&gt;为了解决以上问题，调研了市面上的一些平台，发现有些平台功能过多，有些平台需要付费，现阶段，显然不太合适，然后发现了&lt;code&gt;AgileTC&lt;/code&gt;，它是一套敏捷的测试用例管理平台，以脑图方式编辑可快速上手，有以下几个优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可新建多个用例集，用例可以设置优先级；&lt;/li&gt;
&lt;li&gt;可基于用例集，创建执行测试任务，并且可跟进优先级筛选进行测试；&lt;/li&gt;
&lt;li&gt;版本管理问题，多个版本管理不会有问题，创建执行测试任务就是一个版本，比如&lt;code&gt;V1.0&lt;/code&gt;研发自测，就是一条执行测试任务；&lt;/li&gt;
&lt;li&gt;可搜索快速定位到要查看的功能模块，并且其他功能模块收起；&lt;/li&gt;
&lt;li&gt;可以设置前置条件、执行步骤、预期结果标签；&lt;/li&gt;
&lt;li&gt;左侧有菜单，可快速查看其他项目；&lt;/li&gt;
&lt;li&gt;离开当前页，可以自动保存；&lt;/li&gt;
&lt;li&gt;学习成本很低，而且是开源免费的；&lt;/li&gt;
&lt;li&gt;可以导出执行测试结果为&lt;code&gt;xmind&lt;/code&gt;文件，用于项目提测时，给到测试组。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基于以上原因，计划使用&lt;code&gt;AgileTC&lt;/code&gt;系统，在线管理各项目的测试用例。&lt;/p&gt;
&lt;h1 id=&#34;3-基本使用&#34;&gt;3. 基本使用&lt;/h1&gt;
&lt;h2 id=&#34;31-准备环境&#34;&gt;3.1 准备环境&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. mac/linux/windows
1. java 1.8
1. mysql 服务端
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;32-下载&#34;&gt;3.2 下载&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/didi/AgileTC.git
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;33-create-database-case_manager&#34;&gt;3.3 create database case_manager&lt;/h2&gt;
&lt;p&gt;使用命令 &lt;code&gt;create database case_manager&lt;/code&gt;在 MySQL Workbench 中创建依赖数据库。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504509.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;34-运行-case-serversql-脚本内容&#34;&gt;3.4 运行 case-server.sql 脚本内容&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拷贝 &lt;code&gt;./AgileTC/case-server/sql/case-server.sql&lt;/code&gt; 文件内容，在 MySQL Workbench 中运行。&lt;/li&gt;
&lt;li&gt;双击 &lt;code&gt;case_manager&lt;/code&gt; ，选中当前依赖数据库。&lt;/li&gt;
&lt;li&gt;点击闪电图标执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504879.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;35-修改-application-devproperties-文件&#34;&gt;3.5 修改 application-dev.properties 文件&lt;/h2&gt;
&lt;p&gt;修改 &lt;code&gt;./AgileTC/case-server/src/main/resources/application-dev.properties&lt;/code&gt; 文件，如下所示：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost:3306/case_manager?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=12345678
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;36-运行命令-mvn-spring-bootrun&#34;&gt;3.6 运行命令 mvn spring-boot:run&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在&lt;code&gt;case-server&lt;/code&gt;目录下执行命令&lt;code&gt;mvn spring-boot:run&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用浏览器打开 &lt;code&gt;http://localhost:8094/case/caseList/1&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504409.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="1-背景">1. 背景</h1>
<p>使用企业微信在线文档对测试用例进行管理，存在以下问题，比如新建版本，每次都要设置下执行测试用例那一栏，要提供通过、失败、阻塞等选项，操作异常繁琐，比如版本管理问题，多个版本之后，想要追溯老版本测试了哪些功能，很难进行筛选，比如测试用例越来越多，文档打开慢的问题等等。</p>
<h1 id="2-调研">2. 调研</h1>
<p>为了解决以上问题，调研了市面上的一些平台，发现有些平台功能过多，有些平台需要付费，现阶段，显然不太合适，然后发现了<code>AgileTC</code>，它是一套敏捷的测试用例管理平台，以脑图方式编辑可快速上手，有以下几个优势：</p>
<ol>
<li>可新建多个用例集，用例可以设置优先级；</li>
<li>可基于用例集，创建执行测试任务，并且可跟进优先级筛选进行测试；</li>
<li>版本管理问题，多个版本管理不会有问题，创建执行测试任务就是一个版本，比如<code>V1.0</code>研发自测，就是一条执行测试任务；</li>
<li>可搜索快速定位到要查看的功能模块，并且其他功能模块收起；</li>
<li>可以设置前置条件、执行步骤、预期结果标签；</li>
<li>左侧有菜单，可快速查看其他项目；</li>
<li>离开当前页，可以自动保存；</li>
<li>学习成本很低，而且是开源免费的；</li>
<li>可以导出执行测试结果为<code>xmind</code>文件，用于项目提测时，给到测试组。</li>
</ol>
<p>基于以上原因，计划使用<code>AgileTC</code>系统，在线管理各项目的测试用例。</p>
<h1 id="3-基本使用">3. 基本使用</h1>
<h2 id="31-准备环境">3.1 准备环境</h2>
<pre tabindex="0"><code>1. mac/linux/windows
1. java 1.8
1. mysql 服务端
</code></pre><h2 id="32-下载">3.2 下载</h2>
<pre tabindex="0"><code>git clone https://github.com/didi/AgileTC.git
</code></pre><h2 id="33-create-database-case_manager">3.3 create database case_manager</h2>
<p>使用命令 <code>create database case_manager</code>在 MySQL Workbench 中创建依赖数据库。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504509.png"></p>
<h2 id="34-运行-case-serversql-脚本内容">3.4 运行 case-server.sql 脚本内容</h2>
<ol>
<li>拷贝 <code>./AgileTC/case-server/sql/case-server.sql</code> 文件内容，在 MySQL Workbench 中运行。</li>
<li>双击 <code>case_manager</code> ，选中当前依赖数据库。</li>
<li>点击闪电图标执行。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504879.png"></p>
<h2 id="35-修改-application-devproperties-文件">3.5 修改 application-dev.properties 文件</h2>
<p>修改 <code>./AgileTC/case-server/src/main/resources/application-dev.properties</code> 文件，如下所示：</p>
<pre tabindex="0"><code>spring.datasource.url=jdbc:mysql://localhost:3306/case_manager?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=12345678
</code></pre><h2 id="36-运行命令-mvn-spring-bootrun">3.6 运行命令 mvn spring-boot:run</h2>
<ol>
<li>在<code>case-server</code>目录下执行命令<code>mvn spring-boot:run</code>。</li>
<li>使用浏览器打开 <code>http://localhost:8094/case/caseList/1</code>。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504409.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sentry的基本使用</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/sentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/sentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;h2 id=&#34;1-系统简介&#34;&gt;1. 系统简介&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。当前文档基于&lt;code&gt;Sentry 23.11.2&lt;/code&gt;进行说明。&lt;/p&gt;
&lt;h2 id=&#34;2-系统搭建&#34;&gt;2. 系统搭建&lt;/h2&gt;
&lt;p&gt;虽然&lt;code&gt;Sentry&lt;/code&gt;官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在&lt;code&gt;Github&lt;/code&gt;上有一个开源项目用于部署&lt;code&gt;Sentry&lt;/code&gt;，可以使用该项目进行部署：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/getsentry/onpremise.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为这个项目涉及很多后端的技术知识，&lt;code&gt;Sentry&lt;/code&gt;搭建最好是后端人员来做，然后部署到服务器上面去。&lt;/p&gt;
&lt;h2 id=&#34;3-创建项目&#34;&gt;3. 创建项目&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;搭建成功，部署到服务器，比如当前&lt;code&gt;Sentry&lt;/code&gt;在线系统为&lt;code&gt;https://123.11.22.133&lt;/code&gt;，使用账号&lt;code&gt;test001&lt;/code&gt;登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的&lt;code&gt;User settings&lt;/code&gt;里的&lt;code&gt;Language&lt;/code&gt;选项选择&lt;code&gt;Simplified Chinese&lt;/code&gt;即可，然后创建项目，其他平台同理，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051429752.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-vue3项目引入sentry&#34;&gt;4. Vue3项目引入Sentry&lt;/h2&gt;
&lt;p&gt;项目创建完成后，会跳转至 &lt;code&gt;Vue SDK&lt;/code&gt; 配置的说明文档，默认勾选三个监控模块，并且提供&lt;code&gt;Vue3&lt;/code&gt;和&lt;code&gt;Vue2&lt;/code&gt;版本的引入方式，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051456521.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;三个监控模块的简单功能说明，如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error Monitoring：&lt;/strong&gt; 自动报告项目错误和异常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Monitoring：&lt;/strong&gt; 通过性能监控，&lt;code&gt;Sentry&lt;/code&gt;跟踪你的软件性能，测量吞吐量和延迟等指标，并显示错误对多个系统的影响。&lt;code&gt;Sentry&lt;/code&gt;捕获由事务和&lt;code&gt;span&lt;/code&gt;组成的分布式跟踪，这些跟踪测量单个服务以及这些服务中的单个操作。在分布式跟踪中了解更多关于我们的模型的信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session Replay：&lt;/strong&gt; 会话重播通过像视频一样重现用户浏览器在错误发生前、发生中、发生后的情况，帮助你更快地找到错误或延迟问题的根本原因。受浏览器开发者工具的启发，你可以在一个组合的&lt;code&gt;UI&lt;/code&gt;中回放应用程序的&lt;code&gt;DOM&lt;/code&gt;状态，并查看关键的用户交互，如鼠标点击、滚动、网络请求和控制台条目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，我们需要依照文档进行配置，安装依赖&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;@sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;@sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，在&lt;code&gt;main.ts&lt;/code&gt;里引入&lt;code&gt;Sentry.init()&lt;/code&gt;，如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createApp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createRouter&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue-router&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createApp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createRouter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;dsn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://examplePublicKey@o0.ingest.sentry.io/0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;integrations&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;browserTracingIntegration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replayIntegration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set tracesSampleRate to 1.0 to capture 100%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// of transactions for tracing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// We recommend adjusting this value in production
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracesSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracePropagationTargets&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/^https:\/\/yourserver\.io\/api/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Capture Replay for 10% of all sessions,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// plus for 100% of sessions with an error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;replaysSessionSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;replaysOnErrorSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#app&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时，只要项目在本地运行或部署至线上，打开项目，然后打开浏览器控制台，查看&lt;code&gt;Network&lt;/code&gt;列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到&lt;code&gt;Sentry&lt;/code&gt;系统了，如下所示：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="1-系统简介">1. 系统简介</h2>
<p><code>Sentry</code>是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。当前文档基于<code>Sentry 23.11.2</code>进行说明。</p>
<h2 id="2-系统搭建">2. 系统搭建</h2>
<p>虽然<code>Sentry</code>官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在<code>Github</code>上有一个开源项目用于部署<code>Sentry</code>，可以使用该项目进行部署：</p>
<pre tabindex="0"><code>git clone https://github.com/getsentry/onpremise.git
</code></pre><p>因为这个项目涉及很多后端的技术知识，<code>Sentry</code>搭建最好是后端人员来做，然后部署到服务器上面去。</p>
<h2 id="3-创建项目">3. 创建项目</h2>
<p><code>Sentry</code>搭建成功，部署到服务器，比如当前<code>Sentry</code>在线系统为<code>https://123.11.22.133</code>，使用账号<code>test001</code>登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的<code>User settings</code>里的<code>Language</code>选项选择<code>Simplified Chinese</code>即可，然后创建项目，其他平台同理，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051429752.png"></p>
<h2 id="4-vue3项目引入sentry">4. Vue3项目引入Sentry</h2>
<p>项目创建完成后，会跳转至 <code>Vue SDK</code> 配置的说明文档，默认勾选三个监控模块，并且提供<code>Vue3</code>和<code>Vue2</code>版本的引入方式，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051456521.png"></p>
<p>三个监控模块的简单功能说明，如下所示：</p>
<ul>
<li><strong>Error Monitoring：</strong> 自动报告项目错误和异常。</li>
<li><strong>Performance Monitoring：</strong> 通过性能监控，<code>Sentry</code>跟踪你的软件性能，测量吞吐量和延迟等指标，并显示错误对多个系统的影响。<code>Sentry</code>捕获由事务和<code>span</code>组成的分布式跟踪，这些跟踪测量单个服务以及这些服务中的单个操作。在分布式跟踪中了解更多关于我们的模型的信息。</li>
<li><strong>Session Replay：</strong> 会话重播通过像视频一样重现用户浏览器在错误发生前、发生中、发生后的情况，帮助你更快地找到错误或延迟问题的根本原因。受浏览器开发者工具的启发，你可以在一个组合的<code>UI</code>中回放应用程序的<code>DOM</code>状态，并查看关键的用户交互，如鼠标点击、滚动、网络请求和控制台条目。</li>
</ul>
<p>首先，我们需要依照文档进行配置，安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">npm</span>
</span></span><span class="line"><span class="cl"><span class="nx">npm</span> <span class="nx">install</span> <span class="o">--</span><span class="nx">save</span> <span class="kd">@sentry</span><span class="o">/</span><span class="nx">vue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">yarn</span>
</span></span><span class="line"><span class="cl"><span class="nx">yarn</span> <span class="nx">add</span> <span class="kd">@sentry</span><span class="o">/</span><span class="nx">vue</span>
</span></span></code></pre></div><p>然后，在<code>main.ts</code>里引入<code>Sentry.init()</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createApp</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createRouter</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;vue-router&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="o">*</span> <span class="kr">as</span> <span class="nx">Sentry</span> <span class="kr">from</span> <span class="s2">&#34;@sentry/vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">createApp</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">createRouter</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span><span class="p">.</span><span class="nx">init</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">app</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">dsn</span><span class="o">:</span> <span class="s2">&#34;https://examplePublicKey@o0.ingest.sentry.io/0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">integrations</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Sentry</span><span class="p">.</span><span class="nx">browserTracingIntegration</span><span class="p">({</span> <span class="nx">router</span> <span class="p">}),</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Sentry</span><span class="p">.</span><span class="nx">replayIntegration</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set tracesSampleRate to 1.0 to capture 100%
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// of transactions for tracing.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// We recommend adjusting this value in production
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracesSampleRate</span>: <span class="kt">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracePropagationTargets</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="sr">/^https:\/\/yourserver\.io\/api/</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Capture Replay for 10% of all sessions,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// plus for 100% of sessions with an error
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">replaysSessionSampleRate</span>: <span class="kt">0.1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">replaysOnErrorSampleRate</span>: <span class="kt">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s2">&#34;#app&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>此时，只要项目在本地运行或部署至线上，打开项目，然后打开浏览器控制台，查看<code>Network</code>列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到<code>Sentry</code>系统了，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">/api/6/envelope/?sentry_key=485eee5b72d4758f53483e6ee56c43ed&amp;sentry_version=7&amp;sentry_client=sentry.javascript.vue%2F7.85.0</span>
</span></span></code></pre></div><h2 id="5-异常报错示例">5. 异常报错示例</h2>
<p>为了真实验证<code>Sentry</code>的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印<code>console</code>，<code>sentryTest</code>并未定义，所以会报错，代码如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vue" data-lang="vue"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">el-button</span> <span class="nt">@click</span><span class="s">=&#34;sentryClicked&#34;</span><span class="p">&gt;</span><span class="na">Sentry测试</span><span class="err">&lt;/</span><span class="na">el</span><span class="nt">-button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">setup</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;ts&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">defineComponent</span><span class="p">,</span> <span class="nx">ref</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;vue&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sentryClicked</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;sentryClicked: &#39;</span><span class="p">,</span> <span class="nx">sentryTest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051530416.png"></p>
<p>然后，我们到<code>Sentry</code>在线系统查看，确实有收到报错信息，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051533294.png"></p>
<p>里面指明了报错原因是 <code>sentryTest is not defined</code> ，然后还提交了用户的<code>IP</code>、浏览器版本以及版本号、平台系统等等信息，便于分析异常错误。还可以使用<code>Session Replay</code>重现用户浏览器在错误发生前、发生中、发生后的情况，如下所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051538755.png"></p>
<h2 id="6-上传sourcemap文件">6. 上传SourceMap文件</h2>
<p>通常<code>Sentry</code>在线系统上面的信息，也是可以排查解决<code>BUG</code>的，比如<code>sentryTest is not defined</code>，我们只需要在项目中搜索<code>sentryTest</code>就可以定位到代码报错的位置，但是如果是一些比较通用的，或者信息比较含糊的，是没办法精准定位代码位置的，这个时候，就可能有想法了，怎么让才能在<code>Sentry</code>在线系统看到，到底是执行到哪一步的时候，报错了呢？</p>
<p>这就是本节所需要实现功能，这就需要 <code>SourceMap</code> 文件，什么是 <code>SourceMap</code> 文件呢？</p>
<p>因为使用<code>Vite</code>打包之后，所有代码都压缩在一起，很难从中定位到异常代码的位置，<code>Sentry</code>通过<code>.map</code>文件中的映射关系将编译后的代码行映射回源代码行，从而提供准确的错误定位信息。可以帮助开发人员更轻松地理解和修复生产环境中的错误。</p>
<p>首先，需要在<code>Vue3</code>项目的 <code>vite.config.ts</code> 里进行设置，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">defineConfig</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">build</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sourcemap</span>: <span class="kt">true</span><span class="p">,</span> <span class="c1">// Source map generation must be turned on
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span></code></pre></div><p>然后运行 <code>npm run build</code> 命令，在生成的 <code>dist/assets/</code>里就会发现后缀为<code>.map</code>的文件，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051551198.png"></p>
<p>然后我们需要把<code>.map</code>文件上传到 <code>Sentry</code> 在线系统。</p>
<h3 id="61-通过sentry-wizard自动上传至sentry推荐">6.1 通过sentry-wizard自动上传至Sentry【推荐】</h3>
<p>在官方提供的<code> Configure Vue SDK</code>页面中已经推荐使用<code>sentry-wizard</code>来自动上传<code>SourceMap</code>至<code>Sentry</code>，具体实现步骤如下所示：</p>
<ol>
<li>
<p>安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">npx</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">wizard</span><span class="err">@</span><span class="nx">latest</span> <span class="o">-</span><span class="nx">i</span> <span class="nx">sourcemaps</span>
</span></span></code></pre></div></li>
<li>
<p>会在终端生成很多提示，提示信息都很清晰，依次选择即可，分别有：</p>
<ol>
<li>Do you want to continue anyway? <code>(Yes)</code></li>
<li>Are you using Sentry SaaS or self-hosted Sentry? <code>(Self-hosted/on-premise/single-tenant)</code></li>
<li>Please enter the URL of your self-hosted Sentry instance.  <code>(https://123.11.22.133)</code></li>
<li>Do you already have a Sentry account?  <code>(Yes)</code></li>
<li>Select your Sentry project.  <code>(test)</code></li>
<li>Which framework, bundler or build tool are you using? <code>（Vite）</code></li>
<li>The @sentry/vite-plugin package is already installed.  <code>(Yes)</code></li>
<li>Updated @sentry/vite-plugin with NPM.</li>
<li>Added the Sentry Vite plugin to vite.config.ts and enabled.</li>
<li>Added auth token to .env.sentry-build-plugin</li>
<li>Added .env.sentry-build-plugin to .gitignore.</li>
<li>Are you using a CI/CD tool to build and deploy your application?  <code>(No)</code></li>
</ol>
</li>
<li>
<p>然后我们会看到<code>vite.config.ts</code>里<code>@sentry/vite-plugin</code>插件的配置，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">sentryVitePlugin</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;@sentry/vite-plugin&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">defineConfig</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sentryVitePlugin</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">org</span><span class="o">:</span> <span class="s2">&#34;sentry&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">project</span><span class="o">:</span> <span class="s2">&#34;project-template-vue&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">url</span><span class="o">:</span> <span class="s2">&#34;https://123.11.22.133&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">})],</span>
</span></span></code></pre></div><p>此时需注意，因在设置<code>self-hosted Sentry</code>时，输入的是<code>https://123.11.22.133</code>，但是<code>sentry-wizard</code>自动在<code>vite.config.ts</code>中生成填写的url值为<code>https://123.11.22.133/</code>，需要去掉<code>/</code>，避免运行<code>npm run build</code>时报错：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">error</span><span class="o">:</span> <span class="nx">Two</span> <span class="nx">different</span> <span class="nx">url</span> <span class="nx">values</span> <span class="nx">supplied</span><span class="o">:</span> <span class="sb">`https://123.11.22.133`</span> <span class="p">(</span><span class="nx">from</span> <span class="nx">token</span><span class="p">),</span> <span class="sb">`https://123.11.22.133/`</span><span class="p">.</span>
</span></span></code></pre></div></li>
<li>
<p>在源码目录下，还自动生成了文件<code>.env.sentry-build-plugin</code>，并且<code>.gitignore.</code>里进行忽略。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051652090.png"></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051656775.png"></p>
</li>
<li>
<p>运行<code>npm run build</code>打包上传，如下所示，当上传<code>SourceMap</code>完成之后，会有相应详细的信息进行说明。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051712511.png"></p>
</li>
<li>
<p>通过在<code>Sentry</code>上面查看项目的<code>SourceMap</code>页面，查看<code>Releases</code>的值为<code>a8b55844dbd5417cefcc00231df0b7df59fec973</code>，来确定本次上传的版本，如下图所示，已经上次成功。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051720507.png"></p>
</li>
<li>
<p>验证 <code>sentryTest is not defined</code>异常报错示例，我们可以看到在异常详情页，会直接定位到源码报错的位置，如下所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051900928.png"></p>
</li>
</ol>
<h3 id="62-通过sentry-cli上传至sentry">6.2 通过Sentry Cli上传至Sentry</h3>
<p>登录<code>Sentry</code>在线系统，以<code>mac</code>环境为例，在终端输入如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">mac</span>
</span></span><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">windows</span><span class="p">,</span> <span class="nx">在</span> <span class="nx">node_modules</span> <span class="nx">里找到</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span><span class="p">.</span><span class="nx">exe</span><span class="err">，</span><span class="nx">右键Copy</span> <span class="nx">Path</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="o">~</span><span class="err">\</span><span class="nx">node_modules</span><span class="err">\@</span><span class="nx">sentry</span><span class="err">\</span><span class="nx">cli</span><span class="o">-</span><span class="nx">win32</span><span class="o">-</span><span class="nx">x64</span><span class="err">\</span><span class="nx">bin</span><span class="err">\</span><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span><span class="p">.</span><span class="nx">exe</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">https</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span></code></pre></div><p>然后会提示输入<code>token</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">This</span> <span class="nx">helps</span> <span class="nx">you</span> <span class="nx">signing</span> <span class="k">in</span> <span class="nx">your</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="kd">with</span> <span class="nx">an</span> <span class="nx">authentication</span> <span class="nx">token</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="nx">If</span> <span class="nx">you</span> <span class="k">do</span> <span class="nx">not</span> <span class="nx">yet</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">ready</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">bring</span> <span class="nx">up</span> <span class="nx">a</span> <span class="nx">browser</span> <span class="k">for</span> <span class="nx">you</span>
</span></span><span class="line"><span class="cl"><span class="nx">to</span> <span class="nx">create</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">now</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span> <span class="nx">server</span><span class="o">:</span> <span class="mf">123.11</span><span class="p">.</span><span class="mf">22.133</span>
</span></span><span class="line"><span class="cl"><span class="nx">Open</span> <span class="nx">browser</span> <span class="nx">now</span><span class="o">?</span> <span class="p">[</span><span class="nx">y</span><span class="o">/</span><span class="nx">n</span><span class="p">]</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> 
</span></span></code></pre></div><p><code>token</code>是在<code>Sentry</code>在线系统生成的，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051934070.png"></p>
<p>这时，只要复制<code>token</code>到终端，就可以完成登录流程了，如下所示，就是成功登录了<code>Sentry</code>在线系统：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> <span class="mf">104e37</span><span class="nx">d1d6b8ac962205719ef8380981ecbaaf587c166566c7df20372d0d72de</span>
</span></span><span class="line"><span class="cl"><span class="nx">Valid</span> <span class="nx">token</span> <span class="k">for</span> <span class="nx">user</span> <span class="nx">test001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Stored</span> <span class="nx">token</span> <span class="k">in</span> <span class="err">/Users/weihao/.sentryclirc</span>
</span></span><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div><ol>
<li>
<p>上传<code>SourceMap</code>到<code>Sentry</code>在线系统，登录成功之后，就需要将SourceMap文件上传到<code>Sentry</code>在线系统，首先，需要在项目里新建一个<code>.sentryclirc</code>文件，里面的内容，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">defaults</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">url</span><span class="o">=</span><span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">org</span><span class="o">=</span><span class="nx">sentry</span>
</span></span><span class="line"><span class="cl"><span class="nx">project</span><span class="o">=</span><span class="nx">test</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">auth</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">token</span><span class="o">=</span><span class="mf">104e37</span><span class="nx">d1d6b8ac962205719ef8380981ecbaaf587c166566c7df20372d0d72de</span>
</span></span></code></pre></div><p>然后使用以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">sentry</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="nx">test</span><span class="err">@</span><span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/assets/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span>
</span></span></code></pre></div><p>这里需要对该命令一些参数说明一下：</p>
<p><code>sentry</code>：组织名</p>
<p><code>test</code>：项目名</p>
<p><code>1.0.0</code>：版本号，需和main.ts里的<code>release: 'test@1.0.0'</code>一致。</p>
<p><code>./dist/assets/</code>：项目打包生成的<code>dist</code>里<code>.map</code>文件所在目录</p>
<p><code>~/test/js</code>：如果部署在服务器上面，不是部署在主目录，而是在<code>test</code>文件夹下面，那就需要加上</p>
<p>在终端显示如下，就表示已经上传成功：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Found</span> <span class="mi">2</span> <span class="nx">release</span> <span class="nx">files</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="mi">2</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.47</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.534</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Adding</span> <span class="nx">source</span> <span class="nx">map</span> <span class="nx">references</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">files</span> <span class="k">for</span> <span class="nx">upload</span><span class="p">...</span> <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js.map</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.855</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Optimizing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.017</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploading</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">12.873</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploaded</span> <span class="nx">release</span> <span class="nx">files</span> <span class="nx">to</span> <span class="nx">Sentry</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Processing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.129</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">File</span> <span class="nx">upload</span> <span class="nx">complete</span> <span class="p">(</span><span class="nx">processing</span> <span class="nx">pending</span> <span class="nx">on</span> <span class="nx">server</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Source</span> <span class="nx">Map</span> <span class="nx">Upload</span> <span class="nx">Report</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Minified</span> <span class="nx">Scripts</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js (sourcemap at index-o3HPk7Oz.js.map)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Source</span> <span class="nx">Maps</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js.map</span>
</span></span></code></pre></div><p>此时，我们可以在<code>Sentry</code>在线系统上面查看到上传的<code>sourcemap</code>文件，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051953880.png"></p>
</li>
</ol>
<h2 id="7-其他">7. 其他</h2>
<ol>
<li>中英文切换：设置 —  账户 —  详细信息 —  账户详情 — 语言 — Simplified Chinese</li>
<li>时区设置：设置 —  账户 —  详细信息 —  账户详情 —  时区 —  Shanghai</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>解决SonarQube中Vue项目中deep选择器报错的问题</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E8%A7%A3%E5%86%B3sonarqube%E4%B8%ADvue%E9%A1%B9%E7%9B%AE%E4%B8%ADdeep%E9%80%89%E6%8B%A9%E5%99%A8%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/</link>
      <pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E8%A7%A3%E5%86%B3sonarqube%E4%B8%ADvue%E9%A1%B9%E7%9B%AE%E4%B8%ADdeep%E9%80%89%E6%8B%A9%E5%99%A8%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;h1 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h1&gt;
&lt;p&gt;当使用SonarQube对Vue项目进行代码质量审查时，可能会遭遇因Vue特有的&lt;code&gt;deep&lt;/code&gt;选择器（旨在实现样式深度穿透）而触发的错误或警告。由于SonarQube默认并不识别这一Vue特有的语法，这些错误报告可能会成为审查过程中的干扰项。为了优化审查体验，并专注于更实际的代码质量问题，我们可以通过自定义SonarQube的质量配置文件来忽略这些针对&lt;code&gt;deep&lt;/code&gt;选择器的错误。&lt;/p&gt;
&lt;p&gt;以下是具体的操作步骤，基于SonarQube的通用界面和&lt;a href=&#34;https://community.sonarsource.com/t/how-to-include-a-pseudo-class-selector-in-sonar-rules-deep-vue/79689&#34;&gt;《How to include a pseudo class selector in Sonar rules (deep - Vue)》&lt;/a&gt;社区讨论中的指导。&lt;/p&gt;
&lt;h1 id=&#34;2-创建自定义css质量配置文件&#34;&gt;2. 创建自定义CSS质量配置文件&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;登录到SonarQube的Web界面。&lt;/li&gt;
&lt;li&gt;导航到&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面。&lt;/li&gt;
&lt;li&gt;点击页面上的&lt;strong&gt;Create&lt;/strong&gt;按钮，选择&lt;strong&gt;Copy an existing quality profile&lt;/strong&gt;作为创建方式。&lt;/li&gt;
&lt;li&gt;在弹出的对话框中，设置以下选项：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;：选择&lt;code&gt;CSS&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile to copy&lt;/strong&gt;：选择&lt;code&gt;Sonar Way&lt;/code&gt;作为基础配置文件，因为它包含了SonarQube推荐的CSS最佳实践。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;：输入自定义配置文件的名称，例如&lt;code&gt;CustomVueCSS&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;Create&lt;/strong&gt;完成配置文件的创建。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655180.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3-设置自定义配置文件为默认&#34;&gt;3. 设置自定义配置文件为默认&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;回到&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面，在CSS语言下，你应该能看到刚才创建的&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件。&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件旁的&lt;strong&gt;Actions&lt;/strong&gt;列中，点击&lt;strong&gt;Set as Default&lt;/strong&gt;按钮，将其设置为默认的质量配置文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655441.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4-修改配置文件以忽略deep选择器&#34;&gt;4. 修改配置文件以忽略deep选择器&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面，找到并点击刚设置为默认的&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件名称，进入配置文件的详细设置页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在该页面中，找到并定位到&lt;strong&gt;Pseudo-class selectors should be valid&lt;/strong&gt;这条规则。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655374.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击这条规则，定位到&lt;strong&gt;Quality Profiles&lt;/strong&gt;，点击&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件名称右侧的&lt;strong&gt;Change&lt;/strong&gt;按钮，进入规则的详细配置界面。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655488.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;ignorePseudoClasses&lt;/strong&gt;字段中，添加&lt;code&gt;deep&lt;/code&gt;作为要忽略的伪类选择器。这样，SonarQube在检查CSS代码时将不再报告&lt;code&gt;deep&lt;/code&gt;选择器为无效或错误。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655343.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击&lt;strong&gt;Save&lt;/strong&gt;按钮保存更改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<h1 id="1-前言">1. 前言</h1>
<p>当使用SonarQube对Vue项目进行代码质量审查时，可能会遭遇因Vue特有的<code>deep</code>选择器（旨在实现样式深度穿透）而触发的错误或警告。由于SonarQube默认并不识别这一Vue特有的语法，这些错误报告可能会成为审查过程中的干扰项。为了优化审查体验，并专注于更实际的代码质量问题，我们可以通过自定义SonarQube的质量配置文件来忽略这些针对<code>deep</code>选择器的错误。</p>
<p>以下是具体的操作步骤，基于SonarQube的通用界面和<a href="https://community.sonarsource.com/t/how-to-include-a-pseudo-class-selector-in-sonar-rules-deep-vue/79689">《How to include a pseudo class selector in Sonar rules (deep - Vue)》</a>社区讨论中的指导。</p>
<h1 id="2-创建自定义css质量配置文件">2. 创建自定义CSS质量配置文件</h1>
<ol>
<li>登录到SonarQube的Web界面。</li>
<li>导航到<strong>Quality Profiles</strong>页面。</li>
<li>点击页面上的<strong>Create</strong>按钮，选择<strong>Copy an existing quality profile</strong>作为创建方式。</li>
<li>在弹出的对话框中，设置以下选项：
<ul>
<li><strong>Language</strong>：选择<code>CSS</code>。</li>
<li><strong>Profile to copy</strong>：选择<code>Sonar Way</code>作为基础配置文件，因为它包含了SonarQube推荐的CSS最佳实践。</li>
<li><strong>Name</strong>：输入自定义配置文件的名称，例如<code>CustomVueCSS</code>。</li>
</ul>
</li>
<li>点击<strong>Create</strong>完成配置文件的创建。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655180.png"></p>
<h1 id="3-设置自定义配置文件为默认">3. 设置自定义配置文件为默认</h1>
<ol>
<li>回到<strong>Quality Profiles</strong>页面，在CSS语言下，你应该能看到刚才创建的<code>CustomVueCSS</code>配置文件。</li>
<li>在<code>CustomVueCSS</code>配置文件旁的<strong>Actions</strong>列中，点击<strong>Set as Default</strong>按钮，将其设置为默认的质量配置文件。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655441.png"></p>
<h1 id="4-修改配置文件以忽略deep选择器">4. 修改配置文件以忽略deep选择器</h1>
<ol>
<li>
<p>在<strong>Quality Profiles</strong>页面，找到并点击刚设置为默认的<code>CustomVueCSS</code>配置文件名称，进入配置文件的详细设置页面。</p>
</li>
<li>
<p>在该页面中，找到并定位到<strong>Pseudo-class selectors should be valid</strong>这条规则。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655374.png"></p>
</li>
<li>
<p>点击这条规则，定位到<strong>Quality Profiles</strong>，点击<code>CustomVueCSS</code>配置文件名称右侧的<strong>Change</strong>按钮，进入规则的详细配置界面。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655488.png"></p>
</li>
<li>
<p>在<strong>ignorePseudoClasses</strong>字段中，添加<code>deep</code>作为要忽略的伪类选择器。这样，SonarQube在检查CSS代码时将不再报告<code>deep</code>选择器为无效或错误。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655343.png"></p>
</li>
<li>
<p>点击<strong>Save</strong>按钮保存更改。</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>前端异常监控系统Sentry的基本使用（2021）</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9Fsentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A82021/</link>
      <pubDate>Thu, 09 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9Fsentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A82021/</guid>
      <description>&lt;h3 id=&#34;一系统简介&#34;&gt;一、系统简介&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。&lt;/p&gt;
&lt;h3 id=&#34;二系统搭建&#34;&gt;二、系统搭建&lt;/h3&gt;
&lt;p&gt;虽然&lt;code&gt;Sentry&lt;/code&gt;官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在&lt;code&gt;Github&lt;/code&gt;上有一个开源项目用于部署&lt;code&gt;Sentry&lt;/code&gt;，可以使用该项目进行部署：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/getsentry/onpremise.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为这个项目涉及很多后端的技术知识，&lt;code&gt;Sentry&lt;/code&gt;搭建最好是后端人员来做，然后部署到服务器上面去。&lt;/p&gt;
&lt;h3 id=&#34;三创建项目&#34;&gt;三、创建项目&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;搭建成功，部署到服务器，比如当前&lt;code&gt;Sentry&lt;/code&gt;在线系统为&lt;code&gt;https://123.11.22.133:211&lt;/code&gt;，使用账号&lt;code&gt;test001&lt;/code&gt;登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的&lt;code&gt;User settings&lt;/code&gt;里的&lt;code&gt;Language&lt;/code&gt;选项选择&lt;code&gt;Simplified Chinese&lt;/code&gt;即可，然后创建项目，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1&#34; loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;四vue项目引入sentry&#34;&gt;四、Vue项目引入Sentry&lt;/h3&gt;
&lt;p&gt;项目创建完成后，会跳转至&lt;code&gt;Vue&lt;/code&gt;配置的说明文档，主要是&lt;code&gt;Vue&lt;/code&gt;项目如何引入&lt;code&gt;Sentry&lt;/code&gt;的一些内容，内容如下所示：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tracing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tracing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;main.js&lt;/code&gt;里引入&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Integrations&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/tracing&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;dsn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://cd7f733c2e1e4641bdeb11ba0811d9aa@123.11.22.133:211/12&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;integrations&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Integrations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;BrowserTracing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set tracesSampleRate to 1.0 to capture 100%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// of transactions for performance monitoring.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// We recommend adjusting this value in production
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracesSampleRate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 上报console异常信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;logErrors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此时，只要项目正常部署在线上，打开项目，然后打开浏览器控制台，查看&lt;code&gt;Network&lt;/code&gt;列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到Sentry系统了，如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cd7f733c2e1e4641bdeb11ba0811d9aa&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry_version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;五异常报错示例&#34;&gt;五、异常报错示例&lt;/h3&gt;
&lt;p&gt;为了真实验证&lt;code&gt;Sentry&lt;/code&gt;的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印&lt;code&gt;console&lt;/code&gt;，&lt;code&gt;sentryTest&lt;/code&gt;并未定义，所以会报错，代码如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;el&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sentryClicked&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Sentry测试&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/el-button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/template&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;methods&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;sentryClicked&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;sentryClicked: &amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sentryTest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h3 id="一系统简介">一、系统简介</h3>
<p><code>Sentry</code>是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。</p>
<h3 id="二系统搭建">二、系统搭建</h3>
<p>虽然<code>Sentry</code>官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在<code>Github</code>上有一个开源项目用于部署<code>Sentry</code>，可以使用该项目进行部署：</p>
<pre tabindex="0"><code>git clone https://github.com/getsentry/onpremise.git
</code></pre><p>因为这个项目涉及很多后端的技术知识，<code>Sentry</code>搭建最好是后端人员来做，然后部署到服务器上面去。</p>
<h3 id="三创建项目">三、创建项目</h3>
<p><code>Sentry</code>搭建成功，部署到服务器，比如当前<code>Sentry</code>在线系统为<code>https://123.11.22.133:211</code>，使用账号<code>test001</code>登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的<code>User settings</code>里的<code>Language</code>选项选择<code>Simplified Chinese</code>即可，然后创建项目，如下图所示：</p>
<p><img alt="1" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/1.png"></p>
<h3 id="四vue项目引入sentry">四、Vue项目引入Sentry</h3>
<p>项目创建完成后，会跳转至<code>Vue</code>配置的说明文档，主要是<code>Vue</code>项目如何引入<code>Sentry</code>的一些内容，内容如下所示：</p>
<ol>
<li>
<p>安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">yarn</span>
</span></span><span class="line"><span class="cl"><span class="nx">yarn</span> <span class="nx">add</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">vue</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">tracing</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">npm</span>
</span></span><span class="line"><span class="cl"><span class="nx">npm</span> <span class="nx">install</span> <span class="o">--</span><span class="nx">save</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">vue</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">tracing</span>
</span></span></code></pre></div></li>
<li>
<p>在<code>main.js</code>里引入</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Vue</span> <span class="nx">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="o">*</span> <span class="nx">as</span> <span class="nx">Sentry</span> <span class="nx">from</span> <span class="s2">&#34;@sentry/vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Integrations</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@sentry/tracing&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span><span class="p">.</span><span class="nx">init</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Vue</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">dsn</span><span class="o">:</span> <span class="s2">&#34;http://cd7f733c2e1e4641bdeb11ba0811d9aa@123.11.22.133:211/12&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">integrations</span><span class="o">:</span> <span class="p">[</span><span class="k">new</span> <span class="nx">Integrations</span><span class="p">.</span><span class="nx">BrowserTracing</span><span class="p">()],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set tracesSampleRate to 1.0 to capture 100%
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// of transactions for performance monitoring.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// We recommend adjusting this value in production
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracesSampleRate</span><span class="o">:</span> <span class="mf">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// 上报console异常信息
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">logErrors</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div></li>
</ol>
<p>此时，只要项目正常部署在线上，打开项目，然后打开浏览器控制台，查看<code>Network</code>列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到Sentry系统了，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">?</span><span class="nx">sentry_key</span><span class="o">=</span><span class="nx">cd7f733c2e1e4641bdeb11ba0811d9aa</span><span class="o">&amp;</span><span class="nx">sentry_version</span><span class="o">=</span><span class="mi">7</span>
</span></span></code></pre></div><h3 id="五异常报错示例">五、异常报错示例</h3>
<p>为了真实验证<code>Sentry</code>的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印<code>console</code>，<code>sentryTest</code>并未定义，所以会报错，代码如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">template</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">el</span><span class="o">-</span><span class="nx">button</span> <span class="err">@</span><span class="nx">click</span><span class="o">=</span><span class="s2">&#34;sentryClicked&#34;</span><span class="o">&gt;</span><span class="nx">Sentry测试</span><span class="o">&lt;</span><span class="err">/el-button&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/template&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">methods</span><span class="o">:</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sentryClicked</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;sentryClicked: &#39;</span><span class="p">,</span> <span class="nx">sentryTest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></span></code></pre></div><p>在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：</p>
<p><img alt="2" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/2.png"></p>
<p>然后，我们到<code>Sentry</code>在线系统查看，确实有收到报错信息，如下图所示：</p>
<p><img alt="3" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/3.png"></p>
<p>里面指明了报错原因是<code>sentryTest is not defined</code>，然后还提交了用户的<code>IP</code>、浏览器版本以及版本号、平台系统等等信息，便于分析异常错误。</p>
<h3 id="六上传sourcemap文件">六、上传SourceMap文件</h3>
<p>通常<code>Sentry</code>在线系统上面的信息，也是可以排查解决<code>BUG</code>的，比如<code>sentryTest is not defined</code>，我们只需要在项目中搜索<code>sentryTest</code>就可以定位到代码报错的位置，但是如果是一些比较通用的，或者信息比较含糊的，是没办法精准定位代码位置的，这个时候，就可能有想法了，怎么让才能在<code>Sentry</code>在线系统看到，到底是执行到哪一步的时候，报错了呢？</p>
<p>这就是本节所需要实现功能，这就需要<code>SourceMap</code>文件，什么是<code>SourceMap</code>文件呢？</p>
<p>因为使用<code>webpack</code>打包之后，所有代码都压缩在一起，很难从中定位到异常代码的位置，而<code>SourceMap</code>就是源码，有了它，就可以定位到具体位置，所以需要提供<code>SourceMap</code>文件到<code>Sentry</code>在线系统。</p>
<p>首先，需要将<code>vue</code>项目下<code>config/index.js</code>里的<code>productionSourceMap</code>设置为<code>true</code>，然后运行<code>npm run build</code>命令，在生成的<code>dist/static/js</code>里就会发现很多后缀为<code>.map</code>的文件，如下图所示：</p>
<p><img alt="4" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/4.png"></p>
<p>然后我们需要把<code>.map</code>文件上传到<code>Sentry</code>在线系统，具体步骤如下：</p>
<ol>
<li>
<p>登录<code>Sentry</code>在线系统，在终端输入如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span></code></pre></div><p>然后会提示输入<code>token</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">This</span> <span class="nx">helps</span> <span class="nx">you</span> <span class="nx">signing</span> <span class="k">in</span> <span class="nx">your</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="kd">with</span> <span class="nx">an</span> <span class="nx">authentication</span> <span class="nx">token</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="nx">If</span> <span class="nx">you</span> <span class="k">do</span> <span class="nx">not</span> <span class="nx">yet</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">ready</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">bring</span> <span class="nx">up</span> <span class="nx">a</span> <span class="nx">browser</span> <span class="k">for</span> <span class="nx">you</span>
</span></span><span class="line"><span class="cl"><span class="nx">to</span> <span class="nx">create</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">now</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span> <span class="nx">server</span><span class="o">:</span> <span class="mf">123.11</span><span class="p">.</span><span class="mf">22.133</span>
</span></span><span class="line"><span class="cl"><span class="nx">Open</span> <span class="nx">browser</span> <span class="nx">now</span><span class="o">?</span> <span class="p">[</span><span class="nx">y</span><span class="o">/</span><span class="nx">n</span><span class="p">]</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> 
</span></span></code></pre></div><p><code>token</code>是在<code>Sentry</code>在线系统生成的，如下图所示：</p>
<p><img alt="5" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/5.png"></p>
<p>这时，只要复制<code>token</code>到终端，就可以完成登录流程了，如下所示，就是成功登录了<code>Sentry</code>在线系统：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> <span class="mf">4e6488262</span><span class="nx">fb849ef93c6217ac8bc8e9a2d635572eb584fa3b69b859e0edc5104</span>
</span></span><span class="line"><span class="cl"><span class="nx">Valid</span> <span class="nx">token</span> <span class="k">for</span> <span class="nx">user</span> <span class="nx">test001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Stored</span> <span class="nx">token</span> <span class="k">in</span> <span class="err">/Users/weihao/.sentryclirc</span>
</span></span><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div></li>
<li>
<p>上传<code>SourceMap</code>到<code>Sentry</code>在线系统</p>
<p>登录成功之后，就需要将SourceMap文件上传到Sentry在线系统，首先，需要在项目里新建一个<code>.sentryclirc</code>文件，里面的内容，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">defaults</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">url</span><span class="o">=</span><span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">org</span><span class="o">=</span><span class="nx">dst</span>
</span></span><span class="line"><span class="cl"><span class="nx">project</span><span class="o">=</span><span class="nx">test</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">auth</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">token</span><span class="o">=</span><span class="mf">4e6488262</span><span class="nx">fb849ef93c6217ac8bc8e9a2d635572eb584fa3b69b859e0edc5104</span>
</span></span></code></pre></div><p>然后使用以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">dst</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="nx">test</span><span class="err">@</span><span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/static/js/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span> 
</span></span></code></pre></div><p>这里需要对该命令一些参数说明一下：</p>
<p><code>dst</code>：组织名</p>
<p><code>test</code>：项目名</p>
<p><code>1.0.0</code>：版本号，需和main.js里的<code>release: 'test@1.0.0'</code>一致</p>
<p><code>./dist/static/js/</code>：项目打包生成的<code>dist</code>里<code>.map</code>文件所在目录</p>
<p><code>~/test/js</code>：如果部署在服务器上面，不是部署在主目录，而是在test文件夹下面，那就需要加上</p>
<p>在终端显示如下，就表示已经上传成功：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">dst</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/static/js/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span> 
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Found</span> <span class="mi">20</span> <span class="nx">release</span> <span class="nx">files</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="mi">20</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.238</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.252</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Adding</span> <span class="nx">source</span> <span class="nx">map</span> <span class="nx">references</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">files</span> <span class="k">for</span> <span class="nx">upload</span><span class="p">...</span> <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js.map</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.373</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Optimizing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.01</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploading</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.337</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploaded</span> <span class="nx">release</span> <span class="nx">files</span> <span class="nx">to</span> <span class="nx">Sentry</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Processing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.114</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">File</span> <span class="nx">upload</span> <span class="nx">complete</span> <span class="p">(</span><span class="nx">processing</span> <span class="nx">pending</span> <span class="nx">on</span> <span class="nx">server</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Source</span> <span class="nx">Map</span> <span class="nx">Upload</span> <span class="nx">Report</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Minified</span> <span class="nx">Scripts</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/0.5578cfbb7e2e6688ddf5.js (sourcemap at 0.5578cfbb7e2e6688ddf5.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/1.08ce936a2efe46fada3a.js (sourcemap at 1.08ce936a2efe46fada3a.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/2.21a7baf07c2e2f7e0e2e.js (sourcemap at 2.21a7baf07c2e2f7e0e2e.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/3.31b60f7af161be6ebdd9.js (sourcemap at 3.31b60f7af161be6ebdd9.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/4.fb6e7da7da26fad2df3a.js (sourcemap at 4.fb6e7da7da26fad2df3a.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/5.ee4c344db81fc2458f9c.js (sourcemap at 5.ee4c344db81fc2458f9c.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/6.9079b1090416a666a327.js (sourcemap at 6.9079b1090416a666a327.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/app.ad01bb777553f9efe703.js (sourcemap at app.ad01bb777553f9efe703.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/manifest.380384094e7763635655.js (sourcemap at manifest.380384094e7763635655.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js (sourcemap at vendor.331b4cf7bdabb46a7655.js.map)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Source</span> <span class="nx">Maps</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/0.5578cfbb7e2e6688ddf5.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/1.08ce936a2efe46fada3a.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/2.21a7baf07c2e2f7e0e2e.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/3.31b60f7af161be6ebdd9.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/4.fb6e7da7da26fad2df3a.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/5.ee4c344db81fc2458f9c.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/6.9079b1090416a666a327.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/app.ad01bb777553f9efe703.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/manifest.380384094e7763635655.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js.map</span>
</span></span><span class="line"><span class="cl"><span class="nx">zlgweihao</span><span class="err">@</span><span class="nx">zlgweihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div><p>此时，我们可以在Sentry在线系统上面查看到上传的sourcemap文件，如下图所示：</p>
</li>
</ol>
<p><img alt="6" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/6.png"></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
