华为云用户手册

  • 流水线管理 流水线功能是开发中心集成流水线CodeArts Pipeline服务的能力,提供可视化、可编排的CI/CD持续交付软件生产线,帮助企业快速转型,实现DevOps持续交付高效自动化,缩短应用TTM(Time to Market)交付周期,提升研发效率。 流水线服务本质上是一个可视化的自动化任务调度平台,需要配合软件开发生产线中编译构建、代码检查、测试计划、部署等服务的自动化任务使用。根据用户需要的场景,如开发测试环境应用部署、生产环境应用部署等,对这些自动化任务进行自定义编排,一次配置后就可以一键自动化触发调度执行,避免频繁低效的手工操作。 流水线管理常见问题请参见流水线(CodeArts Pipeline)常见问题。 父主题: 开发中心
  • 配置样例 SLB类型样例: - name: clf_iac3.0_example_gray_SLB // name+type唯一定位到一个灰度服务资源 type: 'WiseCloud::LoadBalancer::GrayConfig' //资源类型为灰度服务配置 properties: ruleType: SLB stages: - stageIndex: 1 rules: - param: path values: '5555' match: equal variable: path position: path greyRuleRelation: or
  • 使用限制 如果灰度集群(bindSlb.grayStatus配置为2)想要使用多阶段灰度升级,要求bindSlb.grayStatus在灰度期间保持配置为2。 首次部署时不要配置grayStage,因为要进行灰度升级首先要保证有一个正常运行的版本作为生产,而如果首次部署是满足不了这个条件的,所以要至少正确部署过一次之后才能进行灰度升级。 配置了grayInstances即代表要进入多阶段灰度升级,且百分比只能配置为1%~100%(字符串);但是如果第一阶段就直接配置为100%,则仍然执行普通升级模式。 灰度升级期间(包括进入灰度时),IaC配置中不允许修改grayStage.grayStatus、min_instances、max_instances和SLB相关配置,其他配置可以修改。 灰度升级过程中,如果grayInstances的比例达到了100%,grayProcess为INGRAY时,再进行比例缩小时,该场景只允许修改灰度比例。 灰度升级过程中,如果发现灰度版本配置错误,可以修改IaC配置将灰度集群进行重新部署,但是这时不允许修改grayInstances,即IaC配置和灰度比例只能修改其中一个。 多阶段灰度升级中,业务将grayInstances配置为100%(未配置grayProcess字段)或grayInstances配置为100%、grayProcess为FINISHED并部署成功后,才算灰度结束了;中间一个阶段部署成功了不算结束灰度,只算这一阶段部署成功了,此时仍然算在灰度升级过程中。 灰度过程中,不允许业务再执行普通部署,不允许在管理台上修改配置,只能通过IaC部署修改。 多阶段灰度升级和滚动升级同时使用时,maxUnavailable值必须配为0。
  • 自定义lua配置 表14 customLuaConf字段说明 参数名 类型 是否必选 说明 slb100GlobalInit String 否 大小不得超过16KB slb200WorkerInit String 否 大小不得超过16KB slb300PreFlowControl String 否 大小不得超过16KB slb400OnFlowControled String 否 大小不得超过16KB slb500PreGrey Int 否 大小不得超过16KB slb600PostGrey String 否 大小不得超过16KB slb700PostRoute String 否 大小不得超过16KB slb750RespHeaderFilter int 否 大小不得超过16KB slb800RespBodyFilter float 否 大小不得超过16KB slb_instance_config/SLB_100_Global_Init_iac3.lua #SLB_100_Global_Init_iac3.lua默认配置 --the custom point SLB_100_Global_Init, running when Global init. --will be triggered in exec function, so pls make sure there is a exec function in global_init local global_init = {}; function global_init.exec(gen_param) --eg:ngx.log(ngx.ERR,"i am in global_init") end return global_init slb_instance_config/SLB_200_Worker_Init_iac3.lua #SLB_200_Worker_Init_iac3.lua默认配置 --the custom point SLB_200_Worker_Init, running when Worker init. --will be triggered in exec function, so pls make sure there is a exec function in worker_init local worker_init = {}; function worker_init.exec(gen_param) --eg:ngx.log(ngx.ERR,"i am in worker init"); end return worker_init slb_instance_config/SLB_300_Pre_FlowControl_iac3.lua #SLB_300_Pre_FlowControl_iac3.lua默认配置 --the custom point SLB_300_Pre_FlowControl, running before flowcontrol and blacklist. --will be triggered in exec function, so pls make sure there is a exec function in pre_flowcontrol local pre_flowcontrol = {}; function pre_flowcontrol.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in pre flowcontrol") end return pre_flowcontrol slb_instance_config/SLB_400_On_FlowControled_iac3.lua #SLB_400_On_FlowControled_iac3.lua默认配置 --the custom point SLB_400_On_FlowControlled, running when request is flowcontrolled or blocked due to blacklist. --will be triggered in exec function, so pls make sure there is a exec function in on_flowcontroled local on_flowcontroled = {}; function on_flowcontroled.exec(gen_param) --eg:ngx.log(ngx.ERR,"the flowcontrol type is:",gen_param.control_type) end return on_flowcontroled slb_instance_config/SLB_500_Pre_Grey_iac3.lua #SLB_500_Pre_Grey_iac3.lua默认配置 --the custom point SLB_500_Pre_Grey, running before Greyrule judge. --will be triggered in exec function, so pls make sure there is a exec function in pre_grey local pre_grey = {}; function pre_grey.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in pre grey"); end return pre_grey slb_instance_config/SLB_600_Post_Grey_iac3.lua #SLB_600_Post_Grey_iac3.lua默认配置 --the custom point SLB_600_Post_Grey, running after get result of greyrule. --will be triggered in exec function, so pls make sure there is a exec function in post_grey local post_grey = {}; function post_grey.exec(gen_param) --eg:ngx.log(ngx.ERR,"I AM IN POST GREY"); end return post_grey slb_instance_config/SLB_700_Post_Route_iac3.lua #SLB_700_Post_Route_iac3.lua默认配置 --the custom point SLB_700_Post_Route, running after get result of routerule. --will be triggered in exec function, so pls make sure there is a exec function in post_route local post_route = {}; function post_route.exec(gen_param) --eg:ngx.log(ngx.ERR,"I AM IN POST Route"); end return post_route slb_instance_config/SLB_750_Resp_Header_Filter_iac3.lua #SLB_750_Resp_Header_Filter_iac3.lua默认配置 --the custom point SLB_750_Resp_Header_Filter, running during header filter. --will be triggered in exec function, so pls make sure there is a exec function in header_filter local header_filter = {}; function header_filter.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in header filter"); end return header_filter slb_instance_config/SLB_800_Resp_Body_Filter_iac3.lua #SLB_800_Resp_Body_Filter_iac3.lua默认配置 --the custom point SLB_800_Resp_Body_Filter, running during body filter. --will be triggered in exec function, so pls make sure there is a exec function in body_filter local body_filter = {}; function body_filter.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in body filter"); end return body_filter
  • 流控配置 表9 flowControlConf字段说明 参数名 类型 是否必选 说明 flowControlSwitch String 是 流控总开关,取值为on或off。 autoDivideSwitch String 是 分摊模式开关,取值为on或off。 flowControlOrder String 是 流控类型执行顺序,和下面的流控配置相匹配。 nodeFlowControl FlowControlTypeBean 否 节点级流控配置 interfaceFlowControl FlowControlTypeBean 否 接口级流控配置 serviceFlowControl FlowControlTypeBean 否 服务级流控配置 ipFlowControl FlowControlTypeBean 否 IP流控配置 singleParamFlowControl FlowControlTypeBean 否 自定义参数流控配置 multiParamFlowControl FlowControlTypeBean 否 多参数组合流控配置 quotaFlowControl FlowControlTypeBean 否 配额流控配置 concurrentFlowControl FlowControlTypeBean 否 并发连接流控配置
  • 其他配置 表13 confLuaConf字段说明 参数名 说明 addGreyFlag 灰度标记开关,取值为on或off。 greyTestSwitch 灰度测试开关,取值为on或off。 greyTestServiceId 灰度测试服务Id。 greyTestSwitch为on时必传。 getIpType 取IP方式,取值为1或2,1表示从左取,2表示从右取,默认为1。 isBypassOnGreyDown 灰度服务器全部宕机后,请求路由到生产开关,取值为on或off,默认为off。 areaGreyGetIpFromLeft 地域灰度IP从左侧取值开关,取值为on或off,默认为off。 greyTestQpsLimit 灰度测试每秒转发量限制,取值为1到1000。 successRateAlarmAbsThreshold 成功率告警阈值绝对值,非负浮点数,取值为0到100,默认值为90。 successRateAlarmOffsetThreshold 成功率下降告警阈值(相比1分钟前或者5分钟前),非负浮点数,取值为0到100,默认值为5。 healthCheckAlarmServerCountThreshold 健康检查不健康机器数告警阈值,正整数,默认为1,表示有1台节点不健康就会告警。 healthCheckAlarmDurationThreshold 健康检查告警持续时间阈值,非负正整数,默认为0,表示不健康主机立即告警;如果配置为1,表示发现不健康持续1分钟以上,才会告警。 concurrentFlowControlAlarmThreshold 并发请求流控告警阈值,非负整数,默认为0,表示只要发生1次流控,就会告警。 serviceFlowControlAlarmThreshold 服务级流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 singleParamFlowControlAlarmThreshold 自定义参数流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 multiParamFlowControlAlarmThreshold 多参数流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 quotaFlowControlAlarmThreshold 配额流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 manyRequestPreAlarmThreshold 请求数过多告警阈值,正整数,例如:25000,表示每个cpu每分钟平均处理达到25000请求,则触发告警。 以4C的主机为例,1分钟处理超过25000*4=100000请求,则开始告警。 manyRequestAlarmThreshold 请求数警阈值,非负整数,默认为0。 statisticsParams 统计日志参数,格式为ParamName:position。 ParamName为参数名称。 Position为参数位置,取值为queryString或header。 slb_instance_config/conf_lua_config.yaml #其他配置 addGreyFlag: 'off' #非必填,灰度标记开关,取值为off或on greyTestSwitch: 'off' #非必填,灰度测试开关,取值为off或on greyTestServiceId: 123456 #非必填,灰度测试服务ID isBypassOnGreyDown: 'off' #非必填,宕机时路由到生产集群开关,取值为off或on areaGreyGetIpFromLeft: 'off' #非必填,地域灰度IP从左取值开关 ,取值为off或on getIpType: 1 #非必填,取IP方式,取值为1或2 statisticsParams: #非必填,统计日志参数 greyTestQpsLimit: 1000 #非必填,灰度测试每秒转发量限制,取值为1到1000 manyRequestAlarmThreshold: 1000 #非必填,请求数量告警 successRateAlarmAbsThreshold: 90 #非必填,成功率告警阈值,取值为0到100 successRateAlarmOffsetThreshold: 90 #非必填,成功率下降告警阈值,取值为0到100 healthCheckAlarmServerCountThreshold: 1000 #非必填,健康检查告警阈值 healthCheckAlarmDurationThreshold: 1000 #非必填,健康告警持续时间阈值 concurrentFlowControlAlarmThreshold: 1000 #非必填,并发连接流控告警阈值 serviceFlowControlAlarmThreshold: 1000 #非必填,服务级流控告警阈值 multiParamFlowControlAlarmThreshold: 1000 #非必填,多参数流控告警阈值 singleParamFlowControlAlarmThreshold: 1000 #非必填,自定义参数流控告警阈值 quotaFlowControlAlarmThreshold: 1000 #非必填,配额流控告警阈值 manyRequestPreAlarmThreshold: 1000 #非必填,请求数量预告警
  • nginx配置 slb_instance_config/nginx.conf #nginx默认配置 #user slb slb; worker_processes auto; #worker_cpu_affinity 0001 0010 0100 1000; pid logs/nginx.pid; ##################################################################### ### Default: Close the error log error_log /dev/null crit; # nofile per worker around 20000-100000 is ok, eg, if have 8 worker, nginx will use no more than 8*worker_rlimit_nofile nofile, should make this result less than system nofile. worker_rlimit_nofile 51200; events { use epoll; # connections per worker, usually setup same or similar value as worker_rlimit_nofile. worker_connections 51200; } http { ##################################################################### ### load basic lua script include 'lua/nginx.http.lua.conf'; init_by_lua_file 'conf/lua/initial.lua'; init_worker_by_lua_file 'conf/lua/initialWorker.lua'; log_by_lua_file 'conf/lua/monitor/LogRequest.lua'; #rewrite_by_lua_no_postpone on; ##################################################################### uninitialized_variable_warn off; server_tokens off; autoindex off; port_in_redirect off; ssi off; proxy_hide_header X-Powered-By; add_header X-XSS-Protection "1; mode=block"; add_header X-frame-options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains "; add_header Content-Security-Policy "default-src 'self'"; add_header Cache-control "no-cache, no-store, must-revalidate"; add_header Pragma no-cache; add_header Expires 0; client_header_timeout 60s; client_body_timeout 60s; keepalive_timeout 75s; send_timeout 60s; client_header_buffer_size 1k; large_client_header_buffers 4 8k; client_body_buffer_size 16k; client_max_body_size 1m; proxy_buffer_size 8k; proxy_buffers 8 8k; proxy_busy_buffers_size 16k; include mime.types; default_type text/html; ##################################################################### ### gzip compress gzip on; gzip_http_version 1.1; gzip_comp_level 5; gzip_min_length 1k; gzip_disable "MSIE [1-6]."; gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss application/xhtml+xml; ##################################################################### ### enabled the error page process fastcgi_intercept_errors on; error_page 400 401 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 /4xx.html; error_page 500 501 502 503 504 505 /5xx.html; ##################################################################### ### log format and switch. log_format main '$time_local|$request_time|$upstream_response_time|$uri' '|$status|$body_bytes_sent|$request_length|$bytes_sent|$http_user_agent|$http_host' '|$upstream_addr|$upstream_status|$scheme|$is_grey_server|$resp_status|$server_protocol'; access_log logs/access.log main buffer=5m flush=10s; log_format bigData '$time_local|$server_addr|$upstream_addr|$is_grey_server|$uri' '|$upstream_status|$resp_status|$request_time|$upstream_response_time|$request_length|$bytes_sent|$connections_active|$target_all|$remote_addr' '|$http_x_forwarded_for|$request_method|$http_user_agent|$status|$http_referer|$server_protocol|$body_bytes_sent|$request_length|$http_host|$request' '|$server_port|-|$http_x_api_method||||||||||'; access_log logs/access_for_big_data.log bigData buffer=5m flush=10s; ##################################################################### ### load sub configure include vhosts/*.conf; include slb_conf/*.conf; }
  • 内网段配置 表3 innerSegmentsConf字段说明 参数名 类型 是否必选 说明 segment String 是 IP地址段,格式为ip/子网掩码。 slb_instance_config/inner_segments_config.yaml #内网段配置 - segment: 10.0.0.0/8 - segment: 127.0.0.1/32 - segment: 172.16.0.0/12 - segment: 192.168.0.0/16 - segment: 100.125.0.0/16
  • 重写重定向配置 表2 urlResetConf字段说明 参数名 类型 是否必选 说明 transferType String 是 转换类型,为以下枚举值: rewriteGrey:灰度重写 rewriteNormal:生产重写 redirectGrey:灰度重定向 redirectNormal:生产重定向 source String 是 匹配路径,例:/abc/portal/login.jsp(.*)$ target String 是 目标路径,例:/abc/def/$1 slb_instance_config/url_reset_config.yaml #重写重定向配置 - transferType: rewriteNormal #必填,转发类型,rewriteNormal代表生产重写 source: /a1 #必填,匹配路径 target: /b1 #必填,目标路径 - transferType: rewriteGrey #必填,转发类型,rewriteGrey代表灰度重写 source: /a2 #必填,匹配路径 target: /b2 #必填,目标路径
  • Kafka资源 RFS 模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dms_kafka_instance": { "kafka-gq8ef": { "manager_password": "${var.Kafka-Manager-Password-nsbl}", "name": "kafka-rfs-001", "charging_mode": "postPaid", "manager_user": "kafka-manager-rfs", "flavor_id": "s6.2u4g.cluster.small", "engine_version": "3.x", "broker_num": 3, "storage_spec_code": "dms.physical.storage.high.v2", "availability_zones": ["cn-north-4a"], "storage_space": 300, "vpc_id": "18b117f8-****-****-****-6d022db472a1", "network_id": "bef6af2f-****-****-****-9e78ef03eb6a", "security_group_id": "32ed0723-****-****-****-7c0fb748d436", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "retention_policy": "time_base" } } }, "variable": { "Kafka-Manager-Password-nsbl": { "description": "Manager Password for kafka-gq8ef", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • RDS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_rds_instance": { "rds-instance-yaqsb": { "name": "rds-rfs-001", "charging_mode": "postPaid", "db": { "type": "MySQL", "version": "8.0", "password": "${var.RDS-Password-u6z0}" }, "ha_replication_mode": "async", "volume": { "size": 40, "type": "ULTRAHIGH" }, "vpc_id": "18b117f8-****-****-****-6d022db472a1", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a", "security_group_id": "32ed0723-****-****-****-7c0fb748d436", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "availability_zone": ["cn-north-4c", "cn-north-4c"], "flavor": "rds.mysql.c6.large.2.ha" } } }, "variable": { "RDS-Password-u6z0": { "description": "Password for rds-instance-yaqsb", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • D CS 资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dcs_instance": { "dcs-cx83b": { "charging_mode": "postPaid", "availability_zones": ["cn-north-4a", "cn-north-4a"], "vpc_id": "18b117f8-****-****-****-6d022db472a1", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a", "maintain_begin": "18:00:00", "maintain_end": "22:00:00", "engine_version": "5.0", "capacity": 1, "flavor": "redis.ha.xu1.large.r2.1", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "password": "${var.DCS-Password-qvwu}", "name": "dcs-rfs-001", "engine": "Redis" } } }, "variable": { "DCS-Password-qvwu": { "description": "dcs password for dcs-cx83b", "type": "string", "sensitive": true, "nullable": true, "default": null } } }
  • VPC资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_vpc": { "vpc-krkup": { "name": "vpc-rfs-001", "cidr": "192.168.0.0/16", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d" } }, "huaweicloud_vpc_subnet": { "vpc-subnet-ppnwk": { "name": "subnet-rfs-001", "cidr": "192.168.3.0/24", "gateway_ip": "192.168.3.1", "vpc_id": "c6131e37-****-****-****-5fffa75982f3", "depends_on": ["huaweicloud_vpc.vpc-krkup"] } }, "huaweicloud_vpcep_endpoint": { "vpcep_endpoint-4epnv": { "service_id": "ebc591db-****-****-****-15354c9bef25", "network_id": "${huaweicloud_vpc_subnet.vpc-subnet-ppnwk.id}", "vpc_id": "${huaweicloud_vpc_subnet.vpc-subnet-ppnwk.vpc_id}" } }, "huaweicloud_networking_secgroup": { "sg-rmo7v": { "name": "sg-rfs-all-deny", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "description": "通用Web服务器,默认放通22、3389、80、443端口和ICMP协议。 适用于需要远程管理、公网ping及用于网站服务的云服务器场景。", "depends_on": ["huaweicloud_vpc.vpc-krkup"] } }, "huaweicloud_networking_secgroup_rule": { "sg-rule-d28sj": { "action": "allow", "direction": "ingress", "ethertype": "IPv4", "protocol": "icmp", "remote_ip_prefix": "0.0.0.0/0", "priority": 1, "security_group_id": "${huaweicloud_networking_secgroup.sg-rmo7v.id}" } } } }
  • ECS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_compute_instance": { "ecs-qh7h5": { "name": "ecs-rfs-001", "charging_mode": "postPaid", "admin_pass": "${var.ECS-Password-ia2c}", "flavor_id": "s6.small.1", "system_disk_type": "SAS", "availability_zone": "cn-north-4a", "network": { "uuid": "bef6af2f-****-****-****-9e78ef03eb6a" }, "security_group_ids": ["986d4460-****-****-****-f5f237df42c0"], "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "system_disk_size": 40, "image_id": "86405805-****-****-****-09f30b497c98" } } }, "variable": { "ECS-Password-ia2c": { "description": "Ecs password for ecs-qh7h5", "type": "string", "sensitive": true, "nullable": true, "default": null } } }
  • DNS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dns_zone": { "dns-zone-iz7r1": { "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "zone_type": "private", "router": { "router_id": "c6131e37-****-****-****-5fffa75982f3" }, "name": "exampleninenine.com" } } } }
  • 研发包结构 Service下所有的main.tf文件中的Resource实例不能有重叠,否则会导致资源被覆盖或删除。 图1 研发包结构 表1 研发包结构介绍 文件名 说明 Service(推荐方式) 按云服务维度的资源模板,整个云服务涉及资源的生命周期都在同一个RFS资源模板中管理。 MicroService 按微服务维度的资源模板管理,当一个云服务的每个微服务有单独的资源时使用。 envXname 云服务/微服务部署环境,每个环境的RFS包资源都是与环境配套,每个环境都有单独的资源模板。 package.json 固定名称与格式,发布包版本信息,类型,软件包名称,版本。 { "type": "rfstemplate", // 固定 "name": "templatename", // RFS模板名称,服务下唯一 "envid": "envid1", // 云服务的环境ID "version": "1.0.0", // RFS模板版本号 "maintf": "main.tf", // 实际创建资源的TF文件 "variablestf": "variable.tf" // 存储参数变量的TF文件 } main.tf RFS实际使用的模板文件,通过此文件来管理华为云资源。当前支持的华为云资源有CCE、DCS、DNS、ECS、Kafka、RDS及VPC,模板文件样例分别参考CCE资源RFS模板文件、DCS资源RFS模板文件、DNS资源RFS模板文件、ECS资源RFS模板文件、Kafka资源RFS模板文件、RDS资源RFS模板文件及VPC资源RFS模板文件。 详细的开发规范请参考Terraform文档。 variable.tf RFS资源模板中涉及到的变量值,可能多个云服务变量名称不一致,提取出来单独设置。样例如下: CCE-Name-1234: "CCE-Cluster-ERS" 建议敏感数据不在此文件设置,敏感数据在界面手动输入。
  • CCE资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_cce_cluster": { "cce-cluster-yfclf": { "vpc_id": "18b117f8-****-****-****-6d022db472a1", "name": "cce-cluster-rfs-001", "cluster_version": "v1.27", "charging_mode": "postPaid", "flavor_id": "cce.s2.small", "container_network_type": "vpc-router", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a" } }, "huaweicloud_cce_node": { "cce-node-pmqnn": { "name": "cce-node-rfs-001", "charging_mode": "postPaid", "flavor_id": "c7.large.2", "os": "Huawei Cloud EulerOS 2.0", "runtime": "containerd", "root_volume": { "size": 50, "volumetype": "SAS" }, "password": "${var.CCE-Node-Password-u9fi}", "cluster_id": "d6eb9020-****-****-****-0255ac1000ac", "availability_zone": "cn-north-4c", "data_volumes": [{ "volumetype": "SAS", "size": 100 }], "storage": { "selectors": [{ "name": "cceUse", "type": "evs", "match_label_count": 1, "match_label_size": 100, "match_label_volume_type": "SAS" }], "groups": [{ "name": "vgpaas", "cce_managed": true, "selector_names": ["cceUse"], "virtual_spaces": [{ "name": "runtime", "size": "90%", "runtime_lv_type": "linear" }, { "name": "kubernetes", "size": "10%", "lvm_lv_type": "linear" }] }] }, "depends_on": ["huaweicloud_cce_cluster.cce-cluster-yfclf"], "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a" } } }, "variable": { "CCE-Node-Password-u9fi": { "description": "Password for cce-node-pmqnn", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • 如何定义流水线 meta.yaml文件涉及applyPipeline/pipelines两个字段。pipelines中支持定义多个流程,applyPipeline描述本次变更要使用的流程。pipeline能力丰富,通过设计pipeline可以实现精巧的多阶段部署、部分变更、主动暂停等复杂场景的变更编排。 样例如下: type: WiseCloud::Environment # 保留字,声明这是一个针对环境的IAC代码 applyPipeline: default # 代码中指定的默认pipeline,指定的pipeline必须是在pipelines中声明的 pipelines: # 列表,可以定义多个pipeline,并在执行任务时选择 - name: default # pipeline名称 action: Serial # 此pipeline执行任务的策略 Serial(串行)/ Parallel(并行) tasks: # 声明流水线的子任务,通过声明pipeline的任务,实现对资源部署流程的编排 - name: apply-chaosmonkey-stage1 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-por action: Apply component: name: WiseEyeChaosMonkeyPortal - name: all action: Serial tasks: - name: apply-chaosmonkey-stage1 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-por action: Apply component: name: WiseEyeChaosMonkeyPortal - name: apply-chaosmonkey-stage2 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-mgr action: Apply component: name: WiseEyeChaosMonkeyMgrService 表1 meta.yaml字段说明 字段 说明 type 描述当前环境类型,当前为固定值WiseCloud::Environment。 applyPipeline 定义默认选用的组件编排流水线名称,当前默认使用environment-deploy。 pipelines pipelines中支持定义多个流程。
  • CodeArts Repo最佳实践汇总 表1 常用最佳实践 实践 描述 批量迁移GitLab内网仓库到CodeArts Repo CodeArts Repo现有迁仓能力只支持公网之间迁移,缺少客户内网自建代码托管平台往Repo迁移的快速方案,因此提供批量迁移内网代码托管平台仓库到Repo的脚本。 如何批量将外部仓库导入CodeArts Repo CodeArts Repo现有迁仓能力只支持公网之间迁移,缺少客户内网自建代码托管平台往Repo迁移的快速方案,因此提供批量迁移内网代码托管平台仓库到Repo的脚本。 HE2E DevOps实践之管理代码 本文以“DevOps全流程示例项目”为例,介绍如何在项目中进行代码开发。 代码托管安全配置概述 CodeArts Repo通过提供访问令牌、部署密钥、保护分支管理等能力,为代码资产安全保驾护航。 企业如何进行仓库成员及权限管理 CodeArts Repo涉及项目级、代码组和仓库级权限,该案例以一个企业项目开发为例,介绍如何为企业不同角色配置CodeArts Repo的权限。 配置HTTPS密码 当用户需要将代码推送到代码托管仓库或从代码托管仓库拉取代码时,代码托管仓库需要验证用户的身份与权限,HTTPS密码是对代码托管进行远程访问的一种身份验证方式,并且用户只需要设置一次HTTPS密码。
  • 开始批量迁移 执行如下命令,查看脚本参数。 python migrate_to_repo.py -h usage: migrate_to_repo.py [-h] [-p {SSH,HTTP,ssh,http}] [-m {API,FILE,api,file}] optional arguments: -h, --help show this help message and exit -p {SSH,HTTP,ssh,http}, --protocol {SSH,HTTP,ssh,http} protocol specified for clone or push -m {API,FILE,api,file}, --mode {API,FILE,api,file} import mode # 参数说明 # -p 协议,默认是SSH协议,可选为SSH/ssh/HTTP/http
  • 检视代码、合并分支 开发人员发起合并请求。 开发人员Chris完成代码开发,确认无误后,即可发起合并请求,将功能分支合并到master中。 进入代码仓库,选择“合并请求”页签,单击“新建合并请求”。 源分支选择“Feature-Store”,目标分支选择“master”,单击“下一步”。 参照表3编辑合并请求详情。 表3 合并请求配置 配置项 配置建议 标题 输入“添加门店网络列表”。 合并人 单击,在弹框中勾选“Maggie”,单击“确定”。 审核人 单击,在弹框中勾选“Maggie”,单击“确定”。 单击“新建合并请求”完成合并请求的创建。 项目经理评审并完成代码合入。 本文档中,合并请求的评审人与合并人均是项目经理Maggie。因此Maggie可评审合并请求内容,并在评审通过后完成分支合入。 进入代码仓库后,选择“合并请求”页签,可找到由开发人员Chris创建的合并请求。 单击该请求,查看合并请求详情。 可在页面中留下评审意见。单击审核门禁中“通过”完成审核。 单击“合入”,将分支合入“master”。 如果发起分支合并请求时勾选了“合并后删除源分支”,分支“Feature-Store”将在分支合并完成后被删除。
  • 背景介绍 如下图所示,项目的研发小明拥有了新的子账号,需要在此账号下开发项目“Test_Project”的“Test_Repo”代码仓。 小明将代码推送到代码托管仓库或从代码托管仓库拉取代码时,代码托管仓库需要验证用户的身份与权限,HTTPS密码是对代码托管进行远程访问的一种身份验证方式,本案例会介绍小明如何初次配置HTTPS密码和修改HTTPS密码,并通过Windows从Repo克隆代码文件、把代码文件上传到Repo。
  • 代码安全 代码托管服务 (CodeArts Repo)通过提供访问令牌、部署密钥、保护分支管理等能力,为代码资产安全保驾护航。 表1 代码安全 安全配置 说明 配置建议 参考资料 访问令牌 CodeArts Repo为每个用户提供生成访问令牌功能,令牌仅在生成时显示一次,并且可以设置有效期,默认有效期1个月,最长有效期为1年。 建议在授权个人仓库访问权限给第三方时,创建访问令牌并设置有效期,避免暴露账号密码。 配置访问令牌 部署密钥 CodeArts Repo支持为代码仓库添加部署密钥,通过部署密钥访问代码仓库时只有只读权限。 建议在构建等对代码仓库只读场景下,使用部署密钥克隆代码仓,尽可能避免密钥泄露等影响代码仓安全。 配置部署密钥 保护分支管理 在代码仓库中可以设置保护分支,防止此分支被修改或误删。 建议将主干分支设置为保护分支,仅能通过合并请求的方式将代码合入主干分支,且禁止任何人对保护分支做强制推送。 配置保护分支 可见范围管理 CodeArts Repo支持对代码仓库设置以下可见范围。 私有(仓库仅对仓库成员可见,仓库成员可读写和访问仓库) 公开 项目内成员只读 租户内成员只读 所有访客只读 建议结合业务需要,在新建仓库时选择相应的可见范围,或为已创建的代码仓库调整可见范围。 管理员也可以根据需要设置是否可以创建可见范围为“公开”的代码仓库。 设置仓库可见范围请参考新建仓库。 管理员设置是否创建可见范围为“公开”的代码仓库请调整仓库公开性。 提交规则管理 CodeArts Repo支持为代码仓库设置提交规则,用户可以选择服务提供的提交规则,也可以自定义提交规则。 建议结合业务需要,为每个仓库设置提交规则,防止代码被随意修改。 配置提交规则
  • 操作场景 CodeArts提供基于角色的权限管理(RBAC)。默认情况下,新创建的用户没有任何权限,需要将其加入项目,并给用户配置角色,才能使得用户获得角色所对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 CodeArts中内置了多种系统角色,同时支持自定义角色,用户可以根据自己的需要创建新的角色,并为其配置需求管理、软件建模、代码托管、代码检查、编译构建、制品仓库、部署、测试计划、流水线等服务的操作权限。
  • 操作场景 当购买需求管理、代码托管、测试计划等单服务套餐时,管理员(拥有Tenant Administrator角色权限)可以通过“服务级访问权限管理”页面,按服务为项目成员分配访问权限。 服务级访问权限管理仅对需求管理、代码托管、测试计划等计费项中有“用户数”的服务生效。任何加入项目的成员均可根据实际购买情况使用代码检查、构建、部署、流水线等服务。 项目中添加成员时会根据已购买服务的套餐人数自动分配服务访问权限,直到达到套餐人数规格,您可以随时到本页面手动分配人员访问权限。 例如:团队中有5个人A、B、C、D、E, 购买2人规格需求管理套餐、3人规格代码托管套餐。创建项目后,按照A、B、C、D、E的顺序,依次将5个人加入项目。此时,A、B两人默认拥有两个服务的访问权限,C有代码托管服务的访问权限,D、E对两个服务都没有访问权限。管理员可以根据实际需要,在“服务级访问权限管理”页面中为5个人开启或关闭两个服务的访问权限,其中最多可为2个人设置需求管理访问权限、最多可为3个人设置代码托管访问权限。 首次购买某类套餐时,按用户名升序自动分配服务访问权限,直到达到套餐人数规格;非首次购买同类套餐时,恢复为上一次的成员服务访问权限。 例如:团队中有5个人A、B、C、D、E,当前已购买5人规格需求管理套餐,并已在项目中添加5人。此时购买3人规格代码托管套餐,默认A、B、C将拥有代码托管服务的访问权限。管理员取消A、B的代码托管服务访问权限,并为D、E授权访问代码托管服务。当代码托管套餐到期后,C、D、E失去代码托管服务访问权限;如果再次购买3人规格代码托管套餐,则C、D、E将恢复代码托管服务的访问权限。
  • 提交加入项目申请 扫描二维码、或者打开链接。 在打开的网页中输入登录信息,登录CodeArts。 输入申请加入项目的理由(不超过128个字符),单击“提交申请”。 图2 申请加入项目 提交申请成功,等待审核。 如果申请加入的项目需要审核,页面显示“已提交申请,等待管理员审核”。 审核通过,刷新页面后显示“您已经是项目成员”,并自动跳转至项目中。 审核未通过,刷新页面后显示“申请加入项目”弹框。 如果申请加入的项目不需要审核,页面中显示“成功加入项目”,并自动跳转至项目中。
  • 添加CodeArts项目成员方式说明 CodeArts支持通过以下方式向项目中添加成员。 添加成员:项目管理员主动将用户添加为项目成员。根据用户来源的不同,分为以下几种操作: 添加本账号 IAM 用户为CodeArts项目成员 从其他CodeArts项目导入成员 邀请其他账号用户为CodeArts项目成员 从委托中导入CodeArts项目成员 通过链接邀请:项目成员分享二维码、或者项目链接给待邀请的用户,用户扫描二维码、或者单击项目链接可以提交加入项目申请。 父主题: 添加CodeArts项目成员
  • 通过CodeArts控制台接受其他企业账户授权 以下操作在账号B中完成。 被邀请的账号可自动接受授权、或者手动接受授权。授权方式可通过CodeArts控制台修改。 图1 修改授权方式 修改授权方式、手动接受授权需要拥有Tenant Administrator角色权限或者DevCloud Console FullAccess权限。 手动接受授权的步骤如下: 登录CodeArts控制台,单击,选择区域。 在导航中单击“企业账户授权”。 选择“接受其他企业账户授权”页签,列表中可查看收到的授权邀请,状态为“待处理”。 根据需要选择“接受”或者“拒绝”。 选择“接受”,在弹框中单击“确认”,邀请的状态将更新为“启用”。单击“退出授权”可以删除该邀请。 选择“拒绝”,在弹框中单击“确认”,邀请的状态将更新为“已拒绝”。
  • 前提条件 已在账号A中新建项目X,且用户a在项目X中拥有“成员设置”权限。 被邀请的账号(B)与发出邀请的账号(A)需属于同一个站点。 被邀请用户(b)所属的账号(B)已接受发出邀请的账号(A)的授权。授权方法请参考通过CodeArts控制台授权给其他企业账户,接受授权的方法请参考通过CodeArts控制台接受其他企业账户授权。 如果通过“委托ID”邀请,被邀请的账号(B)中已存在委托对象为云服务“IAM身份中心”的委托。如果没有委托,请参考以下步骤创建。 创建用户 创建权限集 账号关联用户和权限集
  • 通过CodeArts控制台授权给其他企业账户 以下操作在账号A中完成。 授权其他企业账户操作需要拥有Tenant Administrator角色权限或者DevCloud Console FullAccess权限。 登录CodeArts控制台,单击,选择区域。 在导航中单击“企业账户授权”。 选择“授权其他企业账户”页签中,单击“邀请企业账户”。 在弹框中输入被邀请的企业账户ID,单击“邀请”。 企业账户ID通过“我的凭证”页面获取,获取方法如下。 登录控制台,鼠标移动至右上方的用户名,在下拉列表中选择“我的凭证”。 在“API凭证”页面获取“账号ID”的值。 邀请授权成功,列表中将增加一条记录。 如果被邀请的账号需要手动接受授权,该记录的状态为“待处理”。 如果邀请被接受(包括手动接受、或自动接受),该记录的状态为“启用”。单击“取消授权”,可以删除该记录。 如果邀请被拒绝,该记录的状态更新为“已拒绝”。单击“重新邀请”可以再次发送授权邀请。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全