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:'')
+
+
+
+
+## 构建
+
+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:'')
+
+
+
+
+## 构建
+
+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 "/".
+