@ticatec/omniflow-aliyun 1.0.0
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/LICENSE +21 -0
- package/README.md +100 -0
- package/README_CN.md +100 -0
- package/dist/client/AliyunClient.d.ts +7 -0
- package/dist/client/AliyunClient.d.ts.map +1 -0
- package/dist/client/AliyunClient.js +6 -0
- package/dist/client/AliyunClient.js.map +1 -0
- package/dist/docker/AliyunAcrPublisher.d.ts +22 -0
- package/dist/docker/AliyunAcrPublisher.d.ts.map +1 -0
- package/dist/docker/AliyunAcrPublisher.js +54 -0
- package/dist/docker/AliyunAcrPublisher.js.map +1 -0
- package/dist/generic/AliyunGenericPublisher.d.ts +35 -0
- package/dist/generic/AliyunGenericPublisher.d.ts.map +1 -0
- package/dist/generic/AliyunGenericPublisher.js +212 -0
- package/dist/generic/AliyunGenericPublisher.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/maven/AliyunMavenPublisher.d.ts +41 -0
- package/dist/maven/AliyunMavenPublisher.d.ts.map +1 -0
- package/dist/maven/AliyunMavenPublisher.js +261 -0
- package/dist/maven/AliyunMavenPublisher.js.map +1 -0
- package/dist/npm/AliyunNpmPublisher.d.ts +17 -0
- package/dist/npm/AliyunNpmPublisher.d.ts.map +1 -0
- package/dist/npm/AliyunNpmPublisher.js +63 -0
- package/dist/npm/AliyunNpmPublisher.js.map +1 -0
- package/package.json +58 -0
- package/src/client/AliyunClient.ts +14 -0
- package/src/docker/AliyunAcrPublisher.ts +61 -0
- package/src/generic/AliyunGenericPublisher.ts +273 -0
- package/src/index.ts +56 -0
- package/src/maven/AliyunMavenPublisher.ts +330 -0
- package/src/npm/AliyunNpmPublisher.ts +76 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ticatec
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# @ticatec/omniflow-aliyun
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
[](https://nodejs.org/)
|
|
5
|
+
|
|
6
|
+
[中文文档](./README_CN.md)
|
|
7
|
+
|
|
8
|
+
Alibaba Cloud (Aliyun) artifact management driver for OmniFlow. Provides out-of-the-box publishing drivers for Aliyun Container Registry (ACR), Apsara DevOps (云效) Packages (NPM, Maven), and Generic archives.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- **Aliyun ACR (`AliyunAcrPublisher`)**:
|
|
15
|
+
- Supports Personal Edition (`registry.<region>.aliyuncs.com`) and Enterprise Edition (`<instance>-registry.<region>.cr.aliyuncs.com`).
|
|
16
|
+
- Supports public and internal VPC endpoints (`-vpc`).
|
|
17
|
+
- Strict hostname segment matching.
|
|
18
|
+
- **Aliyun Packages NPM (`AliyunNpmPublisher`)**:
|
|
19
|
+
- Publishes npm packages to `https://packages.aliyun.com/npm/registry/<repoId>/`.
|
|
20
|
+
- Supports custom Yunxiao console repository URLs (e.g. `https://packages.aliyun.com/<orgId>/npm/registry/<repoId>/`) via path escape hatch.
|
|
21
|
+
- Mandatory repository ID (via `registry.namespace` or full server URL).
|
|
22
|
+
- Clean `.npmrc` lifecycle with automatic temporary token injection and 100% credential restoration/cleanup upon completion or failure.
|
|
23
|
+
- **Aliyun Packages Maven (`AliyunMavenPublisher`)**:
|
|
24
|
+
- Publishes Java JAR and POM packages to `https://packages.aliyun.com/maven/repository/<repoId>/` or custom console URLs.
|
|
25
|
+
- Mandatory `groupId` and repository ID validation (no guessing).
|
|
26
|
+
- Status verification for POM uploads and secret masking on network errors.
|
|
27
|
+
- Implements idempotent `exists()` probe for `force: false` skip checks.
|
|
28
|
+
- **Aliyun Generic Archive (`AliyunGenericPublisher`)**:
|
|
29
|
+
- Publishes frontend distribution packages (`tar.gz`, `zip`) or binary archives to Aliyun.
|
|
30
|
+
- Mandatory repository ID validation and custom URL escape hatch.
|
|
31
|
+
- Implements idempotent `exists()` probe for `force: false` skip checks.
|
|
32
|
+
- Implements `download()`, which `deploy.web` uses to fetch an archive by name and version.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## How to Register
|
|
37
|
+
|
|
38
|
+
### 1. One-Click Registration
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { defaultArtifactPublisherRegistry } from '@ticatec/omniflow-artifact'
|
|
42
|
+
import { registerAliyun } from '@ticatec/omniflow-aliyun'
|
|
43
|
+
|
|
44
|
+
// Register all Aliyun publishers into the artifact registry
|
|
45
|
+
registerAliyun({ artifactRegistry: defaultArtifactPublisherRegistry })
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Granular Registration
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { registerArtifactPublisher } from '@ticatec/omniflow-artifact'
|
|
52
|
+
import {
|
|
53
|
+
AliyunAcrPublisher,
|
|
54
|
+
AliyunNpmPublisher,
|
|
55
|
+
AliyunMavenPublisher,
|
|
56
|
+
AliyunGenericPublisher
|
|
57
|
+
} from '@ticatec/omniflow-aliyun'
|
|
58
|
+
|
|
59
|
+
registerArtifactPublisher(new AliyunAcrPublisher())
|
|
60
|
+
registerArtifactPublisher(new AliyunNpmPublisher())
|
|
61
|
+
registerArtifactPublisher(new AliyunMavenPublisher())
|
|
62
|
+
registerArtifactPublisher(new AliyunGenericPublisher())
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Configuration Example (`omniflow.yaml`)
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
omniflow:
|
|
71
|
+
registries:
|
|
72
|
+
# 1. Aliyun ACR Docker Registry
|
|
73
|
+
docker:
|
|
74
|
+
aliyun:
|
|
75
|
+
server: registry.cn-hangzhou.aliyuncs.com
|
|
76
|
+
namespace: myorg
|
|
77
|
+
username: ${ALIYUN_USER}
|
|
78
|
+
password: ${ALIYUN_PASSWORD}
|
|
79
|
+
|
|
80
|
+
# 2. Aliyun Packages NPM Registry
|
|
81
|
+
npm:
|
|
82
|
+
aliyun:
|
|
83
|
+
server: https://packages.aliyun.com
|
|
84
|
+
namespace: my-npm-repo-id
|
|
85
|
+
token: ${ALIYUN_PACKAGES_TOKEN}
|
|
86
|
+
|
|
87
|
+
# 3. Aliyun Packages Maven Registry
|
|
88
|
+
maven:
|
|
89
|
+
aliyun:
|
|
90
|
+
server: https://packages.aliyun.com
|
|
91
|
+
namespace: my-maven-repo-id
|
|
92
|
+
username: ${ALIYUN_USER}
|
|
93
|
+
token: ${ALIYUN_PACKAGES_TOKEN}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
MIT License.
|
package/README_CN.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# @ticatec/omniflow-aliyun
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
[](https://nodejs.org/)
|
|
5
|
+
|
|
6
|
+
[English](./README.md)
|
|
7
|
+
|
|
8
|
+
OmniFlow 官方阿里云(Aliyun)制品管理驱动模块。提供对阿里云容器镜像服务(ACR)、云效私有制品仓库(NPM、Maven)以及通用归档制品的开箱即用支持。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 核心特性
|
|
13
|
+
|
|
14
|
+
- **阿里云 ACR 容器镜像服务 (`AliyunAcrPublisher`)**:
|
|
15
|
+
- 自动适配 **ACR 个人版**(`registry.<region>.aliyuncs.com`)与 **ACR 企业版**(`<instance>-registry.<region>.cr.aliyuncs.com`);
|
|
16
|
+
- 支持公网及 VPC 内网传输加速域名(`-vpc` 后缀);
|
|
17
|
+
- 严格的主机名分段比对,阻断同名子串冒名匹配。
|
|
18
|
+
- **云效 NPM 私有库 (`AliyunNpmPublisher`)**:
|
|
19
|
+
- 发布 npm 包至 `https://packages.aliyun.com/npm/registry/<repoId>/`;
|
|
20
|
+
- 支持云效控制台自定义完整路径逃生口(如 `https://packages.aliyun.com/<orgId>/npm/registry/<repoId>/`);
|
|
21
|
+
- 严格要求仓库 ID / 命名空间(严禁兜底 guessing);
|
|
22
|
+
- 依托基类会话沙箱,在发布结束后或异常退出时 100% 逐字还原或销毁 `.npmrc`,零凭据残留。
|
|
23
|
+
- **云效 Maven 私有库 (`AliyunMavenPublisher`)**:
|
|
24
|
+
- 发布 Java JAR 和 POM 至 `https://packages.aliyun.com/maven/repository/<repoId>/` 或自定义控制台完整地址;
|
|
25
|
+
- 严格校验 `groupId` 与仓库 ID(禁止错误兜底为 `'com.aliyun'`);
|
|
26
|
+
- 严格校验 POM 上传状态,网络请求内置超时及错误信息脱敏;
|
|
27
|
+
- 实现 `exists()` HEAD 探针探测,支持 `force: false` 安全跳过。
|
|
28
|
+
- **通用归档 / OSS 制品 (`AliyunGenericPublisher`)**:
|
|
29
|
+
- 支持将前端打包产物(`tar.gz`、`zip`)或二进制文件发布至阿里云通用制品库;
|
|
30
|
+
- 严格校验仓库 ID,支持控制台自定义完整路径逃生口;
|
|
31
|
+
- 实现 `exists()` HEAD 探针探测,支持 `force: false` 安全跳过;
|
|
32
|
+
- 实现 `download()`,`deploy.web` 用它按名称和版本取回归档。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 如何注册
|
|
37
|
+
|
|
38
|
+
### 1. 一键自动注册
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { defaultArtifactPublisherRegistry } from '@ticatec/omniflow-artifact'
|
|
42
|
+
import { registerAliyun } from '@ticatec/omniflow-aliyun'
|
|
43
|
+
|
|
44
|
+
// 一键向全局制品注册中心注入所有阿里云发布器
|
|
45
|
+
registerAliyun({ artifactRegistry: defaultArtifactPublisherRegistry })
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. 按需独立注册
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { registerArtifactPublisher } from '@ticatec/omniflow-artifact'
|
|
52
|
+
import {
|
|
53
|
+
AliyunAcrPublisher,
|
|
54
|
+
AliyunNpmPublisher,
|
|
55
|
+
AliyunMavenPublisher,
|
|
56
|
+
AliyunGenericPublisher
|
|
57
|
+
} from '@ticatec/omniflow-aliyun'
|
|
58
|
+
|
|
59
|
+
registerArtifactPublisher(new AliyunAcrPublisher())
|
|
60
|
+
registerArtifactPublisher(new AliyunNpmPublisher())
|
|
61
|
+
registerArtifactPublisher(new AliyunMavenPublisher())
|
|
62
|
+
registerArtifactPublisher(new AliyunGenericPublisher())
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 配置范例 (`omniflow.yaml`)
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
omniflow:
|
|
71
|
+
registries:
|
|
72
|
+
# 1. 阿里云 ACR 容器镜像
|
|
73
|
+
docker:
|
|
74
|
+
aliyun:
|
|
75
|
+
server: registry.cn-hangzhou.aliyuncs.com
|
|
76
|
+
namespace: myorg
|
|
77
|
+
username: ${ALIYUN_USER}
|
|
78
|
+
password: ${ALIYUN_PASSWORD}
|
|
79
|
+
|
|
80
|
+
# 2. 阿里云云效 NPM 私有库
|
|
81
|
+
npm:
|
|
82
|
+
aliyun:
|
|
83
|
+
server: https://packages.aliyun.com
|
|
84
|
+
namespace: my-npm-repo-id
|
|
85
|
+
token: ${ALIYUN_PACKAGES_TOKEN}
|
|
86
|
+
|
|
87
|
+
# 3. 阿里云云效 Maven 私有库
|
|
88
|
+
maven:
|
|
89
|
+
aliyun:
|
|
90
|
+
server: https://packages.aliyun.com
|
|
91
|
+
namespace: my-maven-repo-id
|
|
92
|
+
username: ${ALIYUN_USER}
|
|
93
|
+
token: ${ALIYUN_PACKAGES_TOKEN}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 许可证
|
|
99
|
+
|
|
100
|
+
MIT License.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Aliyun API interactions: safe fetch with timeout and credential scrubbing.
|
|
3
|
+
*/
|
|
4
|
+
import { maskSecrets, safeFetch, extractErrorMessage, type SafeFetchOptions } from '@ticatec/omniflow-artifact';
|
|
5
|
+
export type AliyunRequestOptions = SafeFetchOptions;
|
|
6
|
+
export { maskSecrets, safeFetch, extractErrorMessage };
|
|
7
|
+
//# sourceMappingURL=AliyunClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunClient.d.ts","sourceRoot":"","sources":["../../src/client/AliyunClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAA;AAEnC,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAA;AAEnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Aliyun API interactions: safe fetch with timeout and credential scrubbing.
|
|
3
|
+
*/
|
|
4
|
+
import { maskSecrets, safeFetch, extractErrorMessage } from '@ticatec/omniflow-artifact';
|
|
5
|
+
export { maskSecrets, safeFetch, extractErrorMessage };
|
|
6
|
+
//# sourceMappingURL=AliyunClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunClient.js","sourceRoot":"","sources":["../../src/client/AliyunClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,WAAW,EACX,SAAS,EACT,mBAAmB,EAEpB,MAAM,4BAA4B,CAAA;AAInC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseDockerPublisher } from '@ticatec/omniflow-artifact';
|
|
2
|
+
import type { RegistryConfig } from '@ticatec/omniflow-artifact';
|
|
3
|
+
/**
|
|
4
|
+
* Aliyun Container Registry (ACR) Publisher.
|
|
5
|
+
*
|
|
6
|
+
* Supports both:
|
|
7
|
+
* 1. ACR Personal Edition: registry.<region>.aliyuncs.com (Public & VPC internal)
|
|
8
|
+
* 2. ACR Enterprise Edition: <instance>-registry.<region>.cr.aliyuncs.com (Public & VPC internal)
|
|
9
|
+
*/
|
|
10
|
+
export declare class AliyunAcrPublisher extends BaseDockerPublisher {
|
|
11
|
+
readonly id = "aliyun-acr";
|
|
12
|
+
readonly name = "Aliyun ACR";
|
|
13
|
+
readonly platform = "aliyun-acr";
|
|
14
|
+
readonly priority = 20;
|
|
15
|
+
detect(registry: RegistryConfig): boolean;
|
|
16
|
+
buildRepositoryUrl(registry: RegistryConfig, imageName: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Helper to check if registry server points to an internal VPC endpoint.
|
|
19
|
+
*/
|
|
20
|
+
isVpcEndpoint(server: string): boolean;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AliyunAcrPublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunAcrPublisher.d.ts","sourceRoot":"","sources":["../../src/docker/AliyunAcrPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAEhE;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,mBAAmB;IACzD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,QAAQ,gBAAe;IAChC,SAAkB,QAAQ,MAAK;IAEtB,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAuBzC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAehF;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGvC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { BaseDockerPublisher } from '@ticatec/omniflow-artifact';
|
|
2
|
+
/**
|
|
3
|
+
* Aliyun Container Registry (ACR) Publisher.
|
|
4
|
+
*
|
|
5
|
+
* Supports both:
|
|
6
|
+
* 1. ACR Personal Edition: registry.<region>.aliyuncs.com (Public & VPC internal)
|
|
7
|
+
* 2. ACR Enterprise Edition: <instance>-registry.<region>.cr.aliyuncs.com (Public & VPC internal)
|
|
8
|
+
*/
|
|
9
|
+
export class AliyunAcrPublisher extends BaseDockerPublisher {
|
|
10
|
+
id = 'aliyun-acr';
|
|
11
|
+
name = 'Aliyun ACR';
|
|
12
|
+
platform = 'aliyun-acr';
|
|
13
|
+
priority = 20;
|
|
14
|
+
detect(registry) {
|
|
15
|
+
if (registry.type !== 'docker' && registry.type !== 'container') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const regName = (registry.name || '').toLowerCase();
|
|
19
|
+
if (regName === 'aliyun' || regName === 'acr' || regName.startsWith('aliyun-') || regName.startsWith('acr-')) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
const server = (registry.server || '').toLowerCase();
|
|
23
|
+
try {
|
|
24
|
+
const parsed = new URL(server.includes('://') ? server : `https://${server}`);
|
|
25
|
+
const host = parsed.hostname.toLowerCase();
|
|
26
|
+
const segments = host.split('.');
|
|
27
|
+
const isAliyunCs = host === 'aliyuncs.com' || host.endsWith('.aliyuncs.com');
|
|
28
|
+
const isCr = segments.includes('cr') || segments.some(s => s.startsWith('registry'));
|
|
29
|
+
return isAliyunCs && isCr;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
buildRepositoryUrl(registry, imageName) {
|
|
36
|
+
const host = this.normalizeServerHost(registry.server);
|
|
37
|
+
const cleanImage = imageName.replace(/^\/+/, '');
|
|
38
|
+
const ns = (registry.namespace || '').replace(/\/+$/, '');
|
|
39
|
+
if (ns) {
|
|
40
|
+
if (cleanImage.startsWith(`${ns}/`)) {
|
|
41
|
+
return `${host}/${cleanImage}`;
|
|
42
|
+
}
|
|
43
|
+
return `${host}/${ns}/${cleanImage}`;
|
|
44
|
+
}
|
|
45
|
+
return `${host}/${cleanImage}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Helper to check if registry server points to an internal VPC endpoint.
|
|
49
|
+
*/
|
|
50
|
+
isVpcEndpoint(server) {
|
|
51
|
+
return server.toLowerCase().includes('-vpc.');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=AliyunAcrPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunAcrPublisher.js","sourceRoot":"","sources":["../../src/docker/AliyunAcrPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGhE;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,mBAAmB;IAChD,EAAE,GAAG,YAAY,CAAA;IACjB,IAAI,GAAG,YAAY,CAAA;IACnB,QAAQ,GAAG,YAAY,CAAA;IACd,QAAQ,GAAG,EAAE,CAAA;IAEtB,MAAM,CAAC,QAAwB;QACtC,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChE,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACnD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7G,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;YAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,UAAU,GAAG,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;YAC5E,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;YACpF,OAAO,UAAU,IAAI,IAAI,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEQ,kBAAkB,CAAC,QAAwB,EAAE,SAAiB;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAEhD,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACzD,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,GAAG,IAAI,IAAI,UAAU,EAAE,CAAA;YAChC,CAAC;YACD,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,UAAU,EAAE,CAAA;QACtC,CAAC;QAED,OAAO,GAAG,IAAI,IAAI,UAAU,EAAE,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc;QAC1B,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BasePublisher } from '@ticatec/omniflow-artifact';
|
|
2
|
+
import type { ArtifactPayload, DownloadOptions, DownloadResult, PublishOptions, RegistryConfig } from '@ticatec/omniflow-artifact';
|
|
3
|
+
/**
|
|
4
|
+
* Aliyun Generic Packages & Object Storage Archive Publisher.
|
|
5
|
+
*
|
|
6
|
+
* Supports publishing tar.gz/zip frontend builds or binary packages to Aliyun Packages.
|
|
7
|
+
*
|
|
8
|
+
* Endpoint format: https://packages.aliyun.com/generic/repository/<repoId>/
|
|
9
|
+
* Or direct custom console URL: https://packages.aliyun.com/<orgId>/generic/<repoId>/
|
|
10
|
+
*/
|
|
11
|
+
export declare class AliyunGenericPublisher extends BasePublisher {
|
|
12
|
+
readonly id = "aliyun-generic";
|
|
13
|
+
readonly name = "Aliyun Generic Archive";
|
|
14
|
+
readonly platform = "aliyun-generic";
|
|
15
|
+
readonly artifactType = "generic";
|
|
16
|
+
readonly priority = 20;
|
|
17
|
+
detect(registry: RegistryConfig): boolean;
|
|
18
|
+
login(registry: RegistryConfig, _options?: PublishOptions): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the base repository URL.
|
|
21
|
+
* If server already contains path segments (e.g. console URL), respect it directly (M6 fix).
|
|
22
|
+
* If bare host, requires a valid namespace/repoId (M4 fix).
|
|
23
|
+
*/
|
|
24
|
+
protected resolveBaseRepoUrl(registry: RegistryConfig): string;
|
|
25
|
+
protected buildAuthHeaders(username?: string, token?: string, secrets?: string[]): Record<string, string>;
|
|
26
|
+
buildTargetRef(artifact: ArtifactPayload, _registry: RegistryConfig): string;
|
|
27
|
+
exists(artifact: ArtifactPayload, registry: RegistryConfig, options?: PublishOptions): Promise<boolean>;
|
|
28
|
+
download(artifact: ArtifactPayload, registry: RegistryConfig, dest: string, options?: DownloadOptions): Promise<DownloadResult>;
|
|
29
|
+
protected doPublish(artifact: ArtifactPayload, registry: RegistryConfig, options?: PublishOptions): Promise<{
|
|
30
|
+
ref: string;
|
|
31
|
+
digest?: string;
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=AliyunGenericPublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunGenericPublisher.d.ts","sourceRoot":"","sources":["../../src/generic/AliyunGenericPublisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAGlI;;;;;;;GAOG;AACH,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,QAAQ,CAAC,EAAE,oBAAmB;IAC9B,QAAQ,CAAC,IAAI,4BAA2B;IACxC,QAAQ,CAAC,QAAQ,oBAAmB;IACpC,QAAQ,CAAC,YAAY,aAAY;IACjC,SAAkB,QAAQ,MAAK;IAEtB,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAyB5C,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/E;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;IA4B9D,SAAS,CAAC,gBAAgB,CACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE,MAAM,EAAO,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAsBhB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM;IAMtE,MAAM,CACnB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC;IA2CJ,QAAQ,CACrB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC;cA0BV,SAAS,CACvB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,CAAC;CAmEH"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { BasePublisher } from '@ticatec/omniflow-artifact';
|
|
5
|
+
import { safeFetch, extractErrorMessage, maskSecrets } from '../client/AliyunClient.js';
|
|
6
|
+
/**
|
|
7
|
+
* Aliyun Generic Packages & Object Storage Archive Publisher.
|
|
8
|
+
*
|
|
9
|
+
* Supports publishing tar.gz/zip frontend builds or binary packages to Aliyun Packages.
|
|
10
|
+
*
|
|
11
|
+
* Endpoint format: https://packages.aliyun.com/generic/repository/<repoId>/
|
|
12
|
+
* Or direct custom console URL: https://packages.aliyun.com/<orgId>/generic/<repoId>/
|
|
13
|
+
*/
|
|
14
|
+
export class AliyunGenericPublisher extends BasePublisher {
|
|
15
|
+
id = 'aliyun-generic';
|
|
16
|
+
name = 'Aliyun Generic Archive';
|
|
17
|
+
platform = 'aliyun-generic';
|
|
18
|
+
artifactType = 'generic';
|
|
19
|
+
priority = 20;
|
|
20
|
+
detect(registry) {
|
|
21
|
+
if (registry.type !== 'generic' && registry.type !== 'archive') {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const regName = (registry.name || '').toLowerCase();
|
|
25
|
+
if (regName === 'aliyun' || regName.startsWith('aliyun-')) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const server = (registry.server || '').toLowerCase();
|
|
29
|
+
try {
|
|
30
|
+
const parsed = new URL(server.includes('://') ? server : `https://${server}`);
|
|
31
|
+
const host = parsed.hostname.toLowerCase();
|
|
32
|
+
const isAliyun = host === 'aliyun.com' ||
|
|
33
|
+
host.endsWith('.aliyun.com') ||
|
|
34
|
+
host === 'aliyuncs.com' ||
|
|
35
|
+
host.endsWith('.aliyuncs.com');
|
|
36
|
+
return isAliyun;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async login(registry, _options) {
|
|
43
|
+
const creds = this.resolveCredentials(registry);
|
|
44
|
+
if (!creds.token && !creds.username) {
|
|
45
|
+
this.log(` ℹ No credentials configured for Aliyun Generic storage ${registry.server}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the base repository URL.
|
|
50
|
+
* If server already contains path segments (e.g. console URL), respect it directly (M6 fix).
|
|
51
|
+
* If bare host, requires a valid namespace/repoId (M4 fix).
|
|
52
|
+
*/
|
|
53
|
+
resolveBaseRepoUrl(registry) {
|
|
54
|
+
let serverUrl = registry.server.trim();
|
|
55
|
+
if (!/^https?:\/\//i.test(serverUrl)) {
|
|
56
|
+
serverUrl = `https://${serverUrl}`;
|
|
57
|
+
}
|
|
58
|
+
const parsed = new URL(serverUrl);
|
|
59
|
+
const cleanServer = serverUrl.replace(/\/+$/, '');
|
|
60
|
+
// M6 Escape hatch: if server contains path segments beyond '/', use it as-is
|
|
61
|
+
if (parsed.pathname !== '/' && parsed.pathname !== '') {
|
|
62
|
+
return cleanServer;
|
|
63
|
+
}
|
|
64
|
+
const reg = registry;
|
|
65
|
+
const repoId = reg.namespace?.trim() ||
|
|
66
|
+
reg.options?.repoId?.trim() ||
|
|
67
|
+
reg.metadata?.repoId?.trim();
|
|
68
|
+
if (!repoId) {
|
|
69
|
+
throw new Error(`Aliyun Generic publisher requires a valid repository ID (specify via registry.namespace or full server URL)`);
|
|
70
|
+
}
|
|
71
|
+
return `${cleanServer}/generic/repository/${encodeURIComponent(repoId)}`;
|
|
72
|
+
}
|
|
73
|
+
buildAuthHeaders(username, token, secrets = []) {
|
|
74
|
+
const headers = {};
|
|
75
|
+
if (username && token) {
|
|
76
|
+
const basic = Buffer.from(`${username}:${token}`).toString('base64');
|
|
77
|
+
if (basic.length >= 3) {
|
|
78
|
+
secrets.push(basic);
|
|
79
|
+
}
|
|
80
|
+
headers['Authorization'] = `Basic ${basic}`;
|
|
81
|
+
}
|
|
82
|
+
else if (token) {
|
|
83
|
+
if (token.includes(':')) {
|
|
84
|
+
const basic = Buffer.from(token).toString('base64');
|
|
85
|
+
if (basic.length >= 3) {
|
|
86
|
+
secrets.push(basic);
|
|
87
|
+
}
|
|
88
|
+
headers['Authorization'] = `Basic ${basic}`;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return headers;
|
|
95
|
+
}
|
|
96
|
+
buildTargetRef(artifact, _registry) {
|
|
97
|
+
const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
|
|
98
|
+
const filename = artifact.source ? path.basename(artifact.source) : 'artifact';
|
|
99
|
+
return `${artifact.name}/${version}/${filename}`;
|
|
100
|
+
}
|
|
101
|
+
async exists(artifact, registry, options) {
|
|
102
|
+
const creds = this.resolveCredentials(registry);
|
|
103
|
+
const token = creds.token || creds.password;
|
|
104
|
+
const username = creds.username;
|
|
105
|
+
const secrets = [token, creds.password].filter((s) => typeof s === 'string' && s.length >= 3);
|
|
106
|
+
const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
|
|
107
|
+
const packageName = artifact.name;
|
|
108
|
+
const filename = artifact.source ? path.basename(artifact.source) : `${packageName}.tar.gz`;
|
|
109
|
+
const baseRepoUrl = this.resolveBaseRepoUrl(registry);
|
|
110
|
+
const probeUrl = `${baseRepoUrl}/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}/${encodeURIComponent(filename)}`;
|
|
111
|
+
const headers = this.buildAuthHeaders(username, token, secrets);
|
|
112
|
+
const timeoutMs = options?.timeoutMs ?? 10000;
|
|
113
|
+
try {
|
|
114
|
+
const res = await safeFetch(probeUrl, {
|
|
115
|
+
method: 'HEAD',
|
|
116
|
+
headers,
|
|
117
|
+
timeoutMs,
|
|
118
|
+
secrets
|
|
119
|
+
});
|
|
120
|
+
if (res.ok || res.status === 200 || res.status === 204) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (res.status === 404) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const errText = await extractErrorMessage(res, secrets);
|
|
127
|
+
throw new Error(`Failed to check Generic artifact existence (${res.status}): ${errText}`);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (err?.message?.includes('Failed to check Generic artifact existence')) {
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
throw new Error(`Failed to check Generic artifact existence: ${maskSecrets(err?.message || String(err), secrets)}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async download(artifact, registry, dest, options) {
|
|
137
|
+
const creds = this.resolveCredentials(registry);
|
|
138
|
+
const token = creds.token || creds.password;
|
|
139
|
+
const secrets = [token, creds.password].filter((s) => typeof s === 'string' && s.length >= 3);
|
|
140
|
+
const version = artifact.tags?.[0] || 'latest';
|
|
141
|
+
const filename = artifact.source ? path.basename(artifact.source) : `${artifact.name}.tar.gz`;
|
|
142
|
+
const baseRepoUrl = this.resolveBaseRepoUrl(registry);
|
|
143
|
+
const targetUrl = `${baseRepoUrl}/${encodeURIComponent(artifact.name)}/${encodeURIComponent(version)}/${encodeURIComponent(filename)}`;
|
|
144
|
+
const masked = maskSecrets(targetUrl, secrets);
|
|
145
|
+
this.log(` 📥 Downloading ${artifact.name} ${version} from Aliyun: ${masked}`);
|
|
146
|
+
const res = await safeFetch(targetUrl, {
|
|
147
|
+
method: 'GET',
|
|
148
|
+
headers: this.buildAuthHeaders(creds.username, token, secrets),
|
|
149
|
+
timeoutMs: options?.timeoutMs ?? 30000,
|
|
150
|
+
secrets
|
|
151
|
+
});
|
|
152
|
+
if (!res.ok) {
|
|
153
|
+
throw await this.downloadError(res, `${artifact.name} ${version} (${filename})`, masked);
|
|
154
|
+
}
|
|
155
|
+
return this.saveResponse(res, dest, masked);
|
|
156
|
+
}
|
|
157
|
+
async doPublish(artifact, registry, options) {
|
|
158
|
+
const creds = this.resolveCredentials(registry);
|
|
159
|
+
const token = creds.token || creds.password;
|
|
160
|
+
const username = creds.username;
|
|
161
|
+
const secrets = [token, creds.password].filter((s) => typeof s === 'string' && s.length >= 3);
|
|
162
|
+
const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
|
|
163
|
+
const packageName = artifact.name;
|
|
164
|
+
let filePath = artifact.source;
|
|
165
|
+
const stat = await fs.stat(filePath).catch(() => null);
|
|
166
|
+
if (!stat || !stat.isFile()) {
|
|
167
|
+
throw new Error(`Generic artifact source must be an existing file: ${filePath}`);
|
|
168
|
+
}
|
|
169
|
+
const filename = path.basename(filePath);
|
|
170
|
+
const fileBuffer = await fs.readFile(filePath);
|
|
171
|
+
const digest = `sha256:${crypto.createHash('sha256').update(fileBuffer).digest('hex')}`;
|
|
172
|
+
const baseRepoUrl = this.resolveBaseRepoUrl(registry);
|
|
173
|
+
const targetUrl = `${baseRepoUrl}/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}/${encodeURIComponent(filename)}`;
|
|
174
|
+
this.log(` 📤 Uploading Generic package to Aliyun: ${targetUrl}`);
|
|
175
|
+
if (options?.dryRun) {
|
|
176
|
+
this.log(` [dryRun] Would PUT ${filename} (${fileBuffer.length} bytes) to ${targetUrl}`);
|
|
177
|
+
return {
|
|
178
|
+
ref: `${packageName}/${version}/${filename}`,
|
|
179
|
+
digest,
|
|
180
|
+
metadata: { targetUrl, size: fileBuffer.length }
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const headers = {
|
|
184
|
+
'Content-Type': 'application/octet-stream',
|
|
185
|
+
...this.buildAuthHeaders(username, token, secrets)
|
|
186
|
+
};
|
|
187
|
+
const timeoutMs = options?.timeoutMs ?? 30000;
|
|
188
|
+
const res = await safeFetch(targetUrl, {
|
|
189
|
+
method: 'PUT',
|
|
190
|
+
headers,
|
|
191
|
+
body: fileBuffer,
|
|
192
|
+
timeoutMs,
|
|
193
|
+
secrets
|
|
194
|
+
});
|
|
195
|
+
if (!res.ok && res.status !== 201 && res.status !== 200) {
|
|
196
|
+
const errText = await extractErrorMessage(res, secrets);
|
|
197
|
+
throw new Error(`Failed to upload Generic package to Aliyun (${res.status}): ${errText}`);
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
ref: `${packageName}/${version}/${filename}`,
|
|
201
|
+
digest,
|
|
202
|
+
metadata: {
|
|
203
|
+
packageName,
|
|
204
|
+
version,
|
|
205
|
+
filename,
|
|
206
|
+
targetUrl,
|
|
207
|
+
size: fileBuffer.length
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=AliyunGenericPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliyunGenericPublisher.js","sourceRoot":"","sources":["../../src/generic/AliyunGenericPublisher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PluginContext } from '@ticatec/omniflow-core';
|
|
2
|
+
import type { ArtifactPublisherRegistry } from '@ticatec/omniflow-artifact';
|
|
3
|
+
import { AliyunAcrPublisher } from './docker/AliyunAcrPublisher.js';
|
|
4
|
+
import { AliyunNpmPublisher } from './npm/AliyunNpmPublisher.js';
|
|
5
|
+
import { AliyunMavenPublisher } from './maven/AliyunMavenPublisher.js';
|
|
6
|
+
import { AliyunGenericPublisher } from './generic/AliyunGenericPublisher.js';
|
|
7
|
+
export * from './docker/AliyunAcrPublisher.js';
|
|
8
|
+
export * from './npm/AliyunNpmPublisher.js';
|
|
9
|
+
export * from './maven/AliyunMavenPublisher.js';
|
|
10
|
+
export * from './generic/AliyunGenericPublisher.js';
|
|
11
|
+
export * from './client/AliyunClient.js';
|
|
12
|
+
export interface RegisterAliyunOptions {
|
|
13
|
+
artifactRegistry?: ArtifactPublisherRegistry;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Standard OmniFlow Plugin SPI entry point.
|
|
17
|
+
*/
|
|
18
|
+
export declare function register(ctx: PluginContext, options?: Record<string, unknown>): void;
|
|
19
|
+
export default register;
|
|
20
|
+
/**
|
|
21
|
+
* Register all official Aliyun artifact publishers (ACR, NPM, Maven, Generic) into the target registry.
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerAliyun(options?: RegisterAliyunOptions): {
|
|
24
|
+
acrPublisher: AliyunAcrPublisher;
|
|
25
|
+
npmPublisher: AliyunNpmPublisher;
|
|
26
|
+
mavenPublisher: AliyunMavenPublisher;
|
|
27
|
+
genericPublisher: AliyunGenericPublisher;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAE5E,cAAc,gCAAgC,CAAA;AAC9C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,0BAA0B,CAAA;AAExC,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;CAC7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAGxF;AAED,eAAe,QAAQ,CAAA;AAEvB;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG;IACnE,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,kBAAkB,CAAA;IAChC,cAAc,EAAE,oBAAoB,CAAA;IACpC,gBAAgB,EAAE,sBAAsB,CAAA;CACzC,CAmBA"}
|