前端CI/CD落地实践

随着 nodejs 的兴起,前端开发也进入了 新的时代,webpack 的诞生,更是让其如虎添翼,构建出欣欣向荣的前端生态. 然而事物的发展总是在:发现问题->解决问题->引入新问题中往复。 webpack 给前端带来了一个新的高频操作就是打包,高频的打包会带来如下问题: 阻塞前端工作:前端必须等到打包完成,才能 进入后续工作,如果打包时间过长,这中间就会阻塞就会更加明显。 影响团队协作:当功能点开发完成后,未避免频繁打包,会将多个功能点合并在 一起打包,这样就会导致测试没有办法提前介入测试,如果测试出问题的功能点是在几天前开发的,对于代码已经有所遗忘,还需要阅读代码帮助找回记忆gg。 打断专注时间:如果前端正在专注的解决一个复杂问题,此时出现紧急问题需要打包,使得前端不得不从当前工作中抽身出来进行打包,打包完成后将需要一段时间的预热才可以像之前一样 专注的处理未完成的问题。 对于上述 问题完全可以通过工具构建出一套 CI/CD 方案交由计算机来解决,让前端工程师从打包解放出来。 工具 jenkens: 是一款由 JAVA 编写的开源的持续集成工具. gogs: 轻量级代码仓库 jenkins 与 gogs 的通讯是通过 Gogs plugin 通过 webhook 来通讯的。 方案 方案设计大致如下: 方案执行步骤: 前端工程师往代码仓库 push 代码 gogs 会调用 jenkins 的 webhook 地址触发 jenkins 工作流 jenkins 会将前端代码从代码仓库中拉取最新的代码,并执行构建流程 将构建好的代码上传到 dist 仓库(如果存在 CDN 则清除 CDN 缓存) push dist 仓库到 gogs 远程仓库 gogs 触发 dist 仓库的 webhook,将服务器代码更新到最新的打包文件 完成部署 测试人员执行测试用例(如果由缺陷,将缺陷反馈给前端开发人员) 好处 完成上述方案,前端工程师只需要将前端代码 push 到远程仓库,服务器会自动构建响应的包,并部署到测试服务器上供测试测试,前端可以缩小提交粒度并更快的将功能交付测试,也可以将问题尽早暴露尽早解决。...

March 29, 2021 · 1 min · 云溪

Base64编码的前世今生

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。 起因 计算机以二进制形式(0和1)进行通信,但是人们通常希望与更丰富的表单数据(例如文本或图像)进行通信。 为了在计算机之间传输此数据,首先必须将其编码为0和1,然后发送,然后再次解码。 以文本为例-有许多不同的方法可以执行此编码。 如果我们都可以同意一个编码,那就简单得多了,但不幸的是事实并非如此。 最初创建了许多不同的编码(例如Baudot码),每个字符使用不同数量的位,直到最终ASCII成为每个字符7位的标准。 但是,大多数计算机将二进制数据存储在每个字节由8位组成的字节中,因此ASCII不适合传输此类数据。 有些系统甚至会擦除最高位。 此外,跨系统的行尾编码的差异意味着有时还会修改ASCII字符10和13。 为了解决这些问题,引入了Base64编码。 这样,您就可以将框架字节编码为已知可以安全发送而不损坏的字节(ASCII字母数字字符和几个符号)。 缺点是使用Base64编码消息会增加其长度-每3个字节的数据会编码为4个ASCII字符。 为了可靠地发送文本,您可以首先使用所选的文本编码(例如UTF-8)将其编码为字节,然后再对Base64进行编码,将生成的二进制数据编码为可安全发送为ASCII的文本字符串。 接收者将不得不逆转此过程以恢复原始消息。 当然,这要求接收者知道使用了哪种编码,并且该信息通常需要单独发送。 从历史上看,它已用于对电子邮件中的二进制数据进行编码,其中电子邮件服务器可能会修改行尾。 一个更现代的示例是使用Base64编码将图像数据直接嵌入HTML源代码中。 在这里,有必要对数据进行编码,以避免像“ <”和“>”这样的字符被解释为标签。 原理 base64 加密原理,是将待转换字符串转换为二进制并以三个字为一组(数据不足用 0 补足),每 6 位为一个索引组转换为十进制索引,通过索引在 base64 索引表中找到对应的字符作为编码后的字符(若原数据长度不是 3 的倍数时则对 3 取余余数为 1,则在编码结果后加2个=;若余数为 2,则在编码结果后加 1 个 =。)。 base64 转换实例 以 helloworld 为例转换过程如下: 经过上述步骤转后字符串为:aGVsbG93d29ybGQ=,到此一个完整的转码例子便完成了。 应用 base64 在需要网络通讯的场景下,有着非常广泛的应用场景,比如邮件的附件和图象传输,html img 标签的 src 属性也可以是 base64 编码的图片,还有我们常用的各类证书(支付证书,ssl 证书)的公钥和私钥.. Summary base64 是一个很优秀的编码方式,他很好的解决了复杂文件在传输中的问题,也因此被广泛的应用在各种场景之中。关于 base64 的使用,你还需要知道如下几点: base64 转码后的长度会有所变化,会比源数据的长度多出大约 1/3 base64 不具有加密特性,因此他不适用于加密的场景 由于 base64 字符中会有 +,/ 等字符,因此如果需要 url 传参的时候注意需要使用 URL 编码一下,否则有可能会导致接受到的数据无法正常解密的情况 References 维基百科...

October 12, 2020 · 1 min · 云溪

PHP-FFMpeg 安装

安装 FFMPEG wget http://download.bt.cn/install/ext/ffmpeg.sh && sh ffmpeg.sh 安装完后可输入以下命令是否安装成功 ffmpeg -version 删除禁用函数 proc_open, exec, system 安装 PHP-FFMpeg composer require php-ffmpeg/php-ffmpeg 常见问题 Executable not found, proposed : avprobe, ffprobe php-fpm 在执行 FFMPEG 的时候,没有找到 ffprobe 和 ffmpeg 解决办法如下: 命令行解决 通过 shell 确定文件位置 whereis ffprobe /usr/local/bin/ffprobe which ffmpeg /usr/local/bin/ffmpeg 在初始化 FFMpeg 的时候将文件位置写入 $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => '/usr/local/bin/ffmpeg', 'ffprobe.binaries' => '/usr/local/bin/ffprobe', ]); PHP 代码直接解决 // 写入 WWW 用户的环境变量 putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:$PATH'); // 通过 exec 函数找到文件对应位置 $ffmpeg = FFMpeg::create([ 'ffmpeg....

August 28, 2020 · 1 min · 云溪

CSV 中文解析异常

最近在做导入 csv 数据的时候出现了,未按预期导出的情况,具体情况见下图: 如图所示,商家地址部分和商家电话部分,没有正常解析。后来在PHP官网找到如下解释: 该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。 我系统语言设置的 en, 当解析 utf8 字节编码的文件,就出现了上述问题。 既然找到了是因为区域的问题,就号解决了,在导入前先设置一下区域: setlocale(LC_ALL, 'us'); 如果有疑问欢迎留言交流。 Reference fgetcsv

June 6, 2020 · 1 min · 云溪

Linux Manjaro 安装指南

Linux 历史 1994 年 3 月,Linux1.0 版正式发布,Marc Ewing 成立 Red Hat 软件公司,成为最著名的 Linux 经销商之一。早期 Linux 的引导管理程序(boot loader)使用 LILO(Linux Loader),早期的 LILO存在着一些难以容忍的缺陷,例如无法识别 1024 柱面以后的硬盘空间,后来的 GRUB(GRand Unified Bootloader)克服这些缺点,具有‘动态搜索内核文件’的功能,可以让用户在引导的时候,自行编辑引导设置系统文件,透过 ext2 或 ext3 文件系统中加载 Linux Kernel(GRUB通过不同的文件系统驱动可以识别几乎所有 Linux 支持的文件系统,因此可以使用很多文件系统来格式化内核文件所在的扇区,并不局限于 ext 文件系统)。 今天由 Linus Torvalds 带领下,众多开发共同参与开发和维护 Linux 内核。理查德·斯托曼领导的自由软件基金会,继续提供大量支持 Linux 内核的GNU组件。一些个人和企业开发的第三方的非GNU组件也提供对Linux 内核的支持,这些第三方组件包括大量的作品,有内核模块和用户应用程序和库等内容。Linux社区或企业都推出一些重要的 Linux 发行版,包括 Linux 内核、GNU 组件、非 GNU 组件,以及其他形式的软件包管理系统软件。 什么人适合 linux 系统 对 Linux 保持高敏感度的人(运维人员,后端开发…) 有 Geek 精神喜欢折腾的人。 对 Windows 生厌, 想要尝试新系统的人,不差钱可以上 MAC。 Linux 发行版之 Manjaro Manjaro Linux 基于 Arch Linux,但拥有自己独立的软件仓库。Manjaro 的目标是让强大的 Arch 更方便用户使用,Manjaro 使用著名的 Pacman 且可以直接利用 AUR 上的資源。Manjaro 本身使用三个软件仓库:不稳定库,即含有那些不成熟的 Arch 包,这些包与 Arch 源有 1-2 天 的延后;测试库,每周同步一次,包含那些 Arch 不稳定源的包;以及稳定库,包含那些由开发团队确认稳定的软件。...

May 5, 2020 · 3 min · 云溪