Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add api for online version update #1882

Closed
wants to merge 11 commits into from
Closed

Conversation

Camsyn
Copy link

@Camsyn Camsyn commented Apr 23, 2022

What this PR does?

  1. Fix 希望添加自动更新功能 #1675
  2. 添加在线版本切换功能的后端api, 目前只是原型, 提供一种可能的方案。
  3. api包含版本查看,下载jar,切换版本等功能

Why we need it?
方便在线的halo版本检测与切换

Mechanism

  1. 依托于github api实现 (检测版本,下载jar包等)
  2. 后端构造出与启动当前运行的jar包类似的命令,用来启动新版本的halo
  3. 注册JVM exit hook,当JVM退出时创建子进程启动新版本jar包
  4. 退出当前JVM
  5. 备份当前jar包至halo-ori-bak.jar,延时删除当前jar包

Problem

  1. 从新版本切换回旧版本时,由于表结构的改变,会出现问题 (见 Issue halo版本回退后,导致新版halo无法启动 #1881

本地测试
如下面视频所示
https://user-images.githubusercontent.com/65994555/164885248-b41f7a73-0659-4747-81fe-1c99a0abd778.mp4

Camsyn and others added 3 commits April 22, 2022 23:13
1. 仅提供版本控制的后端api
2. 基于github api实现, 异步下载新版本的jar包
3. 构造与启动当前jar包相似的启动命令来启动新版本halo.jar
4. 备份并删除原版jar包
@f2c-ci-robot
Copy link

f2c-ci-robot bot commented Apr 23, 2022

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
To complete the pull request process, please assign ruibaby after the PR has been reviewed.
You can assign the PR to them by writing /assign @ruibaby in a comment when ready.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@CLAassistant
Copy link

CLAassistant commented Apr 23, 2022

CLA assistant check
All committers have signed the CLA.

@ruibaby
Copy link
Member

ruibaby commented Apr 24, 2022

@Camsyn 感谢你的贡献,但此特性我们认为在目前阶段并不适合添加。建议在提交 PR 前在原 issue 进行方案讨论,甚至提交 RFC:https://github.com/halo-dev/rfcs。

由于目前 master 分支处于 1.5.x 阶段,1.5.x 并不会添加任何新的特性,且原 issue 被设置的 milestone 为 2.0。所以此 PR 可能暂时无法合并,如果可能,至少得到 1.6.x。

/hold
/cc @halo-dev/sig-halo

@f2c-ci-robot f2c-ci-robot bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Apr 24, 2022
@Camsyn
Copy link
Author

Camsyn commented Apr 24, 2022

@Camsyn 感谢你的贡献,但此特性我们认为在目前阶段并不适合添加。建议在提交 PR 前在原 issue 进行方案讨论,甚至提交 RFC:https://github.com/halo-dev/rfcs。

由于目前 master 分支处于 1.5.x 阶段,1.5.x 并不会添加任何新的特性,且原 issue 被设置的 milestone 为 2.0。所以此 PR 可能暂时无法合并,如果可能,至少得到 1.6.x。

/hold /cc @halo-dev/sig-halo

感谢开发者回复。很抱歉我没能在原issue下讨论。我知晓当前版本不适合添加新的特性,但限于课程要求,必须参与开源项目(提出pr)。此次pr只是提供一个可能的技术方案和代码原型,若是此后能够帮助本feature的落地就再好不过了。

Copy link
Member

@JohnNiang JohnNiang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Camsyn,首先感谢花时间完成在线更新的功能。不过我们有几点需要考虑:

  1. 如果用户使用的 Docker 部署的 Halo,自动更新的功能是否还需要
  2. 是否应该支持跨 minor 版本的升级。比如:1.4.x 升级至 1.5.x
  3. Halo 的部分用户在国内,所以我们特别地在 https://dl.halo.run/release/ 托管了 Halo 的 JAR 包,那么是否需要支持动态设置下载方式。
  4. 如果手动运行 Halo 的时候设置了一些环境变量,那么以同样方式重启 Halo 的时候还能获取到环境变量么。

src/main/java/run/halo/app/utils/VmUtils.java Outdated Show resolved Hide resolved
@JohnNiang
Copy link
Member

/kind feature
/area core

@f2c-ci-robot f2c-ci-robot bot added kind/feature Categorizes issue or PR as related to a new feature. area/core Issues or PRs related to the Halo Core labels Apr 24, 2022
@JohnNiang
Copy link
Member

/milestone 1.6.x

@f2c-ci-robot f2c-ci-robot bot added this to the 1.6.x milestone Apr 24, 2022
@Camsyn
Copy link
Author

Camsyn commented Apr 24, 2022

Hi @Camsyn,首先感谢花时间完成在线更新的功能。不过我们有几点需要考虑:

  1. 如果用户使用的 Docker 部署的 Halo,自动更新的功能是否还需要
  2. 是否应该支持跨 minor 版本的升级。比如:1.4.x 升级至 1.5.x
  3. Halo 的部分用户在国内,所以我们特别地在 https://dl.halo.run/release/ 托管了 Halo 的 JAR 包,那么是否需要支持动态设置下载方式。
  4. 如果手动运行 Halo 的时候设置了一些环境变量,那么以同样方式重启 Halo 的时候还能获取到环境变量么。

@JohnNiang

  1. 即使是docker部署,我认为支持自动更新也无妨
  2. 理论上这与自己手动下载新的jar包再部署没区别,跨minor版本的升级所需的迁移脚本在原有代码里已有实现。我在1.4.13版本的代码里添加这个feature,经测试,是可以把系统迁移到1.5.2的。
  3. 不知道获取版本信息的接口有没有国内版本。不过动态设置下载方式也只是多一个请求参数的事,我可以增加对国内源的支持。
  4. 手动设置环境变量是指在启动命令里的 -Dxxx=xxx 吗?这种的话我有特意去构造与启动命令几乎一致的新的启动命令用来启动新版本halo。即除了被启动的jar包和class-path中对该jar包的引用外, 其余部分如VM参数,program参数,class-path都保持一致。

Copy link
Member

@JohnNiang JohnNiang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议引入 GitHub Java SDK 来访问 GitHub 相关的 API,降低维护成本。例如:https://github.com/spotify/github-java-client 或者 https://github.com/hub4j/github-api

@Camsyn
Copy link
Author

Camsyn commented May 22, 2022

建议引入 GitHub Java SDK 来访问 GitHub 相关的 API,降低维护成本。例如:https://github.com/spotify/github-java-client 或者 https://github.com/hub4j/github-api

第一个github-client过于简单,无法获取release,且必须认证来获取所有权限。第二个github-api实测可以使用,但是其 listReleases() 方法似乎会在短时间向GitHub发起大量请求, 造成GitHub限流,后续请求也会失败。

@ruibaby
Copy link
Member

ruibaby commented May 26, 2022

即使是docker部署,我认为支持自动更新也无妨

目前我们的 Docker 镜像里面应该不是包含的 Jar,有做构建分层,所以这样的更新方式可能并不适合在 Docker 环境。参考 https://github.com/halo-dev/halo/blob/master/Dockerfile

补充几个观点:

  1. 在我们没有提供更新服务器之前,在国内依赖于 GitHub 是不明智的,参考目前我们主题在线更新,基于 GitHub 更新非常不稳定。所以我认为其阻碍并不比手动更新低。
  2. 在线更新版本并不只是一个功能而已,还涉及到我们文档的结构。
  3. 能随意切换版本也不是一个明智的选择。

@f2c-ci-robot f2c-ci-robot bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 22, 2022
@f2c-ci-robot
Copy link

f2c-ci-robot bot commented Jun 22, 2022

@Camsyn: PR needs rebase.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@ruibaby ruibaby removed this from the 1.6.x milestone Jan 2, 2023
@ruibaby
Copy link
Member

ruibaby commented Mar 7, 2023

由于 1.x 的版本已经进入维护阶段,不会添加新功能,并且此 PR 也已经不适用于 2.x,所以我将关闭此 PR。

再次感谢你的贡献。

/close

@f2c-ci-robot f2c-ci-robot bot closed this Mar 7, 2023
@f2c-ci-robot
Copy link

f2c-ci-robot bot commented Mar 7, 2023

@ruibaby: Closed this PR.

In response to this:

由于 1.x 的版本已经进入维护阶段,不会添加新功能,并且此 PR 也已经不适用于 2.x,所以我将关闭此 PR。

再次感谢你的贡献。

/close

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/core Issues or PRs related to the Halo Core do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. kind/feature Categorizes issue or PR as related to a new feature. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

希望添加自动更新功能
4 participants