Skip to content

Commit 4b64c53

Browse files
committedJul 23, 2014
JENKINS-23908 - Provide way to execute external liquibase
creation of liquibase installation class and available job config
1 parent d95b122 commit 4b64c53

File tree

4 files changed

+119
-8
lines changed

4 files changed

+119
-8
lines changed
 

‎src/main/java/org/jenkinsci/plugins/liquibase/builder/LiquibaseBuilder.java

+33-6
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import hudson.model.AbstractProject;
77
import hudson.model.BuildListener;
88
import hudson.model.Descriptor;
9+
import hudson.model.Result;
910
import hudson.tasks.BuildStepDescriptor;
1011
import hudson.tasks.Builder;
12+
import hudson.tools.ToolInstallation;
1113
import hudson.util.ArgumentListBuilder;
1214
import liquibase.Contexts;
1315
import liquibase.Liquibase;
@@ -24,6 +26,7 @@
2426
import java.util.Properties;
2527

2628
import org.jenkinsci.plugins.liquibase.common.PropertiesParser;
29+
import org.jenkinsci.plugins.liquibase.installation.LiquibaseInstallation;
2730
import org.kohsuke.stapler.DataBoundConstructor;
2831
import org.slf4j.Logger;
2932
import org.slf4j.LoggerFactory;
@@ -79,6 +82,11 @@ public class LiquibaseBuilder extends Builder {
7982

8083
private String liquibasePropertiesPath;
8184

85+
private boolean invokeExternal;
86+
87+
private String installationName;
88+
89+
8290
@DataBoundConstructor
8391
public LiquibaseBuilder(String changeLogFile,
8492
String username,
@@ -88,7 +96,9 @@ public LiquibaseBuilder(String changeLogFile,
8896
String contexts,
8997
String databaseEngine,
9098
boolean testRollbacks,
91-
String liquibasePropertiesPath) {
99+
String liquibasePropertiesPath,
100+
boolean invokeExternal,
101+
String installationName) {
92102
this.password = password;
93103
this.defaultSchemaName = defaultSchemaName;
94104
this.url = url;
@@ -101,7 +111,8 @@ public LiquibaseBuilder(String changeLogFile,
101111
this.testRollbacks = testRollbacks;
102112
this.liquibasePropertiesPath = liquibasePropertiesPath;
103113

104-
114+
this.invokeExternal = invokeExternal;
115+
this.installationName = installationName;
105116
}
106117

107118
@Override
@@ -126,13 +137,13 @@ public boolean perform(final AbstractBuild<?, ?> build, Launcher launcher, Build
126137
action.addFailed(changeSetOptional.get());
127138
}
128139
migrationException.printStackTrace(listener.getLogger());
129-
throw new RuntimeException("Error executing liquibase liquibase database", migrationException);
140+
build.setResult(Result.UNSTABLE);
130141
} catch (DatabaseException e) {
131142
e.printStackTrace(listener.getLogger());
132-
throw new RuntimeException("Error creating liquibase database", e);
143+
build.setResult(Result.FAILURE);
133144
} catch (LiquibaseException e) {
134145
e.printStackTrace(listener.getLogger());
135-
throw new RuntimeException("Error executing liquibase liquibase database", e);
146+
build.setResult(Result.FAILURE);
136147
} finally {
137148
if (liquibase.getDatabase() != null) {
138149
try {
@@ -150,7 +161,6 @@ private Liquibase createLiquibase(AbstractBuild<?, ?> build,
150161
ExecutedChangesetAction action,
151162
Properties configProperties) {
152163

153-
154164
Liquibase liquibase;
155165
try {
156166
Database databaseObject = CommandLineUtils.createDatabaseObject(getClass().getClassLoader(),
@@ -227,6 +237,10 @@ public String getUsername() {
227237
return username;
228238
}
229239

240+
public boolean isInvokeExternal() {
241+
return invokeExternal;
242+
}
243+
230244
public String getPassword() {
231245
return password;
232246
}
@@ -282,6 +296,7 @@ public void setDriverName(String driverName) {
282296
public static class DescriptorImpl extends BuildStepDescriptor<Builder> {
283297

284298
private List<EmbeddedDriver> embeddedDrivers;
299+
private LiquibaseInstallation[] installations;
285300

286301
@Override
287302
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
@@ -299,13 +314,25 @@ public List<EmbeddedDriver> getEmbeddedDrivers() {
299314
}
300315
return embeddedDrivers;
301316
}
317+
public LiquibaseInstallation.DescriptorImpl getToolDescriptor() {
318+
return ToolInstallation.all().get(LiquibaseInstallation.DescriptorImpl.class);
319+
}
302320

303321
private void initDriverList() {
304322
embeddedDrivers = Lists.newArrayList(new EmbeddedDriver("MySQL", "com.mysql.jdbc.Driver"),
305323
new EmbeddedDriver("PostgreSQL", "org.postgresql.Driver"),
306324
new EmbeddedDriver("Hypersonic", "org.hsqldb.jdbcDriver"),
307325
new EmbeddedDriver("H2", "org.h2.Driver"));
308326
}
327+
328+
public LiquibaseInstallation[] getInstallations() {
329+
return installations;
330+
}
331+
332+
public void setInstallations(LiquibaseInstallation[] installations) {
333+
this.installations = installations;
334+
save();
335+
}
309336
}
310337

311338
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.jenkinsci.plugins.liquibase.installation;
2+
3+
import hudson.EnvVars;
4+
import hudson.Extension;
5+
import hudson.model.EnvironmentSpecific;
6+
import hudson.model.Node;
7+
import hudson.model.TaskListener;
8+
import hudson.slaves.NodeSpecific;
9+
import hudson.tools.ToolDescriptor;
10+
import hudson.tools.ToolInstallation;
11+
import hudson.tools.ToolProperty;
12+
import jenkins.model.Jenkins;
13+
14+
import java.io.IOException;
15+
import java.util.List;
16+
17+
import org.jenkinsci.plugins.liquibase.builder.LiquibaseBuilder;
18+
import org.kohsuke.stapler.DataBoundConstructor;
19+
20+
/**
21+
* Describes details of liquibase installation.
22+
*/
23+
public class LiquibaseInstallation extends ToolInstallation
24+
implements NodeSpecific<LiquibaseInstallation>, EnvironmentSpecific<LiquibaseInstallation> {
25+
26+
@DataBoundConstructor
27+
public LiquibaseInstallation(String name, String home, List<? extends ToolProperty<?>> properties) {
28+
super(name, home, properties);
29+
}
30+
31+
public LiquibaseInstallation forEnvironment(EnvVars environment) {
32+
return new LiquibaseInstallation(getName(), getHome(), getProperties().toList());
33+
}
34+
35+
public LiquibaseInstallation forNode(Node node, TaskListener log) throws IOException, InterruptedException {
36+
return new LiquibaseInstallation(getName(), getHome(), getProperties().toList());
37+
}
38+
39+
40+
@Extension
41+
public static class DescriptorImpl extends ToolDescriptor<LiquibaseInstallation> {
42+
@Override
43+
public String getDisplayName() {
44+
return "Liquibase";
45+
}
46+
47+
@Override
48+
public LiquibaseInstallation[] getInstallations() {
49+
return Jenkins.getInstance().getDescriptorByType(LiquibaseBuilder.DESCRIPTOR.getClass()).getInstallations();
50+
}
51+
52+
@Override
53+
public void setInstallations(LiquibaseInstallation... installations) {
54+
Jenkins.getInstance().getDescriptorByType(LiquibaseBuilder.DESCRIPTOR.getClass())
55+
.setInstallations(installations);
56+
}
57+
}
58+
}

‎src/main/resources/org/jenkinsci/plugins/liquibase/builder/LiquibaseBuilder/config.jelly

+19-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22
xmlns:f="/lib/form">
33

44

5+
<f:radioBlock inline="true" name="invokeExternal" checked="${instance.invokeExternal}" value="false"
6+
title="${%Use Existing Liquibase Installation}">
7+
<f:entry title="${%Liquibase Version}" field="installationName">
8+
<select class="setting-input" name="installationName">
9+
<option>(Default)</option>
10+
<j:forEach var="inst" items="${descriptor.installations}">
11+
<f:option selected="${inst.name==instance.installationName}">${inst.name}</f:option>
12+
</j:forEach>
13+
</select>
14+
</f:entry>
15+
</f:radioBlock>
16+
<f:radioBlock inline="true" name="invokeExternal" checked="${!instance.invokeExternal}" value="true"
17+
title="${%Use Embedded Liquibase}">
18+
</f:radioBlock>
19+
520
<f:entry title="Change Log File" field="changeLogFile"
621
description="Root changeset file.">
722
<f:textbox value="${instance.changeLogFile}"/>
@@ -37,11 +52,13 @@
3752
<f:entry title="Contexts" field="contexts" description="Comma separated list of liquibase contexts to execute.">
3853
<f:textbox value="${instance.contexts}"/>
3954
</f:entry>
40-
<f:entry title="Defaults file" field="liquibasePropertiesPath" description="Properties file defining liquibase configuration. You can use this instead of defining above configuration.">
55+
<f:entry title="Defaults file" field="liquibasePropertiesPath"
56+
description="Properties file defining liquibase configuration. You can use this instead of defining above configuration.">
4157
<f:textbox value="${instance.liquibasePropertiesPath}"/>
4258
</f:entry>
4359

44-
<f:entry title="Test Rollbacks" field="testRollbacks" description="Executes any included rollback statements in addition to the changeset.">
60+
<f:entry title="Test Rollbacks" field="testRollbacks"
61+
description="Executes any included rollback statements in addition to the changeset.">
4562
<f:checkbox checked="${instance.testRollbacks}"/>
4663
</f:entry>
4764

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<j:jelly xmlns:j="jelly:core"
2+
xmlns:f="/lib/form">
3+
<f:entry title="${%name}" field="name">
4+
<f:textbox/>
5+
</f:entry>
6+
<f:entry title="LIQUIBASE_HOME" field="home">
7+
<f:textbox/>
8+
</f:entry>
9+
</j:jelly>

0 commit comments

Comments
 (0)
Please sign in to comment.