Skip to content

Commit 5aa4a4c

Browse files
committed
supply docs and fix image deploy issues
1 parent 808c459 commit 5aa4a4c

File tree

4 files changed

+117
-54
lines changed

4 files changed

+117
-54
lines changed

docs/docs/deploy.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,38 @@ Confirm delete cloud app my-agent-app? (y/N): y
237237
- `agent_module` 自定义的 agent 模块
238238
- `__init__.py` 必须包含 `from . import agent` 语句
239239
- `agent.py` 定义 agent 实例,必须包含 `root_agent=...` 全局变量导出
240+
241+
## 持续交付
242+
243+
VeADK 内置了[火山引擎持续交付](https://www.volcengine.com/product/cp)产品来便捷您的部署与持续交付。结合[火山引擎镜像仓库](https://www.volcengine.com/product/cr)产品,能够通过镜像将您的项目持续交付到火山引擎 FaaS 服务。
244+
245+
> 通过容器部署到云上是最佳实践。
246+
247+
使用命令`veadk pipeline`来连结您的代码仓库与火山引擎镜像仓库、持续交付服务。命令的主要工作流程:
248+
249+
1. 帮助您在 VeFaaS 上创建一个含有模板镜像(Simple FastAPI)的镜像函数
250+
2. 将持续交付服务绑定至您的 Github 仓库与创建好的 VeFaaS 函数
251+
252+
随后,您可以在您的 Github 仓库中进行您的第一次提交,您的仓库项目将会被自动:
253+
254+
1. 打包为镜像,
255+
2. 推送至您的镜像仓库
256+
3. 构建部署到 VeFaaS 函数中
257+
258+
命令`veadk pipeline`参数:
259+
260+
| 参数 | 说明 | 默认值 / 必填 |
261+
|------|------|---------------|
262+
| `--github-url` | Github 仓库 URL | **必填** |
263+
| `--github-branch` | Github 项目的分支 | **必填** |
264+
| `--veadk-version` | VeADK 版本,可选值:`preview`(主分支)、`latest`(最新稳定版)、`x.x.x`(具体版本号) | 当前版本号 |
265+
| `--github-token` | Github Token,用于管理项目 | **必填** |
266+
| `--volcengine-access-key` | 火山引擎 Access Key | 使用环境变量 `VOLCENGINE_ACCESS_KEY` |
267+
| `--volcengine-secret-key` | 火山引擎 Secret Key | 使用环境变量 `VOLCENGINE_SECRET_KEY` |
268+
| `--pipeline-region` | 火山引擎 CodePipeline 区域 | `cn-beijing` |
269+
| `--cr-instance-name` | 火山引擎容器镜像仓库实例名 | `veadk-user-instance` |
270+
| `--cr-namespace-name` | 火山引擎容器镜像仓库命名空间 | `veadk-user-namespace` |
271+
| `--cr-repo-name` | 火山引擎容器镜像仓库 Repo 名称 | `veadk-user-repo` |
272+
| `--vefaas-function-id` | 火山引擎 FaaS 函数 ID(要求为镜像函数),如未设置,将自动创建新函数 | - |
273+
274+
**注意:**启动命令的目录中请提供 `config.yaml` 文件来将您的环境变量记录到云上。

veadk/cli/cli_pipeline.py

Lines changed: 59 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,21 @@
1515
import warnings
1616

1717
import click
18-
from veadk.version import VERSION
18+
1919
from veadk.config import getenv
20-
from veadk.integrations.ve_code_pipeline.ve_code_pipeline import VeCodePipeline
21-
from veadk.integrations.ve_faas.ve_faas import VeFaaS
22-
from veadk.integrations.ve_cr.ve_cr import VeCR
2320
from veadk.consts import (
2421
DEFAULT_CR_INSTANCE_NAME,
2522
DEFAULT_CR_NAMESPACE_NAME,
2623
DEFAULT_CR_REPO_NAME,
2724
)
25+
from veadk.integrations.ve_code_pipeline.ve_code_pipeline import VeCodePipeline
26+
from veadk.integrations.ve_cr.ve_cr import VeCR
27+
from veadk.integrations.ve_faas.ve_faas import VeFaaS
28+
from veadk.utils.logger import get_logger
29+
from veadk.version import VERSION
30+
31+
logger = get_logger(__name__)
32+
2833

2934
warnings.filterwarnings(
3035
"ignore", category=UserWarning, module="pydantic._internal._fields"
@@ -65,9 +70,9 @@ def _create_cr(volcengine_settings: dict[str, str], cr_settings: dict[str, str])
6570

6671
@click.command()
6772
@click.option(
68-
"--base-image-tag",
69-
required=True,
70-
help=f"Base VeADK image tag can be 'preview', 'latest', or a VeADK version (e.g., {VERSION})",
73+
"--veadk-version",
74+
default=VERSION,
75+
help=f"Base VeADK image tag can be 'preview', 'latest', or a specific VeADK version (e.g., {VERSION})",
7176
)
7277
@click.option(
7378
"--github-url",
@@ -76,104 +81,98 @@ def _create_cr(volcengine_settings: dict[str, str], cr_settings: dict[str, str])
7681
)
7782
@click.option(
7883
"--github-branch",
79-
default="main",
80-
help="The github branch of your project, default is main",
84+
required=True,
85+
help="The github branch of your project",
8186
)
8287
@click.option(
8388
"--github-token",
8489
required=True,
8590
help="The github token to manage your project",
8691
)
8792
@click.option(
88-
"--access-key",
89-
default=getenv("VOLCENGINE_ACCESS_KEY"),
93+
"--volcengine-access-key",
94+
default=None,
9095
help="Volcengine access key, if not set, will use the value of environment variable VOLCENGINE_ACCESS_KEY",
9196
)
9297
@click.option(
93-
"--secret-key",
94-
default=getenv("VOLCENGINE_SECRET_KEY"),
98+
"--volcengine-secret-key",
99+
default=None,
95100
help="Volcengine secret key, if not set, will use the value of environment variable VOLCENGINE_SECRET_KEY",
96101
)
97102
@click.option(
98103
"--region",
99104
default="cn-beijing",
100-
help="Volcengine region, default is cn-beijing",
105+
help="Region for Volcengine VeFaaS, CR, and Pipeline. Default is cn-beijing",
101106
)
102107
@click.option(
103108
"--cr-instance-name",
104109
default=DEFAULT_CR_INSTANCE_NAME,
105-
help="Container Registry instance name, default is veadk-user-instance",
110+
help="Volcengine Container Registry instance name, default is veadk-user-instance",
106111
)
107112
@click.option(
108113
"--cr-namespace-name",
109114
default=DEFAULT_CR_NAMESPACE_NAME,
110-
help="Container Registry namespace name, default is veadk-user-namespace",
115+
help="Volcengine Container Registry namespace name, default is veadk-user-namespace",
111116
)
112117
@click.option(
113118
"--cr-repo-name",
114119
default=DEFAULT_CR_REPO_NAME,
115-
help="Container Registry repo name, default is veadk-user-repo",
116-
)
117-
@click.option(
118-
"--cr-region",
119-
default="cn-beijing",
120-
help="Container Registry region, default is cn-beijing",
120+
help="Volcengine Container Registry repo name, default is veadk-user-repo",
121121
)
122122
@click.option(
123-
"--function-id",
123+
"--vefaas-function-id",
124124
default=None,
125125
help="Volcengine FaaS function ID, if not set, a new function will be created automatically",
126126
)
127127
def pipeline(
128-
base_image_tag: str,
128+
veadk_version: str,
129129
github_url: str,
130130
github_branch: str,
131131
github_token: str,
132-
access_key: str,
133-
secret_key: str,
132+
volcengine_access_key: str,
133+
volcengine_secret_key: str,
134134
region: str,
135135
cr_instance_name: str,
136136
cr_namespace_name: str,
137137
cr_repo_name: str,
138-
cr_region: str,
139-
function_id: str,
138+
vefaas_function_id: str,
140139
) -> None:
141140
"""Integrate a veadk project to volcengine pipeline for CI/CD"""
142141

143142
click.echo(
144143
"Welcome use VeADK to integrate your project to volcengine pipeline for CI/CD."
145144
)
146145

146+
if not volcengine_access_key:
147+
volcengine_access_key = getenv("VOLCENGINE_ACCESS_KEY")
148+
if not volcengine_secret_key:
149+
volcengine_secret_key = getenv("VOLCENGINE_SECRET_KEY")
150+
147151
volcengine_settings = {
148-
"volcengine_access_key": access_key,
149-
"volcengine_secret_key": secret_key,
152+
"volcengine_access_key": volcengine_access_key,
153+
"volcengine_secret_key": volcengine_secret_key,
150154
"volcengine_region": region,
151155
}
152156

153157
cr_settings = {
154-
"cr_domain": f"{cr_instance_name}-{cr_region}.cr.volces.com",
158+
"cr_domain": f"{cr_instance_name}-{region}.cr.volces.com",
155159
"cr_instance_name": cr_instance_name,
156160
"cr_namespace_name": cr_namespace_name,
157161
"cr_repo_name": cr_repo_name,
158-
"cr_region": cr_region,
162+
"cr_region": region,
159163
}
160164

161-
_create_cr(volcengine_settings, cr_settings)
162-
163-
click.echo("Using the following CR configuration:")
164-
click.echo(f"Container Registry domain: {cr_settings['cr_domain']}")
165-
click.echo(f"Container Registry namespace name: {cr_settings['cr_namespace_name']}")
166-
click.echo(f"Container Registry region: {cr_settings['cr_region']}")
167-
click.echo(f"Container Registry instance name: {cr_settings['cr_instance_name']}")
168-
click.echo(f"Container Registry repo name: {cr_settings['cr_repo_name']}")
169-
170-
if not function_id:
165+
if not vefaas_function_id:
171166
click.echo(
172-
"No Function ID specified. The system will create one automatically. Please specify a function name:"
167+
"No Function ID specified. VeADK will create one automatically. Please specify a function name:"
173168
)
174169
function_name = click.prompt(
175-
"Function name", default="veadk-function", show_default=False
170+
"Function name", default="veadk-image-function", show_default=False
176171
)
172+
173+
_create_cr(volcengine_settings, cr_settings)
174+
175+
if not vefaas_function_id:
177176
vefaas_client = VeFaaS(
178177
access_key=volcengine_settings["volcengine_access_key"],
179178
secret_key=volcengine_settings["volcengine_secret_key"],
@@ -184,15 +183,29 @@ def pipeline(
184183
image="veadk-cn-beijing.cr.volces.com/veadk/simple-fastapi:0.1",
185184
registry_name=cr_settings["cr_instance_name"],
186185
)
187-
click.echo(f"Created function {function_name} with ID: {function_id}")
186+
logger.debug(f"Created function {function_name} with ID: {function_id}")
188187

189188
client = VeCodePipeline(
190189
volcengine_access_key=volcengine_settings["volcengine_access_key"],
191190
volcengine_secret_key=volcengine_settings["volcengine_secret_key"],
192191
region=volcengine_settings["volcengine_region"],
193192
)
193+
194+
click.echo("=====================================================")
195+
click.echo("Using the following configuration to create pipeline:")
196+
click.echo(f"Use VeADK version: {veadk_version}")
197+
click.echo(f"Github url: {github_url}")
198+
click.echo(f"Github branch: {github_branch}")
199+
click.echo(f"VeFaaS function name: {function_name}")
200+
click.echo(f"VeFaaS function ID: {function_id}")
201+
click.echo(f"Container Registry domain: {cr_settings['cr_domain']}")
202+
click.echo(f"Container Registry namespace name: {cr_settings['cr_namespace_name']}")
203+
click.echo(f"Container Registry region: {region}")
204+
click.echo(f"Container Registry instance name: {cr_settings['cr_instance_name']}")
205+
click.echo(f"Container Registry repo name: {cr_settings['cr_repo_name']}")
206+
194207
client.deploy(
195-
base_image_tag=base_image_tag,
208+
base_image_tag=veadk_version,
196209
github_url=github_url,
197210
github_branch=github_branch,
198211
github_token=github_token,

veadk/integrations/ve_code_pipeline/ve_code_pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from string import Template
1717

1818
import requests
19-
from veadk.config import getenv
19+
2020
from veadk.utils.logger import get_logger
2121
from veadk.utils.misc import formatted_timestamp
2222
from veadk.utils.volcengine_sign import ve_request
@@ -109,8 +109,8 @@ def get_dockerfile(tag: str = "latest") -> str:
109109
class VeCodePipeline:
110110
def __init__(
111111
self,
112-
volcengine_access_key: str = getenv("VOLCENGINE_ACCESS_KEY"),
113-
volcengine_secret_key: str = getenv("VOLCENGINE_SECRET_KEY"),
112+
volcengine_access_key: str,
113+
volcengine_secret_key: str,
114114
region: str = "cn-beijing",
115115
) -> None:
116116
self.volcengine_access_key = volcengine_access_key

veadk/integrations/ve_cr/ve_cr.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from veadk.utils.volcengine_sign import ve_request
16-
from veadk.utils.logger import get_logger
15+
import time
16+
1717
from veadk.consts import (
1818
DEFAULT_CR_INSTANCE_NAME,
1919
DEFAULT_CR_NAMESPACE_NAME,
2020
DEFAULT_CR_REPO_NAME,
2121
)
22-
import time
22+
from veadk.utils.logger import get_logger
23+
from veadk.utils.volcengine_sign import ve_request
2324

2425
logger = get_logger(__name__)
2526

@@ -63,6 +64,20 @@ def _create_instance(self, instance_name: str = DEFAULT_CR_INSTANCE_NAME) -> str
6364
)
6465
logger.debug(f"create cr instance {instance_name}: {response}")
6566

67+
if "Error" in response["ResponseMetadata"]:
68+
error_code = response["ResponseMetadata"]["Error"]["Code"]
69+
error_message = response["ResponseMetadata"]["Error"]["Message"]
70+
if error_code == "AlreadyExists.Registry":
71+
logger.debug(f"cr instance {instance_name} already exists")
72+
return instance_name
73+
else:
74+
logger.error(
75+
f"Error create cr instance {instance_name}: {error_code} {error_message}"
76+
)
77+
raise ValueError(
78+
f"Error create cr instance {instance_name}: {error_code} {error_message}"
79+
)
80+
6681
while True:
6782
status = self._check_instance(instance_name)
6883
if status == "Running":
@@ -71,7 +86,7 @@ def _create_instance(self, instance_name: str = DEFAULT_CR_INSTANCE_NAME) -> str
7186
raise ValueError(f"cr instance {instance_name} create failed")
7287
else:
7388
logger.debug(f"cr instance status: {status}")
74-
time.sleep(5)
89+
time.sleep(30)
7590

7691
return instance_name
7792

@@ -142,7 +157,7 @@ def _create_namespace(
142157
error_code = response["ResponseMetadata"]["Error"]["Code"]
143158
error_message = response["ResponseMetadata"]["Error"]["Message"]
144159
if error_code == "AlreadyExists.Namespace":
145-
logger.debug(f"cr namespace {namespace_name} already exists")
160+
logger.warning(f"cr namespace {namespace_name} already exists")
146161
return namespace_name
147162
else:
148163
logger.error(

0 commit comments

Comments
 (0)