diff --git a/build.gradle b/build.gradle index 808da0117..096237a1d 100644 --- a/build.gradle +++ b/build.gradle @@ -77,7 +77,7 @@ project(':job-dsl-core') { mainClassName = 'javaposse.jobdsl.Run' ext { - apiDocData = "${project.buildDir}/dsl-${version}.json" + apiDocData = "${project.buildDir}/dsl.json" } dependencies { @@ -127,6 +127,12 @@ project(':job-dsl-core') { outputs.file apiDocData } + jar { + from(tasks.generateApiDoc) { + into 'javaposse/jobdsl/dsl' + } + } + run { if (project.hasProperty('args')) { args project.args.split('\\s+') diff --git a/docs/Home.md b/docs/Home.md index 812856997..8652e5112 100644 --- a/docs/Home.md +++ b/docs/Home.md @@ -27,6 +27,8 @@ Browse the Jenkins issue tracker to see any [open issues](https://issues.jenkins * 1.46 (unreleased) * Added support for [[Automatically Generated DSL]] ([#816](https://github.com/jenkinsci/job-dsl-plugin/pull/816)) + * Integrated the API Viewer into the plugin + ([#822](https://github.com/jenkinsci/job-dsl-plugin/pull/822)) * Added support for the [Maven Info Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Maven+Info+Plugin) ([JENKINS-32196](https://issues.jenkins-ci.org/browse/JENKINS-32196)) * Added support for the [Log Parser Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Log+Parser+Plugin) diff --git a/job-dsl-api-viewer/build.gradle b/job-dsl-api-viewer/build.gradle index 71391f70d..f8dcc5bd8 100644 --- a/job-dsl-api-viewer/build.gradle +++ b/job-dsl-api-viewer/build.gradle @@ -29,6 +29,12 @@ task copyData(type: Copy) { into "${project.buildDir}/data" } +task downloadUpdateCenter(type: Download) { + src 'http://updates.jenkins-ci.org/update-center.json' + dest 'build/data/update-center.jsonp' + onlyIfNewer true +} + (38..45).each { minorVersion -> def version = "1.${minorVersion}" task "downloadData-${version}"(type: Download) { @@ -39,6 +45,11 @@ task copyData(type: Copy) { tasks.gulp_build.dependsOn("downloadData-${version}") } +tasks.gulp_build.inputs.file('gulpfile.js') +tasks.gulp_build.inputs.dir('src') +tasks.gulp_build.inputs.dir('node_modules') +tasks.gulp_build.outputs.dir('build/dist') +tasks.gulp_build.dependsOn('downloadUpdateCenter') tasks.gulp_build.dependsOn('npmInstall') tasks.gulp_build.dependsOn('copyData') tasks.publishGhPages.dependsOn('gulp_build') diff --git a/job-dsl-api-viewer/gulpfile.js b/job-dsl-api-viewer/gulpfile.js index 69c1f7adb..fc47539fb 100644 --- a/job-dsl-api-viewer/gulpfile.js +++ b/job-dsl-api-viewer/gulpfile.js @@ -4,14 +4,11 @@ var wrap = require('gulp-wrap'); var declare = require('gulp-declare'); var concat = require('gulp-concat'); var less = require('gulp-less'); -var path = require('path'); var cleanCss = require('gulp-clean-css'); var connect = require('gulp-connect'); var watch = require('gulp-watch'); var del = require('del'); var merge = require('merge-stream'); -var request = require('request'); -var source = require('vinyl-source-stream'); gulp.task('templates', function(){ var templates = gulp.src('./src/templates/*.hbs') @@ -45,16 +42,10 @@ gulp.task('connect', ['watch'], function() { connect.server(); }); -gulp.task('download', function () { - return request('http://updates.jenkins-ci.org/update-center.json') - .pipe(source('update-center.jsonp')) - .pipe(gulp.dest('./build/data/')); -}); - gulp.task('clean', function() { del.sync(['build']); }); -gulp.task('build', ['download', 'templates', 'less']); +gulp.task('build', ['templates', 'less']); -gulp.task('default', ['build']); \ No newline at end of file +gulp.task('default', ['build']); diff --git a/job-dsl-api-viewer/index.html b/job-dsl-api-viewer/index.html index f2418a454..3a08fe21e 100644 --- a/job-dsl-api-viewer/index.html +++ b/job-dsl-api-viewer/index.html @@ -54,7 +54,7 @@ - v1.46-SNAPSHOT + v1.46-SNAPSHOT v1.45 v1.44 v1.43 diff --git a/job-dsl-api-viewer/package.json b/job-dsl-api-viewer/package.json index 830dd1bb7..e742637a2 100644 --- a/job-dsl-api-viewer/package.json +++ b/job-dsl-api-viewer/package.json @@ -14,8 +14,6 @@ "gulp-clean-css": "^2.0.4", "gulp-watch": "^4.1.1", "del": "^1.1.1", - "vinyl-source-stream": "^1.1.0", - "request": "^2.58.0", "merge-stream": "^0.1.7" } } diff --git a/job-dsl-api-viewer/src/css/main.less b/job-dsl-api-viewer/src/css/main.less index f371e7779..0d884d5a8 100644 --- a/job-dsl-api-viewer/src/css/main.less +++ b/job-dsl-api-viewer/src/css/main.less @@ -131,6 +131,7 @@ float: right; margin-top: 8px; margin-right: 10px; + display: none; } .toggle-plugins { margin-top: 8px; diff --git a/job-dsl-api-viewer/src/js/App.js b/job-dsl-api-viewer/src/js/App.js index 53985e545..99ffae951 100644 --- a/job-dsl-api-viewer/src/js/App.js +++ b/job-dsl-api-viewer/src/js/App.js @@ -31,6 +31,9 @@ Marionette.Renderer.render = function(template, data) { this.initLayout(); this.loadSelectedDsl().then(function() { Backbone.history.start({pushState: false}); + if (!this.dsl.isEmbedded()) { + $('.version-select').show() + } }.bind(this)); $('.version-select').change(function() { diff --git a/job-dsl-api-viewer/src/js/Dsl.js b/job-dsl-api-viewer/src/js/Dsl.js index b8432de03..aea4ac7d1 100644 --- a/job-dsl-api-viewer/src/js/Dsl.js +++ b/job-dsl-api-viewer/src/js/Dsl.js @@ -32,6 +32,10 @@ _.extend(App.Dsl.prototype, { }); }, + isEmbedded: function() { + return this.data.embedded; + }, + getContext: function(contextClass) { return this.data.contexts[contextClass]; }, diff --git a/job-dsl-plugin/build.gradle b/job-dsl-plugin/build.gradle index 12c14b5c5..4e1a42ab6 100644 --- a/job-dsl-plugin/build.gradle +++ b/job-dsl-plugin/build.gradle @@ -48,6 +48,16 @@ configurations { compile.exclude group: 'org.kohsuke', module: 'windows-package-checker' } +jpi { + into('api-viewer') { + from(project(':job-dsl-api-viewer').projectDir) { + include 'index.html' + include 'build/dist/**' + } + } + dependsOn tasks.getByPath(':job-dsl-api-viewer:gulp_build') +} + dependencies { compile project(':job-dsl-core') optionalJenkinsPlugins 'org.jenkins-ci.plugins:cloudbees-folder:4.4@jar' diff --git a/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/ExecuteDslScripts.java b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/ExecuteDslScripts.java index 9a09f3033..68ee1753d 100644 --- a/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/ExecuteDslScripts.java +++ b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/ExecuteDslScripts.java @@ -29,6 +29,7 @@ import javaposse.jobdsl.dsl.GeneratedView; import javaposse.jobdsl.dsl.JobManagement; import javaposse.jobdsl.dsl.ScriptRequest; +import javaposse.jobdsl.plugin.actions.ApiViewerAction; import javaposse.jobdsl.plugin.actions.GeneratedConfigFilesAction; import javaposse.jobdsl.plugin.actions.GeneratedConfigFilesBuildAction; import javaposse.jobdsl.plugin.actions.GeneratedJobsAction; @@ -184,7 +185,8 @@ public Collection extends Action> getProjectActions(AbstractProject, ?> proj new GeneratedJobsAction(project), new GeneratedViewsAction(project), new GeneratedConfigFilesAction(project), - new GeneratedUserContentsAction(project) + new GeneratedUserContentsAction(project), + new ApiViewerAction() ); } diff --git a/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/JobDslPlugin.groovy b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/JobDslPlugin.groovy new file mode 100644 index 000000000..08ecee0ab --- /dev/null +++ b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/JobDslPlugin.groovy @@ -0,0 +1,39 @@ +package javaposse.jobdsl.plugin + +import hudson.Plugin +import javaposse.jobdsl.dsl.JobManagement +import jenkins.model.Jenkins +import net.sf.json.JSONObject +import org.kohsuke.stapler.StaplerRequest +import org.kohsuke.stapler.StaplerResponse + +import javax.servlet.ServletException + +import static hudson.model.UpdateCenter.ID_DEFAULT + +class JobDslPlugin extends Plugin { + private JSONObject api + + @Override + void postInitialize() throws Exception { + api = JSONObject.fromObject(JobManagement.getResource('dsl.json').text) + api.element('embedded', true) + } + + @Override + void doDynamic(StaplerRequest request, StaplerResponse response) throws IOException, ServletException { + String path = request.restOfPath + if (path == '/api-viewer') { + response.sendRedirect("${request.requestURI}/index.html") + } else if (path == '/api-viewer/build/data/update-center.jsonp') { + JSONObject data = Jenkins.instance.updateCenter.getById(ID_DEFAULT).JSONObject + response.contentType = 'application/javascript' + response.writer.print("updateCenter.post(${data.toString()})") + } else if (path == '/api-viewer/build/data/dsl.json') { + response.contentType = 'application/json' + response.writer.print(api.toString()) + } else { + super.doDynamic(request, response) + } + } +} diff --git a/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/actions/ApiViewerAction.groovy b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/actions/ApiViewerAction.groovy new file mode 100644 index 000000000..44b585147 --- /dev/null +++ b/job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/actions/ApiViewerAction.groovy @@ -0,0 +1,9 @@ +package javaposse.jobdsl.plugin.actions + +import hudson.model.Action + +class ApiViewerAction implements Action { + final String iconFileName = '/plugin/job-dsl/images/48x48/directory.png' + final String displayName = 'Job DSL API Reference' + final String urlName = '/plugin/job-dsl/api-viewer' +} diff --git a/job-dsl-plugin/src/main/resources/javaposse/jobdsl/plugin/ExecuteDslScripts/config.jelly b/job-dsl-plugin/src/main/resources/javaposse/jobdsl/plugin/ExecuteDslScripts/config.jelly index 38ca28b00..6eec530fe 100644 --- a/job-dsl-plugin/src/main/resources/javaposse/jobdsl/plugin/ExecuteDslScripts/config.jelly +++ b/job-dsl-plugin/src/main/resources/javaposse/jobdsl/plugin/ExecuteDslScripts/config.jelly @@ -1,6 +1,8 @@ - + + See Job DSL API for syntax reference. +
See Job DSL API for syntax reference.