<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CI/CD on 月盾的博客</title>
    <link>https://blog.hopefly.top/tags/ci/cd/</link>
    <description>Recent content in CI/CD on 月盾的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 26 Aug 2025 19:41:31 +0800</lastBuildDate>
    <atom:link href="https://blog.hopefly.top/tags/ci/cd/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>博客终于可以更新了</title>
      <link>https://blog.hopefly.top/2025/08/%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0/</link>
      <pubDate>Tue, 26 Aug 2025 19:41:31 +0800</pubDate>
      <guid>https://blog.hopefly.top/2025/08/%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0/</guid>
      <description>&lt;p&gt;博客内容有一年时间没有更新了，不是不想更，而是没法更。&lt;/p&gt;&#xA;&lt;p&gt;去年更换电脑以后，重新安装了hugo导致本地跑不起来，搞了好久也没搞定。期间也有重试修复过两次还是没跑起来，就一直搁置了下来。&lt;/p&gt;&#xA;&lt;p&gt;最近下定决心完全从零开始学习的方式安装hugo和主题，修改配置才终于重新跑了起来。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;总结下原因&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;换电脑以后直接安装了最新版hugo，而主题没有更新，或者是主题也更新了但是与主题相关的项目配置还是旧的，然后就是各种出错。现在是直接复制出了主题中的示例项目中的配置才正确的跑了起来。&lt;/p&gt;</description>
    </item>
    <item>
      <title>gitlab-ci使用Harbor机器人账户</title>
      <link>https://blog.hopefly.top/2024/08/gitlab-cicd-harbor/</link>
      <pubDate>Tue, 06 Aug 2024 14:50:43 +0800</pubDate>
      <guid>https://blog.hopefly.top/2024/08/gitlab-cicd-harbor/</guid>
      <description>&lt;p&gt;gitlab ci/cd 中，需要使用到 docker registry 账号 push 镜像，这个可以设置为机器人，可以避免个人账号泄露&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置harbor机器人&#34;&gt;配置Harbor机器人&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;登录 Harbor 管理界面，进入&lt;code&gt;系统管理→认证&lt;/code&gt;页面；&lt;/li&gt;&#xA;&lt;li&gt;选择&lt;code&gt;机器人 Token&lt;/code&gt;页签，点击左上角的&lt;code&gt;新建机器人&lt;/code&gt;，创建一个名为&lt;code&gt;gitlab-ci&lt;/code&gt;的机器人；&lt;/li&gt;&#xA;&lt;li&gt;给该机器人一个名称，并给该机器人添加相应的权限；&lt;/li&gt;&#xA;&lt;li&gt;机器人创建完成以后，点击右侧的&lt;code&gt;查看token&lt;/code&gt;来复制该机器人的 token，这个就是以后用 gitlab-ci 配置文件使用的账号密码；&lt;/li&gt;&#xA;&lt;li&gt;在gitlab 创建 &lt;code&gt;harbor-robot&lt;/code&gt; 用户；&lt;/li&gt;&#xA;&lt;li&gt;为该用户添加项目级别的 &lt;code&gt;开发&lt;/code&gt; 权限；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;配置gitlab-ci&#34;&gt;配置gitlab-ci&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在项目的设置中添加 docker registry 账号密码，仓库地址是harbor的；&lt;/li&gt;&#xA;&lt;li&gt;编辑&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;文件，把账号密码改为之前复制的 token；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意点&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;有些情况下创建的机器人账户会带上&lt;code&gt;$&lt;/code&gt;符号，在gitlab中是无法使用的，需要将&lt;code&gt;$&lt;/code&gt;改为两个&lt;code&gt;$$&lt;/code&gt;来表示&lt;code&gt;$&lt;/code&gt;；&lt;/p&gt;&#xA;&lt;h2 id=&#34;结束&#34;&gt;结束&lt;/h2&gt;&#xA;&lt;p&gt;这样gitlab-ci 就可以顺利跑测试、构建、推送镜像了；&lt;/p&gt;&#xA;&lt;p&gt;以上内容，只是简单的配了配 harbor，可以有很多其他方法完成该工作，这里只是简单的记录下而已；&lt;/p&gt;&#xA;&lt;p&gt;如果需要复杂的设置，欢迎移步&lt;a href=&#34;https://github.com/goharbor/harbor/blob/master/docs/user_guide.md&#34;&gt;harbor 文档&lt;/a&gt;，那里有更多的内容可以提供参考。&lt;/p&gt;</description>
    </item>
    <item>
      <title>jenkins代替品</title>
      <link>https://blog.hopefly.top/2023/05/ci-cd/</link>
      <pubDate>Wed, 10 May 2023 18:55:23 +0800</pubDate>
      <guid>https://blog.hopefly.top/2023/05/ci-cd/</guid>
      <description>&lt;p&gt;如果你打算搭建一套发布系统，你可能会考虑jenkins，或者其他。&#xA;我要介绍的则是一些现成的，使用更简单的工具。没用特殊环境要求的情况下则完全可以代替jenkins。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHub Actions&lt;/li&gt;&#xA;&lt;li&gt;gitlab ci&lt;/li&gt;&#xA;&lt;li&gt;阿里云流水线&lt;/li&gt;&#xA;&lt;li&gt;coding持续部署&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;上面只是列举了四类，实际上你会发现市面上的云服务商和代码仓库都提供了类似的工具，虽然有些是收费的，但是也有不少免费的，对于个人来说其实大多数都是够用了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>typescript不检查node_moduls</title>
      <link>https://blog.hopefly.top/blogdetail/60b48e405caa4b4dc69e3abf/</link>
      <pubDate>Fri, 11 Jun 2021 14:16:17 +0800</pubDate>
      <guid>https://blog.hopefly.top/blogdetail/60b48e405caa4b4dc69e3abf/</guid>
      <description>&lt;p&gt;tsconfig.json 中 exclude node_modules，但 tsc 还是报错。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;node_modules/connect-mongo/src/types.d.ts:113:66 - error TS2694: Namespace &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global.Express&amp;#39;&lt;/span&gt; has no exported member &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SessionData&amp;#39;&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;113&lt;/span&gt;         get: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sid: string, callback: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;err: any, session: Express.SessionData | null&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void;                                                                     ~~~~~~~~~~~&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;node_modules/connect-mongo/src/types.d.ts:114:45 - error TS2694: Namespace &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global.Express&amp;#39;&lt;/span&gt; has no exported member &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SessionData&amp;#39;&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;114&lt;/span&gt;         set: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sid: string, session: Express.SessionData, callback?: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;err: any&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                ~~~~~~~~~~~&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;node_modules/connect-mongo/src/types.d.ts:118:47 - error TS2694: Namespace &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;global.Express&amp;#39;&lt;/span&gt; has no exported member &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SessionData&amp;#39;&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;118&lt;/span&gt;         touch: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sid: string, session: Express.SessionData, callback?: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;err: any&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; void;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另一种解决方案：&lt;/p&gt;</description>
    </item>
    <item>
      <title>朱雀发布系统支持scp（rsync）发布</title>
      <link>https://blog.hopefly.top/blogdetail/60950c9ee76f307341586548/</link>
      <pubDate>Fri, 11 Jun 2021 14:16:17 +0800</pubDate>
      <guid>https://blog.hopefly.top/blogdetail/60950c9ee76f307341586548/</guid>
      <description>&lt;p&gt;去年花了三天时间开发了一个简易版的&lt;a href=&#34;https://blog.hopefly.top/blogdetail/5f41c9d65edb9b37630b0d46&#34;&gt;nodejs发布系统&lt;/a&gt;，它是基于pm2自带的&lt;a href=&#34;https://pm2.keymetrics.io/docs/usage/deployment/&#34;&gt;deploy&lt;/a&gt;机制开发的，主要原理就是在两台装有pm2的机器直接通信，并执行相应的命令。再往简单了说就是在发布机上远程执行命令，而朱雀发布系统提供了一个图形界面而已。&lt;/p&gt;&#xA;&lt;p&gt;当时把这个系统定位为nodejs专用发布系统，因为它依赖了pm2，而pm2则是nodejs专用的进程管理工具，其他语言用不到。这个系统的上线也算是解决了我司一直以来没有合适的nodejs发布系统的空缺。&lt;/p&gt;&#xA;&lt;p&gt;经过9个月的使用，也算比较稳定。但是也存在问题，最大的问题是部署应用方面比较繁琐。&lt;/p&gt;&#xA;&lt;p&gt;基本流程如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;发布机和应用服务器设置ssh通信配置。&lt;/li&gt;&#xA;&lt;li&gt;应用服务器安装git（有自带，但是版本太旧）。&lt;/li&gt;&#xA;&lt;li&gt;配置git用户名，邮箱。&lt;/li&gt;&#xA;&lt;li&gt;生成ssh公钥。&lt;/li&gt;&#xA;&lt;li&gt;把应用服务器的公钥配置到git代码服务器上。以便能拉代码。&lt;/li&gt;&#xA;&lt;li&gt;发布机远程执行git pull来代码操作，各应用服务把代码拉取下来。&lt;/li&gt;&#xA;&lt;li&gt;执行编译打包操作。&lt;/li&gt;&#xA;&lt;li&gt;执行重启服务操作。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;部署一次系统还是比较麻烦的，如果应用服务器有多台，可能还要重复这样的操作多次，实在比较麻烦。&lt;/p&gt;&#xA;&lt;p&gt;使用scp同步代码的方式会比较简单一些，但是像nodejs这样的项目，node_module占了很大比重，如果每次都打包的话会拖慢同步速度，而scp又不具备排除文件夹的能力。&lt;/p&gt;&#xA;&lt;p&gt;最后找到了&lt;strong&gt;rsync&lt;/strong&gt;命令可以满足需求。然后就是基于rsync实现了一版。不用再依赖pm2，应用服务器也不用强制使用git了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://qn-img.hopefly.top/zhuque1.jpg&#34; alt=&#34;朱雀发布系统&#34; title=&#34;朱雀发布系统&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;朱雀和jenkins对比如何&#34;&gt;朱雀和Jenkins对比如何？&lt;/h3&gt;&#xA;&lt;p&gt;要说Jenkins那绝对是持续集成领域的老大哥，自然是功能强大。但是每个团队和产品有其特殊性，Jenkins并不完全适用。而朱雀也有其优势。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;朱雀本身部署简单，使用go开发，不依赖运行时，无需安装，开箱即用。&lt;/li&gt;&#xA;&lt;li&gt;目前支持和测试过的数据库有sqlite3（目前用的，不需要繁琐的安装过程）和mysql。&lt;/li&gt;&#xA;&lt;li&gt;配置简单。&lt;/li&gt;&#xA;&lt;li&gt;部署发布一键完成，不需要单独的部署过程。&lt;/li&gt;&#xA;&lt;li&gt;并行发布。&lt;/li&gt;&#xA;&lt;li&gt;审批，通知，权限。&lt;/li&gt;&#xA;&lt;li&gt;开源，可定制开发。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;项目地址：&lt;a href=&#34;https://github.com/yuedun/zhuque&#34;&gt;朱雀发布系统&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>nodejs专用发布系统</title>
      <link>https://blog.hopefly.top/blogdetail/5f41c9d65edb9b37630b0d46/</link>
      <pubDate>Sun, 23 Aug 2020 01:43:50 +0000</pubDate>
      <guid>https://blog.hopefly.top/blogdetail/5f41c9d65edb9b37630b0d46/</guid>
      <description>&lt;p&gt;Nodejs项目部署到服务器以后接下来做的最多的操作就是上线发布了。因为nodejs的语言特性决定了其开发效率高，发布自然就频繁，每个公司或个人都有自己的发布方式。&lt;/p&gt;&#xA;&lt;p&gt;有的公司会有严格的流程，必须通过CI/CD工具进行发布，有可能使用现成的工具，如：jenkins。有可能是自研发布系统。&lt;/p&gt;&#xA;&lt;p&gt;有的公司会通过FTP上传代码到服务器发布。&lt;/p&gt;&#xA;&lt;p&gt;有的公司使用更原始的发布方式，直接登录服务拉代码发布。&lt;/p&gt;&#xA;&lt;p&gt;不论哪种发布方式都有其优缺点，越高级的工具会有诸多限制，比如有权限控制，有严格的审批流程，自然就不能随时发布，也就越僵化。越原始的方式越简单越灵活，自然风险也越高。&lt;/p&gt;&#xA;&lt;p&gt;至于采用哪种发布方式，依据需要选择即可。&lt;/p&gt;&#xA;&lt;p&gt;而关于nodejs的发布方式，本人也是也是多种方式都有使用，公司项目也经历过多次变迁。公司最开始是直接登录服务器拉代码发布，后来有了运维团队，领导说开发自己发布不安全，于是就由运维搭建了Jenkins环境来发布，但是每次发布都需要走流程，后来因为发布太频繁，每1-2天要发布一次，又要灰度发布，运维也会觉得烦。于是开发就搭建了某个发布系统自己来发布，不过这个发布系统有个缺点，就是发布集群的时候是串行的，每次发布要十几分钟。&lt;/p&gt;&#xA;&lt;p&gt;另外说明一下Jenkins。它应该是使用最多的发布系统了，Jenkins基于Java开发，它已经是成熟的系统了，成熟同时也代表着复杂，复杂代表修改困难，我想大家也不太会基于Jenkins定制开发。&#xA;然后是部署困难，相比较nodejs三条命令搞定&lt;a href=&#34;https://blog.hopefly.top/blogdetail/5dd2378b00f24e1fd556d0c4&#34;&gt;linux安装nodejs——快捷版&lt;/a&gt;，go直接放二进制文件部署，Jenkins部署可能就略显复杂了。&lt;/p&gt;&#xA;&lt;p&gt;于是下定决心自己开发一个发布系统，&lt;a href=&#34;https://blog.hopefly.top/zhuque/&#34;&gt;朱雀发布系统&lt;/a&gt;因此诞生。&lt;/p&gt;&#xA;&lt;p&gt;基于以往的发布系统使用经历，我想要的是一款使用够灵活，部署够简单的发布系统。市面上现有的系统为了满足各种语言的发布，做的大而全。我自然是不想重蹈覆辙再做一个大而全的系统，我要的是小而美。正好之前了解过PM2本身集成了远程发布功能，可以在此基础上开发。PM2本身的发布过程其实已经很简单了，而且足够灵活，能够满足我的部分要求，但是公司的环境是不能在本地直接连接应用服务器的，所以需要一个中间层代理一下，放一张简单的架构图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://qn-img.hopefly.top/zhuque.jpg&#34; alt=&#34;架构图&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;和其他工具架构逻辑一样，都是通过ssh来通信，不同的是朱雀没有直接使用ssh，而是利用了pm2,由pm2来实现通信，它已经为了做了一部分工作，比如拉代码，回滚，执行远程脚本。&#xA;由于nodejs的项目特性，它依赖了node_modules包，如果按照打包的方式发布会又大又费时，所以还是选择拉git代码的方式发布比较合适。&#xA;所以我只需要给它做一个图形界面，并有一定的管理和审批流程（可根据环境跳过）。&#xA;放一张图来看一下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://qn-img.hopefly.top/%E6%9C%B1%E9%9B%80%E5%8F%91%E5%B8%83%E7%95%8C%E9%9D%A2.jpg&#34; alt=&#34;朱雀发布系统&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;项目地址：&lt;a href=&#34;https://github.com/yuedun/zhuque&#34;&gt;nodejs发布系统&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://blog.hopefly.top/blogdetail/60950c9ee76f307341586548&#34;&gt;朱雀发布系统支持scp（rsync）发布&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
