diff --git a/README.md b/README.md index 35cd11a6755ccdbfa180bf6a1d9db4535b9dfa02..afeca58105d19ff7f817419c8cc39784564b99f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Jenkins华为云OBS上传插件 +# Jenkins华为云插件 -## 使用 +## 1、OBS上传文件插件使用 #### 下载源码&编译 ```bash @@ -42,7 +42,7 @@ mvn package -DskipTests | file | 文件名称,用于指定要上传的文件全名,不能与includePathPattern一起使用 | | includePathPattern | 文件正则匹配路径,用于匹配要上传的文件,不能与file一起使用 | | excludePathPattern | 排除文件名正则匹配路径 | -| path | obs远端目录,上传的文件将按照工作空间下的目录结构放到此目录下 | +| path | obs远端目录,上传的文件将按照工作空间下的目录结构放到此目录下,不填写默认为根目录 | | contentType | [文件类型](https://support.huaweicloud.com/ugobs-obs/obs_41_0025.html#obs_41_0025__section1973224795419) | | kmsId | [SSE-KMS key_id](https://support.huaweicloud.com/api-obs/obs_04_0106.html),加密用 | | acl | [文件权限策略](https://support.huaweicloud.com/sdk-go-devg-obs/obs_33_0203.html) | @@ -101,4 +101,175 @@ mvn clean package -DskipTests 3.运行 ```bash mvn clean hpi:run -``` \ No newline at end of file +``` + +## 2、CodeArts Check插件使用 +#### 下载源码&编译 + +```bash +git clone https://gitee.com/HuaweiCloudDeveloper/obs-jenkins-plugins.git +cd obs-jenkins-plugins +mvn package -DskipTests +``` +#### 上传插件 + +>系统管理 --> 插件管理 --> 高级 --> Deploy Plugin --> 选择文件 --> 上传target下的hpi文件 --> 重启Jenkins + +#### Pipeline流水线上传 + +##### 参数说明 + +| 参数名称 | 参数说明 | +| ------------------ | ------------------------------------------------------------ | +| ak | Access Key | +| sk | Secret Key | +| region | Region:所在区域,如cn-north-4 +| project_id | codeCheck中的项目id | +| task_id | codeCheck中的任务id | +| topicUrn | SMN服务中的主题URN,非必填 | + +##### 片段生成器生成 + +示例:CodeCheckPipeline(ak:'',sk'',region:''',project_id:'',task_id:'', topicUrn:'') + + +![上传](image/checkpipeline.jpg) + +## 构建 + +1.修改${USER}/.m2/settings.xml中的maven配置文件 + +在`mirrors`节点中增加 +```xml + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + m.g.o-public + +``` +在`pluginGroups`节点中增加 +```xml +org.jenkins-ci.tools +``` +在`profiles`节点中增加 +```xml + + jenkins + + true + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + +``` + +2.打包 +```bash +mvn clean package -DskipTests +``` + +3.运行 +```bash +mvn clean hpi:run +``` + +## 3、VSS漏洞扫描插件使用 +#### 下载源码&编译 + +```bash +git clone https://gitee.com/HuaweiCloudDeveloper/obs-jenkins-plugins.git +cd obs-jenkins-plugins +mvn package -DskipTests +``` +#### 上传插件 + +>系统管理 --> 插件管理 --> 高级 --> Deploy Plugin --> 选择文件 --> 上传target下的hpi文件 --> 重启Jenkins + +#### Pipeline流水线上传 + +##### 参数说明 + +| 参数名称 | 参数说明 | +| ------------------ | ------------------------------------------------------------ | +| ak | Access Key | +| sk | Secret Key | +| region | Region:所在区域,如cn-north-4 +| task_name | 扫描任务名称,自定义即可 | +| url | vss扫描的url | +| topicUrn | SMN服务中的主题URN,非必填 | +| task_type | 扫描任务类型,非必填 | +| timer | 普通任务的定时启动时间,非必填 | +| trigger_time | 监测任务的定时触发时间,非必填 | +| task_period | 监测任务的定时触发周期,非必填 | +| scan_mode | 扫描模式:fast - 快速扫描 normal - 标准扫描 deep - 深度扫描,非必填 | +| port_scan | 是否进行端口扫描,非必填 | +| weak_pwd_scan | 是否进行弱密码扫描,非必填 | +| cve_check | 是否进行CVE漏洞扫描,非必填 +| picture_check | 是否进行网站内容合规文字检测,非必填 +| malicious_code | 是否进行网站挂马检测,非必填 +| malicious_link | 是否进行链接健康检测(死链、暗链、恶意外链),非必填 + +##### 片段生成器生成 + +示例:VssPipeline(ak:'',sk:'',region:'cn-north-4',task_name:'test',url:'') + + +![上传](image/vsspipeline.jpg) + +## 构建 + +1.修改${USER}/.m2/settings.xml中的maven配置文件 + +在`mirrors`节点中增加 +```xml + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + m.g.o-public + +``` +在`pluginGroups`节点中增加 +```xml +org.jenkins-ci.tools +``` +在`profiles`节点中增加 +```xml + + jenkins + + true + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + +``` + +2.打包 +```bash +mvn clean package -DskipTests +``` + +3.运行 +```bash +mvn clean hpi:run +``` diff --git a/image/checkpipeline.jpg b/image/checkpipeline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2559bfee0ec09d6c514a8f486764fca25e3488d6 Binary files /dev/null and b/image/checkpipeline.jpg differ diff --git a/image/vsspipeline.jpg b/image/vsspipeline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca87913041b03495f3a1325c0a2f405a3cd5b390 Binary files /dev/null and b/image/vsspipeline.jpg differ diff --git a/src/main/java/com/huawei/jenkins/codeCheck/codeCheckPipelineStep.java b/src/main/java/com/huawei/jenkins/codeCheck/codeCheckPipelineStep.java index 7e9ba13470969836a5252b39ee06aa0e7a514918..66e52cdb610f49111015903ebbd91906d6efcd4b 100644 --- a/src/main/java/com/huawei/jenkins/codeCheck/codeCheckPipelineStep.java +++ b/src/main/java/com/huawei/jenkins/codeCheck/codeCheckPipelineStep.java @@ -118,12 +118,12 @@ public class codeCheckPipelineStep extends Step { @Override public String getFunctionName() { - return "runTask"; + return "CodeCheckPipeline"; } @Override public String getDisplayName() { - return "run Code check with Pipeline"; + return "华为云CodeArts check代码检查"; } } diff --git a/src/main/java/com/huawei/jenkins/codeCheck/codeCheckService.java b/src/main/java/com/huawei/jenkins/codeCheck/codeCheckService.java index 5993de0126b74c18053ab23f44a72e4f7bcbb9b1..f88f8cf53ff218befcaefb34d45e5dd8a57f2aa4 100644 --- a/src/main/java/com/huawei/jenkins/codeCheck/codeCheckService.java +++ b/src/main/java/com/huawei/jenkins/codeCheck/codeCheckService.java @@ -12,7 +12,6 @@ import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.smn.v2.SmnClient; import com.huaweicloud.sdk.smn.v2.model.PublishMessageRequest; import com.huaweicloud.sdk.smn.v2.model.PublishMessageRequestBody; -import com.huaweicloud.sdk.smn.v2.model.PublishMessageResponse; import com.huaweicloud.sdk.smn.v2.region.SmnRegion; import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; @@ -23,7 +22,6 @@ import java.io.Serializable; public class codeCheckService implements Serializable { private static final long serialVersionUID = 1; - public static String runTask(TaskListener listener, CustomInput customInput) { inputValidate(customInput); ICredential auth = new BasicCredentials() @@ -43,8 +41,7 @@ public class codeCheckService implements Serializable { try { RunTaskResponse response = client.runTask(request); if (response.getHttpStatusCode() == 200) { - message = "执行检查任务成功"; - listener.getLogger().println(message); + listener.getLogger().println("执行检查任务成功"); Integer status = 0; while (status == 0) { status = showTasks(client, customInput.getTask_id(), listener); @@ -56,14 +53,12 @@ public class codeCheckService implements Serializable { } listener.getLogger().println("检查任务执行完成!!!!"); - CheckRecord(client,customInput,listener); - + message = CheckRecord(client,customInput,listener); } else if (response.getHttpStatusCode() == 400) { listener.getLogger().println("网络繁忙,请稍后再试"); } else { listener.getLogger().println("认证信息过期"); } - } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { @@ -98,27 +93,27 @@ public class codeCheckService implements Serializable { } - public static void CheckRecord(CodeCheckClient client, CustomInput customInput, TaskListener listener){ - CheckRecordRequest request = new CheckRecordRequest(); - request.withProjectId(customInput.getProject_id()); + public static String CheckRecord(CodeCheckClient client, CustomInput customInput, TaskListener listener){ + String message = ""; + ShowTaskDetailRequest request = new ShowTaskDetailRequest(); request.withTaskId(customInput.getTask_id()); - request.withOffset(1); - request.withLimit(1); try { - CheckRecordResponse response = client.checkRecord(request); - CheckRecordDataInfo info = response.getData().get(0); - if(info!=null){ - listener.getLogger().println("致命问题数:" + info.getIssueCounts().getCritical()); - listener.getLogger().println("严重问题数:" + info.getIssueCounts().getSerious()); - listener.getLogger().println("常规问题数:" + info.getIssueCounts().getNormal()); - listener.getLogger().println("提示问题数:" + info.getIssueCounts().getPrompt()); - String url = "https://devcloud."+customInput.getRegion()+".huaweicloud.com/codecheck/project/"+customInput.getProject_id()+"/codecheck/task/"+customInput.getTask_id()+"/detail"; - listener.getLogger().println("关于具体详情,可在:"+url+"\n中查看"); + ShowTaskDetailResponse info = client.showTaskDetail(request); + listener.getLogger().println("致命问题数:" + info.getCriticalCount()); + listener.getLogger().println("严重问题数:" + info.getMajorCount()); + listener.getLogger().println("常规问题数:" + info.getMinorCount()); + listener.getLogger().println("提示问题数:" + info.getSuggestionCount()); + if(info.getIsAccess().equals("0")){ + message = "门禁质量不通过"; + }else { + message = "门禁质量通过"; + } + String url = "https://devcloud."+customInput.getRegion()+".huaweicloud.com/codecheck/project/"+customInput.getProject_id()+"/codecheck/task/"+customInput.getTask_id()+"/detail"; + listener.getLogger().println("关于具体详情,可在:"+url+"\n中查看"); + //发送钉钉微信通知 + if(StringUtils.isNotBlank(customInput.getTopicUrn())){ //发送钉钉微信通知 - if(StringUtils.isNotBlank(customInput.getTopicUrn())){ - //发送钉钉微信通知 - publishMessage(customInput,info, listener); - } + publishMessage(customInput,info, listener); } } catch (ConnectionException e) { e.printStackTrace(); @@ -128,10 +123,11 @@ public class codeCheckService implements Serializable { e.printStackTrace(); listener.getLogger().println("错误信息:" + e.getErrorMsg()); } + return message; } - public static void publishMessage(CustomInput customInput,CheckRecordDataInfo info,TaskListener listener) { + public static void publishMessage(CustomInput customInput,ShowTaskDetailResponse info,TaskListener listener) { ICredential auth = new BasicCredentials() .withAk(customInput.getAk()) .withSk(customInput.getSk()); @@ -145,15 +141,20 @@ public class codeCheckService implements Serializable { PublishMessageRequestBody body = new PublishMessageRequestBody(); String url = "https://devcloud."+customInput.getRegion()+".huaweicloud.com/codecheck/project/"+customInput.getProject_id()+"/codecheck/task/"+customInput.getTask_id()+"/detail"; String message = "尊敬的华为云用户,您好:\n本次执行代码检查的结果:"; - message+="\n致命问题数:" + info.getIssueCounts().getCritical(); - message+="\n严重问题数:" + info.getIssueCounts().getSerious(); - message+="\n常规问题数:" + info.getIssueCounts().getNormal(); - message+="\n提示问题数:" + info.getIssueCounts().getPrompt(); + message+="\n致命问题数:" + info.getCriticalCount(); + message+="\n严重问题数:" + info.getMajorCount(); + message+="\n常规问题数:" + info.getMinorCount(); + message+="\n提示问题数:" + info.getSuggestionCount(); + if(info.getIsAccess().equals("0")){ + message+="\n门禁质量不通过"; + }else { + message+="\n门禁质量通过"; + } message+="\n关于具体详情,可在:"+url+"\n中查看" ; body.withMessage(message); request.withBody(body); try { - PublishMessageResponse response = client.publishMessage(request); + client.publishMessage(request); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { diff --git a/src/main/java/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep.java b/src/main/java/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep.java index 2b924736d576175764e84914c51f4d7ae9ae199a..2010ed46cc36ce77da6c6c6e17829237e7b8a06c 100644 --- a/src/main/java/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep.java +++ b/src/main/java/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep.java @@ -281,12 +281,12 @@ public class OBSUploadPipelineStep extends Step { @Override public String getFunctionName() { - return "obsUpload"; + return "OBSPipelineUpload"; } @Override public String getDisplayName() { - return "Upload file to OBS with Pipeline"; + return "华为云OBS上传"; } } @@ -311,8 +311,8 @@ public class OBSUploadPipelineStep extends Step { StringCredentialsImpl credentials = ObsService.getLoginInformation(step.getCredentialsId()); CustomInput customInput = new CustomInput(); if (!validCredentials(credentials, customInput)) { - customInput.setAk(step.getAk()); - customInput.setSk(step.getSk()); + customInput.setAk(step.getAk()); + customInput.setSk(step.getSk()); } customInput.setBucket(step.getBucket()); customInput.setEndpoint(step.getEndpoint()); diff --git a/src/main/java/com/huawei/jenkins/plugins/storage/ObsService.java b/src/main/java/com/huawei/jenkins/plugins/storage/ObsService.java index db639e6ecd8cdfa050d04080ca7206fe901af27d..4668e88ddd841719ea0b7f15692399a6d100a43c 100644 --- a/src/main/java/com/huawei/jenkins/plugins/storage/ObsService.java +++ b/src/main/java/com/huawei/jenkins/plugins/storage/ObsService.java @@ -106,7 +106,11 @@ public class ObsService implements Serializable { listener.getLogger().println("Nothing to upload %n"); return null; } - String parentPath = envVars.expand(customInput.getPath()); + String parentPath = ""; + if(customInput.getPath() != null){ + parentPath = envVars.expand(customInput.getPath()); + } + int prefixLength = dir.getRemote().length() + 1; for (FilePath child : children) { String childRemotePath = child.getRemote(); @@ -114,7 +118,11 @@ public class ObsService implements Serializable { continue; } String fileName = child.getRemote().substring(prefixLength); - fileName = String.join(File.separator, parentPath, fileName).replace(File.separator, "/"); + if(parentPath.equals("")){ + fileName = String.join(File.separator, fileName).replace(File.separator, "/"); + }else { + fileName = String.join(File.separator, parentPath, fileName).replace(File.separator, "/"); + } child.act(new RemoteUploader(listener, fileName, customInput)); listener.getLogger().format("%s Upload complete %n", child.getName()); } @@ -127,8 +135,8 @@ public class ObsService implements Serializable { final String file = customInput.getFile(); final String ak = customInput.getAk(); final String sk = customInput.getSk(); - final String obsPath = customInput.getPath(); - Preconditions.checkArgument(StringUtils.isNotBlank(obsPath), "ObsPath can not be blank"); + //final String obsPath = customInput.getPath(); + //Preconditions.checkArgument(StringUtils.isNotBlank(obsPath), "ObsPath can not be blank"); Preconditions.checkArgument(StringUtils.isNotBlank(file) || StringUtils.isNotBlank(includePathPattern), "At least one argument of Text, File or IncludePathPattern must be included"); Preconditions.checkArgument(StringUtils.isBlank(includePathPattern) || StringUtils.isBlank(file), "File and IncludePathPattern cannot be used together"); Preconditions.checkArgument(StringUtils.isNotBlank(ak) && StringUtils.isNotBlank(sk), "Ak, Sk can not be blank"); @@ -170,6 +178,7 @@ public class ObsService implements Serializable { if (StringUtils.isNotBlank(customInput.getRedirectLocation())) { metas.setWebSiteRedirectLocation(customInput.getRedirectLocation()); } + UploadFileRequest uploadFileRequest = new UploadFileRequest(customInput.getBucket(), customInput.getPath()); uploadFileRequest.setObjectMetadata(metas); @@ -223,7 +232,6 @@ public class ObsService implements Serializable { customInput.setPath(fileName); UploadFileRequest uploadFileRequest = buildUploadFileRequest(customInput, taskListener); String path = uploadFileRequest.getObjectKey(); - uploadFileRequest.setObjectKey(path); taskListener.getLogger().format("Uploading file to obs://%s/%s %n", uploadFileRequest.getBucketName(), path); ObsClient obsClient = new ObsClient(customInput.getAk(), customInput.getSk(), customInput.getEndpoint()); try { diff --git a/src/main/java/com/huawei/jenkins/vss/vssCheckPipelineStep.java b/src/main/java/com/huawei/jenkins/vss/vssCheckPipelineStep.java index 9340ef00826179f6524f27a04b433efe0a943248..7bdd5c3c0fcffec9c24973b533117c3667f14749 100644 --- a/src/main/java/com/huawei/jenkins/vss/vssCheckPipelineStep.java +++ b/src/main/java/com/huawei/jenkins/vss/vssCheckPipelineStep.java @@ -260,12 +260,12 @@ public class vssCheckPipelineStep extends Step { @Override public String getFunctionName() { - return "CreateTasks"; + return "VssPipeline"; } @Override public String getDisplayName() { - return "VSS check with Pipeline"; + return "华为云漏洞扫描"; } } diff --git a/src/main/java/com/huawei/jenkins/vss/vssService.java b/src/main/java/com/huawei/jenkins/vss/vssService.java index ac168856d59a4d6069fa7418928a88a6d2783f63..12c470c061870a97618bb552e1f46646d3e5ae53 100644 --- a/src/main/java/com/huawei/jenkins/vss/vssService.java +++ b/src/main/java/com/huawei/jenkins/vss/vssService.java @@ -111,11 +111,11 @@ public class vssService implements Serializable { listener.getLogger().println("任务状态:" + response.getTaskStatus()); String taskStatus = response.getTaskStatus().toString(); ShowTasksResponse showTasksResponse = null; - while (taskStatus.equals("running") || taskStatus.equals("waiting")) { + while (taskStatus.equals("running") || taskStatus.equals("waiting") || taskStatus.equals("ready")) { showTasksResponse = showTasks(client, response.getTaskId(), listener); taskStatus = showTasksResponse.getTaskStatus().toString(); try { - if(taskStatus.equals("running")){ + if(taskStatus.equals("running") || taskStatus.equals("waiting") || taskStatus.equals("ready")){ Thread.currentThread().sleep(30000); } } catch (InterruptedException e) { @@ -129,7 +129,7 @@ public class vssService implements Serializable { listener.getLogger().println("中危漏洞数:" + showTasksResponse.getStatistics().getMiddle()); listener.getLogger().println("低危漏洞数:" + showTasksResponse.getStatistics().getLow()); listener.getLogger().println("提示危漏洞数:" + showTasksResponse.getStatistics().getHint()); - + if(StringUtils.isNotBlank(customInput.getTopicUrn())){ //发送钉钉微信通知 publishMessage(customInput,showTasksResponse, listener); diff --git a/src/main/resources/com/huawei/jenkins/plugins/storage/OBSClassicUpload/help-path.html b/src/main/resources/com/huawei/jenkins/plugins/storage/OBSClassicUpload/help-path.html index 5f5ddbe5535056bded8d086f956d15b2ec357a99..e4d8b5de6d90ca19e38e5bf83bc8b82cc45865b0 100644 --- a/src/main/resources/com/huawei/jenkins/plugins/storage/OBSClassicUpload/help-path.html +++ b/src/main/resources/com/huawei/jenkins/plugins/storage/OBSClassicUpload/help-path.html @@ -15,5 +15,7 @@ -->
This is the path inside the bucket to use
+ If not, put it in the root directory of the bucket Do not begin with a leading "/". +
diff --git a/src/main/resources/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep/help-path.html b/src/main/resources/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep/help-path.html index f0c079794df65a06bf8fdaecac578dd65c0210f2..e4d8b5de6d90ca19e38e5bf83bc8b82cc45865b0 100644 --- a/src/main/resources/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep/help-path.html +++ b/src/main/resources/com/huawei/jenkins/plugins/storage/OBSUploadPipelineStep/help-path.html @@ -14,6 +14,8 @@ limitations under the License. -->
- This is the path inside the bucket to use. + This is the path inside the bucket to use
+ If not, put it in the root directory of the bucket Do not begin with a leading "/". +