SDM 0.3.0 and above support plugins: they are just regular Groovy classes located in any of the subdirectories within extra/plugins or $HOME/.sdm/plugins (eg.: $HOME/.sdm/plugins/myProjectPlugins that can be instantiated from the installation scripts. Here's a sample code provided with SDM:
package net.orpiske.sdm.test;
class Hello {
public void sayHello() {
println "Hello world!"
}
}To use this code in a package script, simply instantiate the class and run the methods you need:
void install() {
def hello = new Hello();
hello.sayHello();
// ... other code
}Thanks to Groovy awesomeness, the plugin feature is very flexible. Among other things, you can use it to create a super class/package that contains the basic installation routines for your packages.
Here's a sample plugin that adds the ability to fetch code from a Subversion or Git repository:
package net.orpiske.sdm.plugins.scm
import net.orpiske.ssps.common.scm.DefaultCredentials
import net.orpiske.ssps.common.scm.Scm
import net.orpiske.ssps.common.scm.ScmCredentials
import net.orpiske.ssps.common.scm.git.GitSCM
import net.orpiske.ssps.common.scm.svn.SvnSCM
class SourceRepository {
private String username = null;
private String password = null;
public SourceRepository(final String username, final String password) {
this.username = username;
this.password = password;
}
/**
* Creates a new repository provider based on the repository information
* @param repositoryInfo repository information
* @return A repository provider object
*/
public Scm newScm(final String url) {
if (url.endsWith(".git") || url.startsWith("git://")) {
return new GitSCM();
}
if (url.startsWith("svn://")) {
return new SvnSCM();
}
/* Defaults to SvnProvider because, well, most git repositories end with ".git" */
return new SvnSCM();
}
private void setCredentials(final Scm scm) {
ScmCredentials credentials = new DefaultCredentials(username, password);
scm.setCredentials(credentials)
}
public void checkout(String url, String path) {
File filePath = new File(path);
checkout(url, filePath)
}
public void checkout(String url, File path) {
Scm scm = newScm(url);
if (username != null) {
setCredentials(scm)
}
scm.checkout(url, path)
}
}Here's a sample package that uses the SourceRepository plugin to fetch the code and build it:
import net.orpiske.sdm.packages.SourcePackage
import net.orpiske.sdm.plugins.scm.SourceRepository
import net.orpiske.sdm.plugins.builders.ProjectBuilder;
import net.orpiske.sdm.plugins.builders.MavenBuilder;
import org.apache.commons.io.FileUtils;
import static net.orpiske.sdm.lib.OsUtils.*
import static net.orpiske.sdm.lib.Executable.*
import static net.orpiske.sdm.lib.Unpack.unpack;
class sdm extends SourcePackage {
def version = "0.3.0-SNAPSHOT"
def name = "sdm"
def url = "https://github.com/orpiske/sdm.git"
/**
* Declare a dependency on ssps-common and sdm-common, both of which
* are also source packages
*/
def dependencies = [ "net.orpiske/ssps-common":"(0.3.0-SNAPSHOT, 0.3.99)",
"net.orpiske/sdm-common":"(0.3.0-SNAPSHOT, 0.3.99)"]
def File buildDir = new File("${workDir}/${name}-${version}-build")
/**
* Download the package from the remote location
* @param url the URL to the code or repository
*/
void fetch(final String url) {
println "Checking out the code to " + buildDir.getPath();
if (buildDir.exists()) {
println "Cleaning up previously created directory"
FileUtils.deleteDirectory(buildDir)
}
/**
* Instantiate the SourceRepository plugin so that we are able to
* download the code. Username and password are not required,
* therefore we can use null for both input parameters
*/
SourceRepository repository = new SourceRepository(null, null)
/**
* Checkout the code from the given URL into the build directory
*/
repository.checkout(url, buildDir.getPath())
}
/**
* Builds the package from source
*/
@Override
void build() {
/**
* Instantiate the Maven ProjectBuilder plugin to build the project
*/
ProjectBuilder builder = new MavenBuilder(buildDir)
builder.setProfile("Delivery")
/**
* Sets the local maven repository to the one inside the work dir
* to make sure it uses the dependencies compiled previously
*/
builder.setDefine("maven.repo.local", workDir + File.separator +
"m2repo")
if (builder.createPackage() == 0) {
println "Project ${name} compiled successfully"
}
}
/**
* Installs the package
*/
void install() {
unpack(buildDir.getPath() + File.separator + "target" + File.separator +
"${name}-${version}-bin.tar.gz", installDir)
if (isNix()) {
println "Creating symlinks"
exec("/bin/ln", "-sf ${installDir}/${name}-${version} ${installDir}/${name}")
}
}
/**
* Uninstalls the package
*/
void uninstall() {
if (isNix()) {
println "Removing symlinks"
exec("/bin/unlink", "${installDir}/${name}")
}
}
}