我想知道是否可以从 Jenkins 脚本控制台模拟管道插件操作。例如,Slack 插件用于通过管道作业使用以下命令发送通知:



我想尝试一下,看看对象和属性。我很确定使用 Jenkins 脚本控制台中的 groovy 是可能的。

最佳答案

我发现它通常需要查看源代码。在本例中,源代码位于 GitHub 上的 jenkinsci/slack-plugin

以下是我要做的步骤:

  • 查找 "slackSend" 用来描述步骤的地方 - in SlackSendStep .DescriptorImpl
  • 所描述的类型具有暴露给绑定(bind)的 @DataboundSetter@DataboundConstructor(例如 setColor(String color)
  • Descriptor constructor 返回 SlackSendStep.SlackSendStepExecution 的类类型
  • 具有 SlackSendStep.SlackSendStepExecution 类型的 some properties that are injected
  • 步骤执行在 the run() method
  • 中完成

    我在查看代码时注意到的主要部分是 StandardSlackService 是使用提供给步骤的参数创建的,并且可能来自全局 Jenkins 配置。

    如果您想从脚本控制台执行此代码,则可以对其进行一些调整和调整,因为很难以与管道路径相同的方式执行它。

    下面是我考虑的相关代码供引用:

    SlackService slackService = getSlackService(baseUrl, team, token, tokenCredentialId, botUser, channel);
    boolean publishSuccess;
    if(step.attachments != null){
        JsonSlurper jsonSlurper = new JsonSlurper();
        JSON json = null;
        try {
            json = jsonSlurper.parseText(step.attachments);
        } catch (JSONException e) {
            listener.error(Messages.NotificationFailedWithException(e));
            return null;
        }
        if(!(json instanceof JSONArray)){
            listener.error(Messages.NotificationFailedWithException(new IllegalArgumentException("Attachments must be JSONArray")));
            return null;
        }
        JSONArray jsonArray = (JSONArray) json;
        for (int i = 0; i < jsonArray.size(); i++) {
            Object object = jsonArray.get(i);
            if(object instanceof JSONObject){
                JSONObject jsonNode = ((JSONObject) object);
                if (!jsonNode.has("fallback")) {
                    jsonNode.put("fallback", step.message);
                }
            }
        }
        publishSuccess = slackService.publish(jsonArray, color);
    }else{
        publishSuccess = slackService.publish(step.message, color);
    }
    if (!publishSuccess && step.failOnError) {
        throw new AbortException(Messages.NotificationFailed());
    } else if (!publishSuccess) {
        listener.error(Messages.NotificationFailed());
    }
    // rest of method...
    
    // ...
    
    //streamline unit testing
    SlackService getSlackService(String baseUrl, String team, String token, String tokenCredentialId, boolean botUser, String channel) {
        return new StandardSlackService(baseUrl, team, token, tokenCredentialId, botUser, channel);
    }
    

    关于jenkins - 从 Jenkins 脚本控制台访问 Slack 插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47970976/

    10-16 15:54