diff --git a/README.md b/README.md index c17fb87..c3926c4 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ | v1.1.6 | 优化日志打印 | | v1.1.7 | 新增kubernetes构建资源相关api | | v1.1.8 | 增加fileGateway | +| v1.1.9 | 插件支持国际化,增加MessageUtil、I18nUtil工具类,AtomResult类增加setErrorInfo方法 | [TOC] @@ -131,6 +132,25 @@ java实体对象如下: } ``` +​ 对外提供的方法如下: + +``` +/** + * 设置错误信息 + * + * @param status 执行结果状态 + * @param errorCode 错误码 + * @param errorType 错误类型 + * @param params 替换错误描述信息占位符的参数数组 + */ +public void setErrorInfo(Status status, Integer errorCode, ErrorType errorType, String[] params) { + this.status = status; + this.errorCode = errorCode; + this.errorType = errorType.getNum(); + this.message = + MessageUtil.getMessageByLocale(errorCode.toString(), I18nUtil.getLanguage(), params); +} +``` ##### 3、AtomContext.java (流水线插件上下文类) @@ -444,7 +464,84 @@ for (i in 1..100000000) { ``` +##### 8、支持插件国际化的工具类MessageUtil.java + +​ 包含的主要方法如下: + +``` + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language); + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language, String defaultMessage); + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language, String[] params); + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language, String[] params, String defaultMessage); + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @param baseName 基础资源名称 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale( + String messageCode, + String language, + String[] params, + String baseName, + String defaultMessage + ); + +``` +##### 9、支持插件国际化的工具类I18nUtil.java + +​ 包含的主要方法如下: + +``` + /** + * 获取插件执行时语言信息 + * + * @return 插件执行时语言信息 + */ + public static String getLanguage(); + +``` ## 二、SDK提供的服务介绍 diff --git a/pom.xml b/pom.xml index 2eabc90..1fd8f68 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.tencent.devops.ci-plugins java-plugin-sdk - 1.1.8 + 1.1.9 2018-2118 bk-ci pipeline plugins sdk for java diff --git a/src/main/java/com/tencent/bk/devops/atom/api/impl/CredentialApi.java b/src/main/java/com/tencent/bk/devops/atom/api/impl/CredentialApi.java index 46abfe2..15d9b2f 100644 --- a/src/main/java/com/tencent/bk/devops/atom/api/impl/CredentialApi.java +++ b/src/main/java/com/tencent/bk/devops/atom/api/impl/CredentialApi.java @@ -25,7 +25,7 @@ public Result> getCredential(String credentialId){ Request request = super.buildGet("/ticket/api/build/credentials/" + credentialId + "/detail"); String responseContent = null; try { - responseContent = super.request(request,"获取凭证信息失败"); + responseContent = super.request(request,"get credential fail!"); } catch (IOException e) { logger.error("getCredential throw Exception", e); } diff --git a/src/main/java/com/tencent/bk/devops/atom/pojo/AtomResult.java b/src/main/java/com/tencent/bk/devops/atom/pojo/AtomResult.java index 8d43d0d..93a94a3 100644 --- a/src/main/java/com/tencent/bk/devops/atom/pojo/AtomResult.java +++ b/src/main/java/com/tencent/bk/devops/atom/pojo/AtomResult.java @@ -4,6 +4,9 @@ import com.google.common.collect.Maps; import com.tencent.bk.devops.atom.common.Status; import com.tencent.bk.devops.atom.pojo.quality.QualityValue; +import com.tencent.bk.devops.atom.utils.I18nUtil; +import com.tencent.bk.devops.atom.utils.MessageUtil; +import com.tencent.bk.devops.plugin.pojo.ErrorType; import lombok.Data; import java.util.Map; @@ -31,6 +34,7 @@ * } * } * } + * * @version 1.0 */ @Data @@ -84,4 +88,19 @@ public class AtomResult { @JsonProperty("monitorData") private MonitorData monitorData; + + /** + * 设置错误信息 + * + * @param status 执行结果状态 + * @param errorCode 错误码 + * @param errorType 错误类型 + * @param params 替换错误描述信息占位符的参数数组 + */ + public void setErrorInfo(Status status, Integer errorCode, ErrorType errorType, String[] params) { + this.status = status; + this.errorCode = errorCode; + this.errorType = errorType.getNum(); + this.message = MessageUtil.getMessageByLocale(errorCode.toString(), I18nUtil.getLanguage(), params); + } } diff --git a/src/main/java/com/tencent/bk/devops/atom/utils/I18nUtil.java b/src/main/java/com/tencent/bk/devops/atom/utils/I18nUtil.java new file mode 100644 index 0000000..e6a7405 --- /dev/null +++ b/src/main/java/com/tencent/bk/devops/atom/utils/I18nUtil.java @@ -0,0 +1,19 @@ +package com.tencent.bk.devops.atom.utils; + +import org.apache.commons.lang3.StringUtils; + +public class I18nUtil { + + /** + * 获取插件执行时语言信息 + * + * @return 插件执行时语言信息 + */ + public static String getLanguage() { + String language = System.getenv("BK_CI_LOCALE_LANGUAGE"); + if (StringUtils.isEmpty(language)) { + language = "zh_CN"; + } + return language; + } +} diff --git a/src/main/java/com/tencent/bk/devops/atom/utils/MessageUtil.java b/src/main/java/com/tencent/bk/devops/atom/utils/MessageUtil.java new file mode 100644 index 0000000..33adbf7 --- /dev/null +++ b/src/main/java/com/tencent/bk/devops/atom/utils/MessageUtil.java @@ -0,0 +1,111 @@ +package com.tencent.bk.devops.atom.utils; + +import kotlin.text.Charsets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; + +public class MessageUtil { + + private static final Logger logger = LoggerFactory.getLogger(MessageUtil.class); + private static final String DEFAULT_BASE_NAME = "i18n/message"; + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language) { + return getMessageByLocale(messageCode, language, null, DEFAULT_BASE_NAME, null); + } + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language, String defaultMessage) { + return getMessageByLocale(messageCode, language, null, DEFAULT_BASE_NAME, defaultMessage); + } + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @return 描述信息 + */ + public static String getMessageByLocale(String messageCode, String language, String[] params) { + return getMessageByLocale(messageCode, language, params, DEFAULT_BASE_NAME, null); + } + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale( + String messageCode, + String language, + String[] params, + String defaultMessage + ) { + return getMessageByLocale(messageCode, language, params, DEFAULT_BASE_NAME, defaultMessage); + } + + /** + * 根据语言环境获取对应的描述信息 + * + * @param messageCode 消息标识 + * @param language 语言信息 + * @param params 替换描述信息占位符的参数数组 + * @param baseName 基础资源名称 + * @param defaultMessage 默认信息 + * @return 描述信息 + */ + public static String getMessageByLocale( + String messageCode, + String language, + String[] params, + String baseName, + String defaultMessage + ) { + // 通过resourceBundle获取对应语言的描述信息 + String message = null; + try { + String[] parts = language.split("_"); + Locale localeObj = new Locale(language); + if (parts.length > 1) { + localeObj = new Locale(parts[0], parts[1]); + } + // 根据locale和baseName生成resourceBundle对象 + ResourceBundle resourceBundle = ResourceBundle.getBundle(baseName, localeObj); + // 通过resourceBundle获取对应语言的描述信息 + message = new String(resourceBundle.getString(messageCode).getBytes(Charsets.ISO_8859_1), Charsets.UTF_8); + } catch (Throwable ignored) { + logger.warn("Fail to get i18nMessage of messageCode[" + messageCode + "]", ignored); + } + if (null != params && null != message) { + MessageFormat mf = new MessageFormat(message); + // 根据参数动态替换状态码描述里的占位符 + message = mf.format(params); + } + if (message == null) { + message = defaultMessage; + } + return message; + } +} diff --git a/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/KubernetesBuildApi.kt b/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/KubernetesBuildApi.kt index 1c50ed2..85c190f 100644 --- a/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/KubernetesBuildApi.kt +++ b/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/KubernetesBuildApi.kt @@ -29,7 +29,7 @@ class KubernetesBuildApi : BaseApi() { val requestBody = RequestBody.create(JSON_CONTENT_TYPE, JsonUtil.toJson(dispatchJobReq)) val request = buildPost(path, requestBody, mutableMapOf("X-DEVOPS-UID" to getUserId())) - val responseContent = request(request, "kubernetes job失败") + val responseContent = request(request, "kubernetes job fail") logger.debug("create kubernetes job response: $responseContent") return JsonUtil.fromJson(responseContent, object : TypeReference>() {}) @@ -38,7 +38,7 @@ class KubernetesBuildApi : BaseApi() { fun getJobStatus(jobName: String): Result { val path = "/dispatch-kubernetes/api/build/job/" + jobName + "/status" val request = buildGet(path, mutableMapOf("X-DEVOPS-UID" to getUserId())) - val responseContent = request(request, "获取job状态失败") + val responseContent = request(request, "failed to get job status") logger.debug("get kubernetes job status response: $responseContent") return JsonUtil.fromJson(responseContent, object : TypeReference>() {}) } @@ -46,7 +46,7 @@ class KubernetesBuildApi : BaseApi() { fun getJobLogs(jobName: String, sinceTime: Int): Result { val path = "/dispatch-kubernetes/api/build/job/" + jobName + "/logs?sinceTime=" + sinceTime val request = buildGet(path, mutableMapOf("X-DEVOPS-UID" to getUserId())) - val responseContent = request(request, "获取job日志失败") + val responseContent = request(request, "failed to get job log") logger.debug("get kubernetes job logs response: $responseContent") return JsonUtil.fromJson(responseContent, object : TypeReference>() {}) } @@ -54,7 +54,7 @@ class KubernetesBuildApi : BaseApi() { fun getTask(taskId: String): Result { val path = "/dispatch-kubernetes/api/build/task/status?taskId=" + taskId val request = buildGet(path, mutableMapOf("X-DEVOPS-UID" to getUserId())) - val responseContent = request(request, "获取task信息失败") + val responseContent = request(request, "get task info fail") logger.debug("get kubernetes task response: $responseContent") return JsonUtil.fromJson(responseContent, object : TypeReference>() {}) } @@ -65,7 +65,7 @@ class KubernetesBuildApi : BaseApi() { val requestBody = RequestBody.create(JSON_CONTENT_TYPE, JsonUtil.toJson(dispatchBuildImageReq)) val request = buildPost(path, requestBody, mutableMapOf("X-DEVOPS-UID" to getUserId())) - val responseContent = request(request, "kubernetes docker build失败") + val responseContent = request(request, "kubernetes docker build fail") logger.debug("docker build response: $responseContent") return JsonUtil.fromJson(responseContent, object : TypeReference>() {}) diff --git a/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/SensitiveConfApi.kt b/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/SensitiveConfApi.kt index c71a842..e2e4983 100644 --- a/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/SensitiveConfApi.kt +++ b/src/main/kotlin/com/tencent/bk/devops/plugin/api/impl/SensitiveConfApi.kt @@ -16,7 +16,7 @@ class SensitiveConfApi : BaseApi() { fun getAtomSensitiveConf(atomCode: String): Result?> { val path = "/store/api/build/store/sensitiveConf/types/ATOM/codes/$atomCode" val request = buildGet(path) - val responseContent = retryRequest(request, "获取插件私有配置失败") + val responseContent = retryRequest(request, "failed to get plugin private configuration!") return JsonUtil.to(responseContent, object : TypeReference?>>() {}) } }