云服务器内容精选
-
代码化构建 参考以下代码示例,修改在创建代码化构建使用的YAML文件中的BUILD部分代码信息。 1 2 3 4 5 6 7 8 9 10 11 12 version: 2.0 # 必须是2.0 steps: BUILD: - harmonyos: name: "Hvigor Build" inputs: command: | npm config set strict-ssl false npm config set registry=https://repo.huaweicloud.com/repository/npm/ npm config set @ohos:registry=https://repo.harmonyos.com/npm/ chmod +x hvigorw ./hvigorw clean assembleApp --no-daemon 表2 代码示例参数说明 参数 类型 说明 command string 配置HarmonyOS的执行命令。
-
图形化构建 在配置构建步骤中,添加“Hvigor构建”构建步骤,参考表1配置参数。 表1 Hvigor构建参数说明 参数 说明 步骤显示名称 构建步骤的名称,可自定义修改。 支持中文、英文、数字、“-”、“_”、英文逗号、英文分号、英文冒号、“.”、“/”、圆括号(中英文)。 字符长度范围为1~128。 工具版本 默认版本为“HarmonyOS-API9”,当前仅支持该版本。 命令 配置命令,一般使用系统默认给出的命令即可。如有特殊构建要求,可以在文本域中输入自定义的构建脚本。
-
操作流程 表1 操作流程 流程 说明 新建项目 为本实践新建项目。 新建自定义执行机资源池 为本实践新建所需的自定义执行机资源池。 新建CodeArts Repo代码仓 为本实践新建存储代码的代码仓。 新建并执行编译构建任务 为本实践新建构建任务,包括“Maven构建”和“上传软件包到软件发布库”构建步骤。 查看构建任务和构建结果 为您介绍通过查看构建日志确认该实践的构建任务使用的执行机和在制品仓中查看上传的软件包。
-
应用场景 当编译构建服务提供的内置执行机构建环境不满足业务要求时,您可接入自行提供的计算资源,通过注册的方式托管到编译构建服务中,委托编译构建服务进行调度并执行构建任务。本实践我们通过“Maven构建”和“上传软件包到软件发布库”两个构建步骤来演示使用自定义执行机的构建场景。 本实践需要依赖使用的其他服务如下: 代码托管服务 ,用于存储实践中项目所使用的代码。 制品仓库服务,用于存储实践中使用的私有依赖包。
-
多任务构建 --- version: 2.0 #构建参数定义, 参数必须以name,value成对出现,不赋值默认为空字符串,引用方式为${申明的参数名称name} params: - name: machineArch value: X86 - name: jobCondition value: 1 - name: jobsCondition value: 1 # 构建环境配置,env和envs配置为非必填项,二选一。当用户需要使用条件判断确定使用的主机规格与类型时,选择配置envs env: resource: type: docker arch: X86 class: 8U16G pool: Mydocker envs: - condition: machineArch == 'ARM' resource: type: docker arch: ARM - condition: machineArch == 'X86' resource: type: docker arch: X86 # buildflow和buildflows配置二选一。当需要使用条件判断执行的jobs时,选择配置buildflows buildflow: strategy: Lazy jobs: - job: Job3 depends_on: - Job1 - Job2 build_ref: .cloudbuild/build3.yml - job: Job1 build_ref: .cloudbuild/build1.yml - job: Job2 build_ref: .cloudbuild/build2.yml buildflows: - condition: jobsCondition == 1 jobs: - job: Job1 build_ref: .cloudbuild/build1.yml params: - name: job1Params value: 1 - condition: jobCondition == 1 job: Job2 build_ref: .cloudbuild/build2.yml params: - name: job2Params value: 2 - job: Job3 depends_on: - Job1 - Job2 build_ref: .cloudbuild/build3.yml - condition: jobsCondition == 2 jobs: - job: Job3 build_ref: .cloudbuild/build3.yml 表2 多任务语法配置说明 参数 类型 说明 是否必填 version string YAML文件版本号配置项,用于指定YAML文件版本号。固定值,目前只支持2.0。 是 params map 全局参数配置项,参数必须以name和value成对出现,不赋值默认为空字符串,引用方式为${申明的参数名称name}。 示例中定义的参数,引用方式:作为参数输入时使用${machineArch},作为condition条件判断时使用申明的参数名称machineArch。 - name:参数名称。 value:参数名称对应的参数值。 否 env map 构建环境配置项,与envs配置功能相同,两者配置其一即可,不支持条件语句condition。 resource:构建环境资源信息。 type:资源池类型,可输入参数值(docker或custom),docker表示使用默认执行机,custom表示使用自定义执行机,必填项。 arch:构建执行机架构,可输入参数值(X86或ARM),必填项。 class:构建执行机规格,可输入参数值(2U8G、4U8G、8U16G、16U32G、16U64G),当type=docker时该参数生效,默认为2U8G,其他规格需要单独购买对应规格的并发包才能正常使用,非必填。 pool:自定义资源池名称,当type=custom时该参数生效,非必填。 否 envs map 构建环境配置项,与env配置功能相同,两者配置其一即可,支持条件语句condition,可以更加灵活的根据不同场景适用同一个YAML文件。 - condition:条件判断语句,符合当前条件判断的会使用对应resource配置的环境信息。 resource:构建环境资源信息。 type:资源池类型,可输入参数值(docker或custom),docker表示使用默认执行机, custom表示使用自定义执行机,必填项。 arch:构建执行机架构,可输入参数值(X86或ARM),必填项。 class:构建执行机规格,可输入参数值(2U8G、4U8G、8U16G、16U32G、16U64G),当type=docker时需要填写该参数,默认为2U8G,其他规格需要单独购买对应规格的并发包才能正常使用,非必填。 pool:自定义资源池名称,当type=custom时需要填写该参数,非必填。 否 buildflow map 在CodeArts Build中Build Job是构建的最小单元,适用于业务比较简单的场景,但是在有些复杂的构建场景下,Build Job可能并不能满足复杂的构建要求,比如多仓工程需要分布到多个机器上去构建,并且构建工程之间还存在一定的依赖关系,又或者希望将Build Job中的构建任务拆分成更加模块化,更加细粒度的构建任务,并按照依赖顺序进行构建。对于比较复杂的构建场景,可以使用BuildFlow将多个有依赖关系的Build Job按照有向无环图(DAG)的方式组装起来,CodeArts Build将会按照构建的依赖关系以最大的并发进行构建,提升构建效率。 strategy:定义buildFlow运行的策略,支持Lazy(构建时间相对较长,但是可以节省构建资源,在资源池资源不足时使用,优先触发优先级高的子任务构建)和Eager(构建时间相对较快,可能造成资源空闲等待,在资源池充足时推荐使用,同步触发所有任务),非必填,默认值Eager。 jobs:任务编排,定义子job之间的依赖关系,必填项。 - job:子任务名称,必填项。 depends_on:是否依赖子任务,填写依赖子任务的job名称,当前job依赖于Job1和Job2,非必填。 - Job1 - Job2 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),YAML文件是一个独立的可执行构建的完整文件,参考单任务构建,必填项。 - job:子任务名称,必填项。 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),必填项。 - job:子任务名称,必填项。 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),必填项。 buildflows map 当buildflow中需要做条件判断时使用buildflows,针对不同业务场景进行适配,更好的对YAML文件进行通用。 - condition:条件判断语句,符合当前条件判断的会使用对应jobs配置,condition必须放在buildflows下面。 jobs:任务编排,定义子job之间的依赖关系,必填项。 - job:子任务名称,必填项。 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),YAML文件是一个独立的可执行构建的完整文件,参考单任务构建,必填项。 params:子任务定义的参数,作用域为子任务引用的YAML文件,可以在子任务使用的YAML文件中引用此处定义的参数,非必填。 - name:参数名称。 value:参数名称对应的参数值。 - condition:条件判断语句,符合当前条件判断的会使用对应job配置。 job:子任务名称,必填项。 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),必填项。 params:子任务定义的参数,作用域为子任务引用的YAML文件,非必填。 - name:参数名称。 value:参数名称对应的参数值。 - job:子任务名称,必填项。 depends_on:是否依赖子任务,填写依赖子任务的job名称,当前job依赖于Job1和Job2,非必填。 - Job1 - Job2 build_ref:当前job构建使用的YAML文件路径(相对于仓库根目录),必填项。
-
单任务构建 --- version: 2.0 #构建参数定义, 参数必须以name,value成对出现,不赋值默认为空字符串,引用方式为${申明的参数名称name} params: - name: machineArch value: X86 #构建环境配置,env和envs配置为非必填项,二选一。当用户需要使用条件判断确定使用的主机规格与类型时,选择配置envs env: resource: type: docker arch: X86 class: 8U16G pool: Mydocker envs: - condition: machineArch == 'ARM' resource: type: docker arch: ARM - condition: machineArch == 'X86' resource: type: docker arch: X86 #构建步骤 steps: PRE_BUILD: - checkout: name: checkout inputs: scm: codehub url: git@codehub.devcloud.cn-north-7.ulanqab.huawei.com:huang-test00001/maven.git branch: master commit: commitId lfs: true submodule: true depth: 100 tag: tag path: test - manifest_checkout: name: "manifest" inputs: manifest_url: https://codehub.devcloud.xxxxxxx.ulanqab.huawei.com/IPD-xxxxxx/manifest.git manifest_branch: master manifest_file: default.xml path: dir/dir02 lfs: true repo_url: https://codehub.devcloud.xxxxxxx.ulanqab.huawei.com/IPD-xxxxxx/git-repo.git repo_branch: master username: someone password: PASSWD - sh: inputs: command: echo ${machineArch} BUILD: # 构建步骤 - maven: name: Maven构建 image: cloudbuild@maven3.5.3-jdk8-open inputs: settings: public_repos: - https://mirrors.huawei.com/maven cache: true unit_test: coverage: true ignore_errors: false report_path: "**/TEST*.xml" enable: true coverage_report_path: "**/site/jacoco" command: mvn package -Dmaven.test.failure.ignore=true -U -e -X -B check: project_dir: ./ settings: ~/.m2/settings.xml param: '' - upload_artifact: inputs: path: "**/target/*.?ar" version: 2.1 name: packageName 表1 单任务语法配置说明 参数 类型 说明 是否必填 version string YAML文件版本号配置项,用于指定YAML文件版本号。固定值,目前只支持2.0。 是 params map 全局参数配置项,参数必须以name和value成对出现,不赋值默认为空字符串,引用方式为${申明的参数名称name}。 示例中定义的参数,引用方式:作为参数输入时使用${machineArch},作为condition条件判断时使用申明的参数名称machineArch。 - name:参数名称。 value:参数名称对应的参数值。 否 env map 构建环境配置项,与envs配置功能相同,两者配置其一即可,不支持条件语句condition。 resource:构建环境资源信息。 type:资源池类型,可输入参数值(docker或custom),docker表示使用默认执行机,custom表示使用自定义执行机,必填项。 arch:构建执行机架构,可输入参数值(X86或ARM),必填项。 class:构建执行机规格,可输入参数值(2U8G、4U8G、8U16G、16U32G、16U64G),当type=docker时该参数生效,默认为2U8G,其他规格需要单独购买对应规格的并发包才能正常使用,非必填。 pool:自定义资源池名称,当type=custom时该参数生效,非必填。 否 envs map 构建环境配置项,与env配置功能相同,两者配置其一即可,支持条件语句condition,可以更加灵活的根据不同场景适用同一个YAML文件。 - condition:条件判断语句,符合当前条件判断的会使用对应resource配置的环境信息。 resource:构建环境资源信息。 type:资源池类型,可输入参数值(docker或custom),docker表示使用默认执行机, custom表示使用自定义执行机,必填项。 arch:构建执行机架构,可输入参数值(X86或ARM),必填项。 class:构建执行机规格,可输入参数值(2U8G、4U8G、8U16G、16U32G、16U64G),当type=docker时需要填写该参数,默认为2U8G,其他规格需要单独购买对应规格的并发包才能正常使用,非必填。 pool:自定义资源池名称,当type=custom时需要填写该参数,非必填。 否 steps map 构建步骤执行配置项,配置构建流程,包括构建前准备,构建执行的具体任务。 PRE_BUILD:构建前准备工作配置项,一般用作于构建前的代码下载工作。 BUILD:构建任务配置项,用于执行业务相关的具体构建任务。 是 steps: PRE_BUILD map 构建前准备工作配置项,一般用作于构建前的代码下载工作,目前只支持checkout、manifest_checkout 和sh配置项,一般情况配置其中一种即可。 - checkout:单代码仓下载。 name:构建步骤名称,支持自定义名称,非必填,默认值“代码检出”。 inputs:步骤输入参数,每个步骤的输入参数不同,详见具体构建步骤说明,必填项。 scm:代码源,当前只支持codehub,非必填,默认值codehub。 url:拉取代码的ssh地址或者https地址。codehub拉取代码时为ssh,其他代码源为https,必填项。 branch:拉取的代码分支名,必填项。 commit:commitId构建时拉取的commitId,非必填。 lfs: 是否开启git lfs,非必填,默认值false。 submodule:是否拉取子模块,非必填,默认值false。 depth:浅克隆深度。选择commitId构建时,depth必须大于等于commitId所在深度,非必填,默认值1。 tag:tag构建时拉取的tag名,如果commit和tag同时存在,优先执行commit构建,非必填。 path:clone的子路径,代码将会下载到子目录下面,非必填。 - manifest_checkout: 多代码仓下载。 name:构建步骤名称,支持自定义名称,非必填,默认值“manifest_checkout”。 inputs:步骤输入参数,每个步骤的输入参数不一样,详见具体构建步骤说明,必填项。 manifest_url:指定manifest仓地址,包含xml文件的仓库,必填项。 manifest_branch:指定manifest分支或revision,非必填,默认值HEAD。 manifest_file:manifest文件路径,定义的多仓库必须为同一种源码源,非必填,默认值default.xml。 path:自定义manifest所有子仓下载路径,为工作目录的相对路径路径,不能以“/”开头,不能包含“.”,非必填,默认值为当前工作目录。 lfs:是否开启git lfs,非必填,默认值false。 repo_url:repo仓库地址,非必填。 repo_branch:repo仓库分支,非必填,默认值stable。 username:下载仓库时使用的用户名,下载非公开仓库时需填写,非必填。 password:下载仓库时使用的密码,下载非公开仓库时需填写,非必填。 - sh:执行shell命令。 inputs:步骤输入参数,每个步骤的输入参数不一样,详见具体构建步骤说明,必填项。 command:执行shell命令,当checkout或manifest_checkout无法满足业务诉求时,可以自定义编写shell命令进行构建前的准备工作,必填项。 是 steps: BUILD map 构建任务配置项,用于执行业务相关的具体构建任务,只支持特定构建步骤,构建步骤根据业务实际情况进行自由组合,具体构建步骤参考选择构建步骤。 - maven:Maven构建步骤定义。 name:构建步骤名称,支持自定义名称,非必填,默认值“Maven构建”。 image:构建使用的容器镜像,支持自定义和默认镜像,默认镜像名称为“cloudbuild@”加上工具版本名称,工具版本名称可以参考构建工具版本,必填项。 inputs:步骤输入参数,每个步骤的输入参数不一样,详见具体构建步骤说明,必填项。 settings:maven构建的settings配置,非必填。 public_repos:指定依赖包下载仓库地址。 - https://mirrors.huawei.com/maven cache:是否开启缓存,非必填,默认值false。 unit_test:单元测试,非必填。 coverage:是否处理覆盖率数据,非必填,默认值false。 ignore_errors:是否忽略单元测试错误,非必填,默认值true。 report_path:单元测试数据路径,必填项。 enable:是否处理单元测试数据,非必填,默认值true。 coverage_report_path:覆盖率数据路径,非必填。 command:执行构建命令,必填项。 check:检查配置,非必填。 project_dir:工程路径,必填项。 settings:maven构建的settings路径,非必填。 param:maven参数,非必填。 - upload_artifact:上传二进制包至artifact仓库构建步骤定义。 inputs:步骤输入参数,每个步骤的输入参数不一样,详见具体构建步骤说明,必填项。 path:上传文件的路径及名称,支持通配符,必填项。 version:版本名称,非必填,默认值以构建编号命名。 name:文件名,非必填,默认值以文件原始名命名。
-
代码化构建 参考以下代码样例,在创建代码化构建使用的YAML文件中的PRE_BUILD部分代码信息。 1 2 3 4 5 6 version: 2.0 # 必须是2.0 steps: PRE_BUILD: - sh: inputs: command: echo ${a} 表2 代码示例参数说明 参数 类型 说明 command string 请根据需要填写执行构建的shell命令。更多命令使用方法可参考shell官网。
-
图形化构建 在配置构建步骤中,添加“执行shell命令”构建步骤,参考表1配置参数。 表1 执行shell命令参数说明 参数 说明 步骤显示名称 构建步骤的名称,可自定义修改。 支持中文、英文、数字、“-”、“_”、英文逗号、英文分号、英文冒号、“.”、“/”、圆括号(中英文)。 字符长度范围为1~128。 工具版本 根据用户实际开发环境的需要,选择对应的工具版本。 CodeArts Build支持的工具版本,可查看构建工具版本。若当前的工具版本不满足您的使用要求,您可以自定义构建环境。 命令 请根据需要填写执行构建的shell命令。更多命令使用方法可参考shell官网。
-
新建构建任务并执行 在编译构建服务页面,单击“新建任务”,按照如下参数说明配置参数,其他参数保持默认即可。 名称:自定义构建任务名称,例如“custom_env_build_task”。 代码源:选择本次构建拉取的代码源,这里选择“Repo”。 代码仓:选择新建CodeArts Repo代码仓中新建的代码仓“custom_env_repo”。 单击“下一步”,选择“空白构建模板”。然后单击“确定”,自动跳转到构建步骤配置页面。 在“构建步骤”页签,单击“图形化”,单击“点击添加构建步骤”。 在右侧区域“容器类”页签中,单击“使用SWR公共镜像”所在行的“添加”,按照图4配置参数。其中“镜像地址”填写10中保存的完整镜像名称“swr.{regionID}.myhuaweicloud.com/hwstaff_codeci_gray/custom_ubuntu_image:v1.0”,将如下代码示例拷贝至“命令”中,其余参数保持默认即可。 java -version # 打印当前镜像里安装的jdk版本号 mvn -v # 打印当前镜像里安装的maven版本号 mvn package -Dmaven.test.skip=true -U -e -X -B # 执行maven构建命令 图8 配置使用SWR公共镜像 单击“添加步骤”,添加“上传软件包至软件发布库”构建步骤,“构建包路径”输入“**/target/*.?ar”,其他参数保持默认即可。 单击页面右上角“保存并执行”,在弹出的窗口中单击“确定”,跳转到构建任务执行页面。
-
操作流程 表1 操作流程 流程 说明 新建项目 为本实践新建项目。 新建私有依赖库 新建本实践中使用的私有依赖库。 新建dependency_repo代码仓 新建发布“dependencyProject-1.0.jar”工具包使用的代码仓。 新建dependency_task构建任务 新建发布“dependencyProject-1.0.jar”工具包的构建任务。 新建release_repo代码仓 新建发布应用使用的代码仓。 新建release_task构建任务 新建发布应用使用的构建任务,该构建任务依赖“dependencyProject-1.0.jar”工具包。 查看构建结果 查看本实践的的构建结果。
-
应用场景 本实践案例将为您介绍,如何在CodeArts Build构建工程中引用私有依赖库中的二方或三方依赖包,实现应用的编译构建。本实践案例为您演示依赖包的发布和下载引用两个环节,共涉及2个Maven构建工程,1个私有依赖库。 构建工程“dependency_task”:用于发布工具包,将“pom.xml”文件定义的“dependencyProject-1.0.jar”工具包发布到私有依赖库,为构建工程“release_task”提供依赖工具包引用。 构建工程“release_task”:用于发布应用,构建时依赖构建工程“dependency_repo”发布到私有依赖库的工具包“dependencyProject-1.0.jar”。 私有依赖库“dependency_libs”:存放构建工程“dependency_task”发布的工具包“dependencyProject-1.0.jar”,为构建工程“release_task”提供依赖工具包下载。 本实践需要依赖使用的其他服务如下: 代码托管服务,用于存储实践中项目所使用的代码。 制品仓库服务,用于存储实践中使用的私有依赖包。
-
应用场景 编译构建服务支持通过yaml文件配置构建脚本,用户可以将构建时需要配置的构建环境、构建参数、构建命令、构建步骤等操作,通过yaml语法编写成build.yml文件实现,并且将build.yml文件和被构建的代码一起存储到代码仓库。执行构建任务时,系统会以build.yml文件作为构建脚本执行构建任务,使构建过程可追溯、可还原,安全可信。本实践以使用Maven构建为例,为您演示上传软件包至软件发布库和推送镜像到SWR。 本实践需要依赖使用的其他服务如下: SWR,即 容器镜像服务 。SWR镜像仓库用于存储用户上传的Docker镜像,可以在构建、部署或其他场景使用。 代码托管服务,用于存储实践中项目所使用的代码。 制品仓库服务,用于存储实践中使用的私有依赖包。
-
新建构建任务并执行 在编译构建服务页面,单击“新建任务”,按照如下参数说明配置参数,其他参数保持默认即可。 名称:自定义构建任务名称,例如“maven_private_repository_task”。 代码源:选择本次构建拉取的代码源,这里选择“Repo”。 代码仓:选择新建CodeArts Repo代码仓中新建的代码仓“maven_private_repository_repo”。 单击“下一步”,选择“Maven”模板。然后单击“确定”,自动跳转到构建步骤配置页面。 在“构建步骤”页签,单击“图形化”,单击左侧“Maven构建”,按照如下说明配置构建步骤,其他参数保持默认即可。 命令:mvn package -Dmaven.test.skip=true -U -e -X -B命令前加“#”,删除#mvn deploy -Dmaven.test.skip=true -U -e -X -B前的“#”。 发布依赖包到CodeArts私有依赖库:选择“配置所有pom”。 “release仓库”和“snapshot仓库”选择新建私有依赖库中仓库名“maven_repository”。 图3 配置Maven构建步骤 单击页面右上角“保存并执行”,在弹出的窗口中单击“确定”,自动跳转到构建任务执行页面。
-
相关信息 当前实践展示的是归档“Snapshot”快照版本,如果要归档正式的“Release”发布版本,可以修改新建CodeArts Repo代码仓中的代码仓“pom.xml”文件中的“version”内容,将“1.0.0-SNAPSHOT”修改为“1.0.0”,提交文件改动,重新执行构建任务即可。 Maven构建会根据模块的版本号,即““pom.xml”文件中的“version”内容是否带有“-SNAPSHOT”来判断是快照版本还是正式版本。
-
配置构建步骤并执行构建任务 单击“点击添加构建步骤”,添加“下载文件管理的文件”构建步骤,“步骤显示名称”和“工具版本”保持默认,“下载文件”选择上传settings.xml文件至编译构建中上传的文件“settings.xml”。 单击“添加步骤”,添加“Maven构建”构建步骤,“命令”窗口中mvn package -Dmaven.test.skip=true -U -e -X -B命令前加“#”注释,删除mvn deploy -Dmaven.test.skip=true -U -e -X -B前的“#”,并将mvn deploy -Dmaven.test.skip=true -U -e -X -B改为mvn deploy -Dmaven.test.skip=true -s settings.xml -U -e -X -B,其他参数保持默认即可。 图5 打包命令 图6 发布依赖包命令 单击“保存并执行”。在弹出的窗口中单击“确定”,等待构建任务执行完成。
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格