airport2 0.0.3 → 0.0.4
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.
- package/CHANGELOG.md +9 -0
- package/README.md +5 -6
- package/{airport-docker.ts → example/airport-docker.ts} +2 -2
- package/{airport.ts → example/airport.ts} +2 -2
- package/example/airstep.ts +12 -0
- package/example/airtask.ts +38 -0
- package/package.json +1 -1
- package/src/airport/air/pipeline.ts +2 -2
- package/src/airport/air/step.ts +1 -1
- package/src/airport/air/task.ts +2 -2
- package/src/airport/lib/remote.ts +6 -0
- package/src/airport/lib/run.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## [0.0.4] - 2025-06-27
|
|
5
|
+
|
|
6
|
+
* 一些优化
|
|
7
|
+
* 更多范例详见`example`目录
|
|
8
|
+
* `run`函数默认注入父进程的`env`环境变量
|
|
9
|
+
* 统一Step和Task的`run`方法,支持直接运行`Step.run`和`Task.run`
|
|
10
|
+
|
|
11
|
+
|
|
4
12
|
## [0.0.3] - 2025-06-26
|
|
5
13
|
|
|
6
14
|
* 日志染色,高亮关键信息,更容易区分日志信息
|
|
7
15
|
* 优化部分代码,提高可读性和可维护性
|
|
8
16
|
* Step添加`skip`属性,支持跳过执行,默认为`false`
|
|
9
17
|
|
|
18
|
+
|
|
10
19
|
## [0.0.2] - 2025-06-26
|
|
11
20
|
|
|
12
21
|
* 一些优化
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Airport
|
|
2
2
|
|
|
3
|
-
使用`ts
|
|
3
|
+
使用`ts`编写流水线
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
bun add airport2
|
|
@@ -32,7 +32,7 @@ bun airport.ts // 也可以将命令添加到package.json中
|
|
|
32
32
|
|
|
33
33
|
## Example
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
**常规构建发布范例**
|
|
36
36
|
|
|
37
37
|
```ts
|
|
38
38
|
import { name, version } from './package.json'
|
|
@@ -74,14 +74,13 @@ const deployTask = new Task({
|
|
|
74
74
|
PipeLine.run([deployTask])
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
docker
|
|
77
|
+
**docker构建范例**
|
|
78
78
|
|
|
79
79
|
```ts
|
|
80
80
|
import { name, version } from './package.json'
|
|
81
81
|
import { PipeLine, Task } from 'airport2'
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
const deployTask = new Task({
|
|
83
|
+
const dockerTask = new Task({
|
|
85
84
|
name: '部署docker应用',
|
|
86
85
|
steps: [
|
|
87
86
|
{
|
|
@@ -95,5 +94,5 @@ const deployTask = new Task({
|
|
|
95
94
|
],
|
|
96
95
|
})
|
|
97
96
|
|
|
98
|
-
|
|
97
|
+
dockerTask.run()
|
|
99
98
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join } from 'path'
|
|
2
|
-
import { name, version } from '
|
|
3
|
-
import { PipeLine, Task, remote,
|
|
2
|
+
import { name, version } from '../package.json'
|
|
3
|
+
import { PipeLine, Task, remote, logError } from '../src/airport'
|
|
4
4
|
|
|
5
5
|
const file = [name, version].join('-') + '.tgz'
|
|
6
6
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { join } from 'path'
|
|
2
|
+
import { name, version } from '../package.json'
|
|
3
|
+
import { Task, remote, logError } from '../src/airport'
|
|
4
|
+
|
|
5
|
+
const file = [name, version].join('-') + '.tgz'
|
|
6
|
+
|
|
7
|
+
// 创建部署任务
|
|
8
|
+
const deployTask = new Task({
|
|
9
|
+
name: '部署应用',
|
|
10
|
+
steps: [
|
|
11
|
+
{
|
|
12
|
+
name: '构建项目',
|
|
13
|
+
run: [
|
|
14
|
+
'mkdir -p .cache',
|
|
15
|
+
'mv `npm pack` .cache/',
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: '发布到远程服务器',
|
|
20
|
+
async run() {
|
|
21
|
+
const ssh = remote('gavin@192.168.5.121')
|
|
22
|
+
const dir = (path?: string) => join('/home/gavin/test', path ?? '')
|
|
23
|
+
try {
|
|
24
|
+
await ssh.run('rm -f', dir('latest'))
|
|
25
|
+
await ssh.run('mkdir -p', dir(version))
|
|
26
|
+
await ssh.scp(`.cache/${file}`, dir())
|
|
27
|
+
await ssh.run('tar -zxvf', dir(file), '-C', dir(version))
|
|
28
|
+
await ssh.run('ln -s', dir(version), dir('latest'))
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
logError(e)
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
deployTask.run()
|
package/package.json
CHANGED
|
@@ -17,10 +17,10 @@ export class PipeLine {
|
|
|
17
17
|
* 执行任务中的所有步骤
|
|
18
18
|
*/
|
|
19
19
|
async run() {
|
|
20
|
-
log(purple('Pipe'), gray('Start'), '
|
|
20
|
+
log(purple('Pipe'), gray('Start'), '-------------------------')
|
|
21
21
|
|
|
22
22
|
for (const task of this.tasks) {
|
|
23
|
-
await task.
|
|
23
|
+
await task.run()
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
log(`------------- ${purple("Pipe")} ${gray('End')} -------------`)
|
package/src/airport/air/step.ts
CHANGED
package/src/airport/air/task.ts
CHANGED
|
@@ -16,7 +16,7 @@ export class Task {
|
|
|
16
16
|
/**
|
|
17
17
|
* 执行任务中的所有步骤
|
|
18
18
|
*/
|
|
19
|
-
async
|
|
19
|
+
async run(test: boolean = false) {
|
|
20
20
|
const steps = this.steps.map((step) => new Step(step, test))
|
|
21
21
|
|
|
22
22
|
log(purple('Task'), gray('Start'), blue(this.name))
|
|
@@ -24,7 +24,7 @@ export class Task {
|
|
|
24
24
|
for (const step of steps) {
|
|
25
25
|
if (!step.skip) {
|
|
26
26
|
log(purple('Step'), gray('Start'), blue(step.name))
|
|
27
|
-
step.skip || (await step.
|
|
27
|
+
step.skip || (await step.run())
|
|
28
28
|
log(purple('Step'), gray('End'), blue(step.name))
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -21,6 +21,12 @@ class Remote {
|
|
|
21
21
|
await run(`ssh ${this.opt.ssh} "${cmd.join(' ')}"`)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* scp远程复制文件
|
|
26
|
+
* @param src 本地路径 e.g. `.cache/app-0.0.1.tgz`
|
|
27
|
+
* @param dist 远程服务器绝对路径,支持文件夹和文件,e.g. `/tmp/test.txt` or `/tmp`
|
|
28
|
+
* @returns Promise<void>
|
|
29
|
+
*/
|
|
24
30
|
async scp(src: string, dist: string) {
|
|
25
31
|
await run(`scp ${src} ${this.opt.ssh}:${dist}`)
|
|
26
32
|
}
|