@wjwjq/release-helper 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.prettierignore +13 -0
  2. package/.prettierrc.json +19 -0
  3. package/README.md +29 -0
  4. package/bin/index.js +7 -0
  5. package/dist/cli.js +56 -0
  6. package/dist/deploy/nginx/README.md +1 -0
  7. package/dist/deploy/nginx/pkg/nginx-arm-ssl1.1.1.tar.gz +0 -0
  8. package/dist/deploy/nginx/pkg/nginx-x86_64-ssl1.0.2.tar.gz +0 -0
  9. package/dist/deploy/nginx/pkg/nginx-x86_64-ssl1.1.1.tar.gz +0 -0
  10. package/dist/deploy/nginx/pkg/nginx-x86_64-ssl3.0.7.tar.gz +0 -0
  11. package/dist/deploy/nginx/script/common.sh +178 -0
  12. package/dist/deploy/nginx/script/compile.sh +11 -0
  13. package/dist/deploy/nginx/script/fix.sh +24 -0
  14. package/dist/deploy/nginx/script/https.sh +79 -0
  15. package/dist/deploy/nginx/script/install.sh +99 -0
  16. package/dist/deploy/nginx/script/prompt.sh +10 -0
  17. package/dist/deploy/nginx/script/upgrade.sh +7 -0
  18. package/dist/deploy/pkg/nginx/nginx.service.tpl +33 -0
  19. package/dist/deploy/script/common.sh +183 -0
  20. package/dist/deploy/script/install.sh +51 -0
  21. package/dist/deploy/script/nginx.sh +156 -0
  22. package/dist/deploy/script/prompt.sh +98 -0
  23. package/dist/deploy/script/readme.md +10 -0
  24. package/dist/deploy/script/upgrade.sh +50 -0
  25. package/dist/logger.js +20 -0
  26. package/dist/pack.js +111 -0
  27. package/dist/prepare.js +75 -0
  28. package/dist/publish.js +238 -0
  29. package/dist/release.js +200 -0
  30. package/package.json +71 -0
  31. package/rollup.config.js +78 -0
  32. package/src/.release/README.md +23 -0
  33. package/src/.release/doc//351/203/250/347/275/262/346/211/213/345/206/214.md +426 -0
  34. package/src/.release/nginx/ca/ca.crt +32 -0
  35. package/src/.release/nginx/ca/ca.key +54 -0
  36. package/src/.release/nginx/ca/client.crt +100 -0
  37. package/src/.release/nginx/ca/client.csr +16 -0
  38. package/src/.release/nginx/ca/client.p12 +0 -0
  39. package/src/.release/nginx/ca/client.pem +30 -0
  40. package/src/.release/nginx/ca/server.crt +101 -0
  41. package/src/.release/nginx/ca/server.csr +17 -0
  42. package/src/.release/nginx/ca/server.key +27 -0
  43. package/src/.release/nginx/ca/server.pem +30 -0
  44. package/src/.release/nginx/nginx.conf +179 -0
  45. package/src/.release/release.conf.yaml +9 -0
  46. package/src/cli.ts +99 -0
  47. package/src/deploy/nginx/README.md +1 -0
  48. package/src/deploy/nginx/pkg/nginx-arm-ssl1.1.1.tar.gz +0 -0
  49. package/src/deploy/nginx/pkg/nginx-x86_64-ssl1.0.2.tar.gz +0 -0
  50. package/src/deploy/nginx/pkg/nginx-x86_64-ssl1.1.1.tar.gz +0 -0
  51. package/src/deploy/nginx/pkg/nginx-x86_64-ssl3.0.7.tar.gz +0 -0
  52. package/src/deploy/nginx/script/common.sh +178 -0
  53. package/src/deploy/nginx/script/compile.sh +11 -0
  54. package/src/deploy/nginx/script/fix.sh +24 -0
  55. package/src/deploy/nginx/script/https.sh +79 -0
  56. package/src/deploy/nginx/script/install.sh +99 -0
  57. package/src/deploy/nginx/script/prompt.sh +10 -0
  58. package/src/deploy/nginx/script/upgrade.sh +7 -0
  59. package/src/deploy/pkg/nginx/nginx.service.tpl +33 -0
  60. package/src/deploy/script/common.sh +183 -0
  61. package/src/deploy/script/install.sh +51 -0
  62. package/src/deploy/script/nginx.sh +156 -0
  63. package/src/deploy/script/prompt.sh +98 -0
  64. package/src/deploy/script/readme.md +10 -0
  65. package/src/deploy/script/upgrade.sh +50 -0
  66. package/src/logger.ts +18 -0
  67. package/src/pack.ts +141 -0
  68. package/src/prepare.ts +105 -0
  69. package/src/publish.ts +308 -0
  70. package/src/release.ts +292 -0
  71. package/tsconfig.json +14 -0
@@ -0,0 +1,98 @@
1
+ #!/bin/bash
2
+ log "-----------receive parameter: $@------------"
3
+
4
+ # if [ $# == 0 ]; then
5
+ # log_error "Fatal error: parameter -standalone or -cluster is required!"
6
+ # exit 1
7
+ # fi
8
+
9
+ mode=""
10
+ while [ $# -gt 0 ]; do
11
+ case "$1" in
12
+ -S | -standalone)
13
+ mode=1
14
+ shift
15
+ ;;
16
+ -C | -cluster)
17
+ mode=2
18
+ shift
19
+ ;;
20
+ -h | --help)
21
+ echo "supported parameters: "
22
+ echo "-S, -standalone install for supervisord startup mode, conflict with -C"
23
+ echo "-C, -cluster install for systemd startup mode, conflict with -S"
24
+ echo "-P, -prefix specify the install path"
25
+ exit 0
26
+ ;;
27
+ -P | -prefix)
28
+ case "$2" in
29
+ "")
30
+ if [ $# -eq 1 ]; then
31
+ break
32
+ else
33
+ shift 2
34
+ fi
35
+ ;;
36
+ -*) shift ;;
37
+ *)
38
+ prefix=$2
39
+ if [ $# -eq 2 ]; then
40
+ break
41
+ else
42
+ shift 2
43
+ fi
44
+ ;;
45
+ esac
46
+ ;;
47
+ --)
48
+ shift
49
+ break
50
+ ;;
51
+ "")
52
+ echo 'no args'
53
+ break
54
+ ;;
55
+ *)
56
+ log_error "invalid parameter: {$1}"
57
+ exit 1
58
+ ;;
59
+ esac
60
+ done
61
+
62
+ if [[ -z "${mode}" ]]; then
63
+ log_error "Fatal error: parameter -standalone or -cluster is required!"
64
+ exit 1
65
+ # echo "Please choose an redis installation mode!"
66
+ # PS3='Please input the number: '
67
+ # options=("Standalone 1" "Cluster 2" "Quit")
68
+ # select opt in "${options[@]}"; do
69
+ # case $opt in
70
+ # "Standalone 1")
71
+ # mode=1
72
+ # break
73
+ # ;;
74
+ # "Cluster 2")
75
+ # mode=2
76
+ # break
77
+ # ;;
78
+ # "Quit")
79
+ # break
80
+ # ;;
81
+ # *) echo "invalid option $REPLY" ;;
82
+ # esac
83
+ # done
84
+ fi
85
+
86
+ if ((mode == 1)); then
87
+ log "-------------------------------------------------"
88
+ log "-------start to install Standalone mode-------"
89
+ log "-------------------------------------------------"
90
+ fi
91
+
92
+ if ((mode == 2)); then
93
+ log "-------------------------------------------------"
94
+ log "-------start to install Cluster mode-------"
95
+ log "-------------------------------------------------"
96
+ fi
97
+
98
+ # echo "install/upgrade prefix: $prefix"
@@ -0,0 +1,10 @@
1
+
2
+ nginx
3
+ Install
4
+ --> 选择mode
5
+ -> 检测nginx是否有可执行文件,
6
+ a. 若无 --> 安装
7
+ b. 若有 --> 询问是否替换安装
8
+ --> 资源部署
9
+ 1. 生成对应 xxx.nginx.conf (替换对应日志xxx.nginx.log、进程和生成 xxx.nginx.service)
10
+ 2. 复制静态资源文件
@@ -0,0 +1,50 @@
1
+ #!/bin/bash
2
+ # 获取脚本所在的目录
3
+ basepath=$(dirname "$(realpath "${BASH_SOURCE[-1]}")")
4
+
5
+ source "$basepath"/common.sh
6
+
7
+ # 未安装
8
+ if ((has_nginx_installed == 0)); then
9
+ # while true; do
10
+ # read -r -p "Nginx not found, install it?[Y/N]" yn
11
+ # case $yn in
12
+ # [Yy]*)
13
+ # chmod +x "$basepath"/../nginx/script/install.sh
14
+ # sh "$basepath"/../nginx/script/install.sh
15
+ # break
16
+ # ;;
17
+ # [Nn]*) exit ;;
18
+ # *) echo "Please answer yes or no." ;;
19
+ # esac
20
+ # done
21
+ chmod +x "$basepath"/../nginx/script/install.sh
22
+ sh "$basepath"/../nginx/script/install.sh "${@}"
23
+
24
+ if [[ $? != 0 ]]; then
25
+ echo "$(tput setaf 1)"failed to install!"$(tput sgr0)"
26
+ exit 1
27
+ fi
28
+ fi
29
+
30
+ # 已安装 询问是否更新nginx
31
+ if ((has_nginx_installed == 1)); then
32
+ while true; do
33
+ read -r -p "Nginx has been installed, re-install it?[Y/N]" yn
34
+ case $yn in
35
+ [Yy]*)
36
+ chmod +x "$basepath"/../nginx/script/install.sh
37
+ sh "$basepath"/../nginx/script/install.sh "${@}"
38
+ if [[ $? != 0 ]]; then
39
+ echo "$(tput setaf 1)"failed to install!"$(tput sgr0)"
40
+ exit 1
41
+ fi
42
+ break
43
+ ;;
44
+ [Nn]*) break ;;
45
+ *) echo "Please answer yes or no." ;;
46
+ esac
47
+ done
48
+ fi
49
+
50
+ start
package/src/logger.ts ADDED
@@ -0,0 +1,18 @@
1
+ import pc from 'picocolors';
2
+
3
+ export const logger = {
4
+ info: (msg: string) => {
5
+ console.info(`---------------------- ${msg} ----------------------`)
6
+ },
7
+ error: (msg: string) => {
8
+ console.log(`---------------------- ${pc.red(msg)} ----------------------`)
9
+ },
10
+ success: (msg: string) => {
11
+ console.info("--------------------------------------------------------------");
12
+ console.info(`---------🚀 ${pc.green(msg)} ----------------`);
13
+ console.info("--------------------------------------------------------------");
14
+ },
15
+ tip: (msg: string) => {
16
+ console.log(`---------------------- ${pc.yellow(msg)} ----------------------`)
17
+ }
18
+ }
package/src/pack.ts ADDED
@@ -0,0 +1,141 @@
1
+ import fs from "fs"
2
+ import path from "path"
3
+
4
+ import * as inquirer from "@inquirer/prompts"
5
+ import pc from "picocolors"
6
+ import * as tar from 'tar'
7
+
8
+ import { __work_dir, __releaseDir, __dirname, releaseConf } from './prepare'
9
+ import { logger } from "./logger"
10
+
11
+ export async function pack(version?: string) {
12
+ try {
13
+
14
+ if (version === undefined) {
15
+ version = await inquirer.input(
16
+ {
17
+ message: '请输入版本号:',
18
+ },
19
+ )
20
+ }
21
+
22
+ if (version == '') {
23
+ logger.error('版本号不能为空!')
24
+ return
25
+ }
26
+
27
+ const packageJson = JSON.parse(fs.readFileSync(path.resolve(__work_dir, 'package.json'), { 'encoding': 'utf-8' }))
28
+ const projectName = packageJson.name as string;
29
+
30
+ if (!projectName) {
31
+ logger.error('未在package.json找到name定义!')
32
+ return
33
+ }
34
+
35
+ const zipFileName = `${projectName}_${version}.tar.gz`
36
+
37
+ logger.tip(`start to pack`)
38
+
39
+ const projectDir = path.resolve(__releaseDir, projectName); //eg .release/posidon-frontend
40
+ const assetsDir = path.resolve(projectDir, 'pkg/assets');
41
+ const nginxDir = path.resolve(projectDir, 'pkg/nginx')
42
+
43
+ // 复制整个安装脚本和nginx二进制包
44
+ fs.cpSync(path.resolve(__dirname, 'deploy'), projectDir, { recursive: true })
45
+ // 复制打包后的静态资源
46
+ fs.cpSync(path.resolve(__work_dir, releaseConf.assetsDir), assetsDir, { recursive: true })
47
+
48
+ // 添加版本信息
49
+ fs.writeFileSync(path.resolve(projectDir, 'pkg', 'version'), version, { encoding: 'utf-8' })
50
+ fs.writeFileSync(path.resolve(assetsDir, 'version'), version, { encoding: 'utf-8' })
51
+ fs.writeFileSync(path.resolve(nginxDir, 'version'), version, { encoding: 'utf-8' })
52
+
53
+ logger.info(pc.green(`version: ${version} added`))
54
+
55
+ const assetInstallPath = `/opt/${projectName}/`
56
+ logger.info(pc.green(`start to replace __APP_NAME__ in common.sh`))
57
+
58
+ // 替换安装脚本 与nginx匹配的名称
59
+ replaceFileContent({
60
+ filePath: path.resolve(projectDir, 'script', 'common.sh'),
61
+ replaced: [
62
+ ['__APP_NAME__', `"${projectName}"`],
63
+ ['__INSTALL_PATH__', assetInstallPath]
64
+ ]
65
+ })
66
+
67
+ logger.info(pc.green(`start to replace version: ${version} in index.html`))
68
+
69
+ replaceFileContent({
70
+ filePath: path.resolve(assetsDir, 'index.html'),
71
+ replaced: [['__version__', version]]
72
+ })
73
+
74
+ // 生成nginx.conf文件
75
+ logger.info(pc.green(`start to generate nginx.conf`))
76
+
77
+ //复制用户指定的nginx配置信息
78
+ fs.cpSync(path.resolve(__releaseDir, 'nginx'), nginxDir, { recursive: true, force: true })
79
+
80
+ replaceFileContent({
81
+ filePath: path.resolve(nginxDir, 'nginx.conf'),
82
+ replaced: [['__root__', `${assetInstallPath}/assets/`]],
83
+ // writeToNewFilePath: path.resolve(nginxDir, `${projectName}.conf`)
84
+ })
85
+
86
+ logger.info(pc.green(`start to generate ${zipFileName}`))
87
+
88
+ const zipFilePath = path.resolve(__releaseDir, zipFileName)
89
+ await genTarPkg(__releaseDir, projectName, zipFilePath);
90
+
91
+ logger.success(`done to pack ${pc.green(`${zipFileName} at: ${__releaseDir}`)}`);
92
+
93
+ if (fs.existsSync(projectDir)) {
94
+ fs.rmSync(projectDir, { recursive: true, force: true })
95
+ }
96
+
97
+ return {
98
+ version,
99
+ pkgName: zipFileName,
100
+ appName: projectName,
101
+ pkgFilePath: zipFilePath
102
+ }
103
+ } catch (error) {
104
+ console.error('Error:', error);
105
+ return Promise.reject(error);
106
+ }
107
+ }
108
+
109
+ function genTarPkg(releaseDir: string, projectName: string, zipFileName: string) {
110
+ return new Promise((resolve, reject) => {
111
+ const zipStream = fs.createWriteStream(zipFileName);
112
+ zipStream.on('close', () => {
113
+ resolve(true);
114
+ })
115
+
116
+ try {
117
+ tar.create(
118
+ {
119
+ z: true,
120
+ cwd: releaseDir,
121
+ },
122
+ [projectName],
123
+ ).pipe(zipStream)
124
+ } catch (error) {
125
+ reject(error);
126
+ }
127
+ })
128
+ }
129
+
130
+ function replaceFileContent(params: {filePath: string; writeToNewFilePath?: string; replaced: [string, string][] }) {
131
+ const { filePath, writeToNewFilePath, replaced = [] } = params
132
+ if (fs.existsSync(filePath)) {
133
+ let content = fs.readFileSync(filePath, { encoding: 'utf-8' })
134
+
135
+ replaced.forEach(([regExp, replaceContent]) => {
136
+ content = content.toString().replace(regExp, replaceContent);
137
+ });
138
+
139
+ fs.writeFileSync(writeToNewFilePath ? writeToNewFilePath : filePath, content, { encoding: 'utf-8' })
140
+ }
141
+ }
package/src/prepare.ts ADDED
@@ -0,0 +1,105 @@
1
+ import path, { dirname } from "path";
2
+ import fs from "fs"
3
+ import YAML from 'yaml';
4
+ import * as inquirer from "@inquirer/prompts"
5
+
6
+ import { execa } from 'execa';
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ import { logger } from './logger';
10
+
11
+ export type ReleaseConf = {
12
+ /** gitlab 仓库地址 */
13
+ host: string
14
+ /** gitlab rest api token */
15
+ token: string
16
+ /** 打包脚本 默认npm run build */
17
+ buildCmd?: string
18
+ /** 打包后资源 相对工作区所在路径 默认dist/*/
19
+ assetsDir?: string
20
+ }
21
+
22
+ export const __work_dir = process.cwd();
23
+ export const __releaseDir = path.resolve(__work_dir, '.release')
24
+
25
+ const __filename = fileURLToPath(import.meta.url);
26
+ export const __dirname = dirname(__filename);
27
+
28
+ export const releaseConfFileName = "release.conf.yaml"
29
+ export const __releaseConfPath = path.resolve(__releaseDir, releaseConfFileName);
30
+
31
+ function parseConf(file: string) {
32
+ try {
33
+ const conf = fs.readFileSync(file, "utf-8");
34
+ return YAML.parse(conf) as ReleaseConf
35
+ } catch (error) {
36
+ return {} as ReleaseConf;
37
+ }
38
+ }
39
+
40
+ export const releaseConf = Object.assign({
41
+ /** 打包脚本 默认npm run build */
42
+ buildCmd: 'npm run build',
43
+ /** 打包后资源 相对工作区所在路径 默认dist/*/
44
+ assetsDir: 'dist'
45
+ }, parseConf(__releaseConfPath));
46
+
47
+ export const $ = execa({ encoding: 'utf8' });
48
+
49
+ export async function prepare() {
50
+ const copyFiles = () => {
51
+ // 将.release file copy 到__work_dir 目录下
52
+ fs.cpSync(path.resolve(__dirname, '.release'), __releaseDir, { recursive: true })
53
+ }
54
+
55
+ if (!fs.existsSync(__releaseDir)) {
56
+
57
+ fs.mkdirSync(__releaseDir)
58
+ copyFiles();
59
+ logger.tip(`请注意修改.release/${releaseConfFileName} 配置信息`)
60
+ }else {
61
+
62
+ const shouldRegenerate = await inquirer.confirm(
63
+ {
64
+ message: '.release配置已存在,是否重新生成?',
65
+ },
66
+ )
67
+
68
+ if(shouldRegenerate){
69
+ copyFiles()
70
+ }
71
+ }
72
+ }
73
+
74
+ export async function checkEnvInfo() {
75
+ // 检查是否在 git 仓库中
76
+ const { stdout: isGitRepo } = await $(`git rev-parse --is-inside-work-tree`)
77
+ if (isGitRepo !== 'true') {
78
+ logger.error('当前项目不是git仓库')
79
+ process.exit(1);
80
+ }
81
+
82
+ // 检查.release下 nginx.conf, release.conf.yaml 等文件是否存在
83
+
84
+ if (!fs.existsSync(path.resolve(__releaseDir, 'nginx/nginx.conf'))) {
85
+ logger.error('.release目录下不存在nginx/nginx.conf 文件, 请使用 release-helper init 初始化生成')
86
+ process.exit(1);
87
+ }
88
+
89
+ if (!fs.existsSync(__releaseConfPath)) {
90
+ logger.error(`.release目录下不存在${releaseConfFileName}文件,请使用 release-helper init 初始化生成`)
91
+ process.exit(1);
92
+ }
93
+
94
+ const { host, token } = releaseConf;
95
+ if (!host) {
96
+ logger.error(`The host field is required in the configuration file!`);
97
+ process.exit(1);
98
+ }
99
+
100
+ if (!token) {
101
+ logger.error(`The token field is required in the configuration file!`);
102
+ process.exit(1);
103
+ }
104
+ }
105
+