不用手动改 package.json 的版本号

news2024/9/24 15:22:28

“为什么package.json 里的版本还是原来的,有没有更新?”,这个时候我意识到,我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号,只要在发布打tag的时候同步一下即可

 

node.js 部分,我们得有一个更改仓库代码的脚本留给ci执行

我们首先需要在工程目录中的 ./script/..目录下增加一个 update-version.js脚本

//update-version.js

const path = require('path');
const fs = require('fs');
const newVersion = process.argv[2].replace(/^v/, '');; // 获取命令行参数中的新版本号,并过滤v字头

if (!newVersion) {
    console.log('请传入新版本号,版本号遵循semver规范 .eg: 1.0.0, 1.0.1, 1.1.0');
    process.exit(1);

}

// 获取当前命令行上下文路径

const currentDirectory = process.cwd();

// 获取 package.json 文件中的版本号
const packageJsonPath = path.join(currentDirectory, 'package.json');
const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8');
const packageJson = JSON.parse(packageJsonContent);
const currentVersion = packageJson.version;

// 更新 package.json 文件中的版本号

packageJson.version = newVersion;
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
console.log(`版本号已从 ${currentVersion} 更新为 ${newVersion}`);

接下来在 package.json script 配置后可以直接使用 npm run version <version> 中触发变更版本号脚本。当然这个前提是想要让这个脚本保留给开发者命令行使用。

{

    "name": "version workflow",
    "version": "1.0.0",
    "description": "version update demo",
    "main": "index.js",
    "scripts": {
        //...
        "version": "node ./scripts/update-version.js"
    },
    //...

}

CI :如何让发布包的行为直接和代码仓库中的版本号同步?

接下来算重头戏,如何让发布包的行为直接和代码仓库中的版本号同步?这里我们使用的是github 提供的github action[1],具体操作和语法可以查看一下官方文档,本文就不过多展开。

我们需要在仓库根目录增加如下路径的文件 .github/workflows/update-action.yml

name: Update Package Version

on:
  release:
    types: [released]

jobs:
  update:
    runs-on: ubuntu-latest
    steps:

      - name: Checkout code
        uses: actions/checkout@v3

     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

     - name: Commit changes
       run: |
         git config user.name "Your github name"
         git config user.email "your github email"
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"

     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}

我们在 release hook 中的 released 状态下增加了一个 update job。它会做下面几件事情(在脚本步骤中有)

  1. 【Checkout code】 切出新的代码分支;

  2. 【 Update package.json】在新分支执行 update-version.js 传入tag_name更新我们的工程版本号;

  3. 【Commit changes】以你定制的 git config user 信息创建一个新提交;

  4. 【Push changes】推送变更回到主干;

ps:正确来说应该在发布执行动作前prereleased执行我们的 job 但是没用这个的原因如下:

Note:[2] The prereleased type will not trigger for pre-releases published from draft releases, but the published type will trigger. If you want a workflow to run when stable and pre-releases publish, subscribe to published instead of released and prereleased.

当这个脚本推送后,执行发布后自动更新版本,不用在关注这个版本修改问题。你会得到下面的效果。

在你的仓库发布界面填写正确tag后发布

 

 触发update job 更改完成

 

 

你可能遇到最多的坑

  1. action 执行失败

Process completed with exit code 129." Node.js 12 actions are deprecated. Please update the following actions to use Node.js 16: actions/checkout@v2. For more information, see https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/.

这是由于默认action job 执行环境的nodejs 版本与actions 包中执行脚本不匹配导致,所以一定要使用 checkout@v3 版本 actions/checkout@v3

  1. 各种不熟悉 action 语法取值导致的问题

可以优化的地方

我们前面提交的这个流程发布还是有个问题,你永远有个更超前的 commit hash 在你发布的 tag 之后

 

 

所以这个action 还有需要继续优化的地方,那就是同步更新tag hash

name: Update Package Version

on:
  release:
    types: [released]

jobs:
  update:
    runs-on: ubuntu-latest
    steps:

      - name: Checkout code
        uses: actions/checkout@v3

     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

     - name: Commit changes
       run: |
         git config user.name "Your github name"
         git config user.email "your github email"
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"
         git_hash=$(git rev-parse --short HEAD)

     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}

    - name: Tag Push changes
      run: |
        git tag -f ${{ github.event.release.tag_name }} $git_hash
        git push --force origin ${{ github.event.release.tag_name }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

这里相比之前的版本增加了 Tag Push changes 这个步骤,在最后获取这个版本更新产生的 $git_hash强制更新到发布的 tag 上。

我们看看效果

 

 最后我们看版本发布管理中的 tag hash

 

 

可以再优化的地方

现在我们还有个问题,就是在执行 Commit changes 这个步骤时每次 git config user.name "Your github name" git config user.email "your github email" 这里是写死的,我们可以根据 GitHub Actions 中有一些预设的环境变量可以读取到当前用户的账号和邮箱信息。通过 ${{ env.GITHUB_ACTOR }} 获取到当前执行的 Actions 的用户账号,通过 ${{ env.GITHUB_ACTOR }}@users.noreply.github.com 获取到当前执行的 Actions 的用户邮箱(该邮箱为 noreply 邮箱,用于 GitHub 的通知,无法发送邮件)。注意,该邮箱不一定是用户本身的真实邮箱,可能是 GitHub 默认的邮箱。

如果需要获取当前 GitHub 账号的真实邮箱地址,可以通过 GitHub REST API 进行查询,具体可以参考官方文档:https://docs.github.com/en/rest/reference/users#get-the-authenticated-user

这样我们就需要在Commit Changes之前再加一个Set Git user步骤

- name: Set Git user
  env:
    GITHUB_ACTOR: ${{ github.actor }}
    GITHUB_EMAIL: ${{ github.actor }}@users.noreply.github.com
  run: |
    git config --global user.name "${{ env.GITHUB_ACTOR }}"
    git config --global user.email "${{ env.GITHUB_EMAIL }}"

这样我们最终的 Github action 脚本长这样

name: Update Package Version

on:
  release:
    types: [released]

jobs:
  update:
    runs-on: ubuntu-latest
    steps:

      - name: Checkout code
        uses: actions/checkout@v3

     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    
     - name: Set Git user
       env:
         GITHUB_ACTOR: ${{ github.actor }}
         GITHUB_EMAIL: ${{ github.actor }}@users.noreply.github.com
       run: |
         git config --global user.name "${{ env.GITHUB_ACTOR }}"
         git config --global user.email "${{ env.GITHUB_EMAIL }}"
 
     - name: Commit changes
       run: |
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"
         git_hash=$(git rev-parse --short HEAD)

     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}

    - name: Tag Push changes
      run: |
        git tag -f ${{ github.event.release.tag_name }} $git_hash
        git push --force origin ${{ github.event.release.tag_name }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索视频文本特征加速检索解决方案——倒排索引

前言 随着视频内容的不断增加&#xff0c;如何快速准确地检索到所需的视频成为了一个重要的问题。而视频文本特征加速检索解决方案——倒排索引&#xff0c;成为了解决这一问题的有效手段。该技术可以加速文本和视频片段特征匹配、相似度排序过程&#xff01; 定义——何为“…

windows -- dos命令

文章目录 内部命令变量常用命令特殊命令符综合案例 外部命令 内部命令 操作系统的内部命令。 win r, 输入cmd 打开命令窗口&#xff1b; 如&#xff1a; dir&#xff0c;查看当前目录下的内容cd&#xff0c;切换目录copy&#xff0c; 拷贝echo&#xff0c;打印 变量 windo…

硬盘被写保护怎么解决

目录 问题描述方法1&#xff1a;使用diskpart清除只读属性方法2&#xff1a;树莓派镜像烧录软件 U盘格式化不了&#xff0c;怎么做呢&#xff1f; 问题描述 方法1&#xff1a;使用diskpart清除只读属性 我是I盘出现了问题&#xff0c;所以我在命令提示符输入&#xff1a; chk…

Spring Cloud Alibaba Seata(一)

目录 一、Seata 1、分布式事务简介 1.1、分布式事务理论 1.2、分布式事务解决方案 2、Seata简介 3、Seata安装 一、Seata 1、分布式事务简介 基础概念&#xff1a;事务ACID A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xf…

L0到L4级别下的泊车功能设计详解(上)

摘要&#xff1a; 乘用车自动驾驶/辅助驾驶按场景分主要包括城区场景、高速场景和泊车场景。 媳妇和我工作地点一南一北&#xff0c;工作地点公共交通又都不方便&#xff0c;在只有一辆车的背景下&#xff0c;我是早送仙女晚接美人&#xff0c;毫无怨言。但看到今年新车层出不…

Kali Linux 2023.2为Xfce版带来PipeWire支持

Kali Linux 2023.2为Xfce版带来PipeWire支持&#xff0c;彻底改造i3桌面&#xff0c;这个版本还引入了一个新的Hyper-V VM镜像&#xff0c;以及几个新的黑客工具。 Offensive Security宣布了他们流行的道德黑客和渗透测试GNU/Linux发行版的新版本&#xff0c;带来了新的功能&am…

chatgpt赋能python:Python整人代码:开发有趣的恶作剧工具

Python整人代码&#xff1a;开发有趣的恶作剧工具 Python是一种高级编程语言&#xff0c;它有着众多功能库和API&#xff0c;能够用于各种不同的领域。但是&#xff0c;Python也可以用来编写有趣的恶作剧代码&#xff0c;搞乐一下&#xff01;在这篇文章中&#xff0c;我们将介…

通过使用SpringBoot与ElementUI来实现数据的分页功能

背景 分页: 如果一次性的查询全部数据, 响应时间就太长了, 使得浏览器, java虚拟机都有延迟, 用户使用上就会容易出现卡顿:所以就要降低数据库的压力, 使用分页来显示, 一次显示一部分数据 例子: 假设有五条数据, 每一页都显示两条 实现分页要知道: 每页多少条数据当前的页数一…

C++ [STL容器适配器]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL容器适配器 前言正文容器适配器stack 栈stack的使用stack模拟实现 queue 队列queue的使用queue模拟实现 priority_queue 优先级队列priority_queue的使用priority_queue模拟实现 deque 双端队…

第二章 VGG网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Debian12中Grub2识别Windows

背景介绍&#xff1a;windows10 debian11,2023年6月&#xff0c;Debian 12正式版发布了。抵不住Debian12新特性的诱惑&#xff0c;我将Debian11升级至Debian12。升级成功&#xff0c;但Debian12的Grub2无法识别Window10。于是执行如下命令&#xff1a; debian:~# update-grub G…

图片加载错误的捕获及处理

引言 前端开发中&#xff0c;图片是我们在网页中加载最多的静态资源类型之一&#xff0c;但是图片加载过程中也有可能出现加载失败的情况&#xff0c;这是十分影响用户体验的。那么如何正确的判断图片是否成功加载&#xff0c;以及图片加载失败的时候&#xff0c;如何处理&…

了解 Dockerfile 和搭建 Docker 私有仓库:让容器化部署变得更简单

目录 1、Dockerfile 1.1什么是Dockerfile 1.2常用命令 1.3使用脚本创建镜像 2、Docker私有仓库 2.1私有仓库介绍&#xff1a; 2.2私有仓库搭建与配置 2.3上传镜像到私有仓库&#xff1a; 1、Dockerfile 1.1什么是Dockerfile Dockerfile是由一些列命令和参数构成的脚本…

【服务器数据恢复】IBM存储分配的卷无法访问的数据恢复案例

服务器故障&#xff1a; 一台IBM DS存储出现故障&#xff0c;存储分配给aix小机的卷无法访问。从底层查看分配给aix小机的3个卷的lvm信息丢失。 服务器数据恢复过程&#xff1a; 1、将存储中所有磁盘编号后取出&#xff0c;以只读方式做全盘镜像&#xff0c;后续的数据分析和数…

【C++篇】字符串:标准库string类

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

Eyeshot 2023 Added NuGet packages.

Added Microsoft Visual Studio 2022 Extensions menu item.Microsoft .NET 6 Windows Toolbox items.Added NuGet packages.Planar curve projection on Sketch plane.Improved fillet surfaces quality and speed.Added ICurve.ConverToLinearPath() family of methods.   …

RabbitMQ学习笔记4(小滴课堂)RabbitMQ工作队列模型实战

Java项目整合RabbitMQ 创建一个maven项目。 然后我们在maven里加上jdk和rabbitmq的依赖设置&#xff1a; 我们写一段生产者的代码&#xff1a; 然后我们去运行它&#xff1a; 可以看到这里有一个队列。 现在我们是可以查看到队列的。 我们去写消费者代码&#xff1a; 这里的之…

LeetCode 2090. K Radius Subarray Averages【前缀和,滑动窗口,数组】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Redis是什么,如何学习,如何整合SpringBoot?

目录 一、Redis是什么&#xff1f; 二、如何学习Redis 三、如何整合SpringBoot 一、Redis是什么&#xff1f; Redis 是一个高性能的开源 NoSQL 数据库&#xff0c;支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合等。它采用内存存储&#xff0c;可以快…

Python3 函数与数据结构 | 菜鸟教程(十一)

目录 一、Python3 函数 &#xff08;一&#xff09;定义一个函数 1、你可以定义一个由自己想要功能的函数&#xff0c;以下是简单的规则&#xff1a; 2、语法 3、实例 ①让我们使用函数来输出"Hello World&#xff01;"&#xff1a; ②更复杂点的应用&#xff…