Kibana is an open source project. Modifying and developing over it is therfore a natural thing to do. Organizations might want to do it to fit their various specific needs. Although, a developer could dive right in the src/ directory and fiddle with the code immediately, a more proper way of customizing Kibana is through a plugin. In this short article, I will get you up to speed on why and how to deploy your kibana instance, with a Pre-Installed plugins.
Deployment
While developing a Kibana plugin, your code will be located in Kibana’s plugin/ directory. But when it comes to deployment, plugins in plugin/ directory will be ignored. To finally deploy your plugin, there are two ways.
/bin/kibana-plugin install (Official Way)
The recommended way was to run the following in your build script:
bin/kibana-plugin install file:///some/local/path/my-plugin.zip -d path/to/directory
Modify build tasks (My Way)
I like better when a software is more self-contained, keeping build scripts as small as possible.
In tasks/build/index.js, you will find the list of tasks that are executed during a build process.
tasks/build/index.js
import { flatten } from 'lodash';
module.exports = function (grunt) {
grunt.registerTask('build', 'Build packages', function () {
grunt.task.run(flatten([
'clean:build',
'clean:target',
'_build:downloadNodeBuilds',
'_build:extractNodeBuilds',
'copy:devSource',
'clean:devSourceForTestbed',
'babel:build',
'_build:plugins',
'_build:data',
'_build:verifyTranslations',
'_build:packageJson',
'_build:readme',
'_build:babelCache',
'_build:installNpmDeps',
'_build:notice',
'_build:removePkgJsonDeps',
'clean:testsFromModules',
'run:optimizeBuild',
'stop:optimizeBuild',
'_build:versionedLinks',
'_build:osShellScripts',
grunt.option('skip-archives') ? [] : ['_build:archives'],
grunt.option('skip-os-packages') ? [] : [
'_build:pleaseRun',
'_build:osPackages',
],
'_build:shasums'
]));
});
};
Before we can add our own build task, we must first create it. In the same directory (tasks/build/), create your custom build javascript file. Say foo.js:
tasks/build/foo.js
export default (grunt) => {
grunt.registerTask('_build:forSonar', 'Install organization specific plugins', function () {
// This makes the foo plugin installed by default.
grunt.file.copy('plugins/foo', 'build/kibana/plugins/foo'); // change foo to the name of your plugin.
});
}
To add our custom build task to tasks/build/index.js, add _build:foo right after _build:plugins, like this:
New tasks/build/index.js
import { flatten } from 'lodash';
module.exports = function (grunt) {
grunt.registerTask('build', 'Build packages', function () {
grunt.task.run(flatten([
'clean:build',
'clean:target',
'_build:downloadNodeBuilds',
'_build:extractNodeBuilds',
'copy:devSource',
'clean:devSourceForTestbed',
'babel:build',
'_build:plugins',
'_build:foo', // Custom build task.
'_build:data',
'_build:verifyTranslations',
'_build:packageJson',
'_build:readme',
'_build:babelCache',
'_build:installNpmDeps',
'_build:notice',
'_build:removePkgJsonDeps',
'clean:testsFromModules',
'run:optimizeBuild',
'stop:optimizeBuild',
'_build:versionedLinks',
'_build:osShellScripts',
grunt.option('skip-archives') ? [] : ['_build:archives'],
grunt.option('skip-os-packages') ? [] : [
'_build:pleaseRun',
'_build:osPackages',
],
'_build:shasums'
]));
});
};
_build:plugins just creates a plugin directory in the build directory. Something we needed before running our build task.
That’s it. Hope you found this useful.


