Skip to content

Commit

Permalink
Merge pull request rockcrafters#5 from vpa1977/rename-common-library
Browse files Browse the repository at this point in the history
chore: refactor preparing to implement maven plugin
  • Loading branch information
vpa1977 authored Oct 6, 2024
2 parents 4e7c531 + 007b51c commit 50f5d5a
Show file tree
Hide file tree
Showing 32 changed files with 466 additions and 293 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
java-version: '8'

- name: Setup LXD
uses: canonical/setup-lxd@main
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
java-version: '8'

- name: Setup LXD
uses: canonical/setup-lxd@main
Expand Down
4 changes: 4 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
allprojects {
version = "0.1.1"
group = "io.rockcrafters"
}
3 changes: 0 additions & 3 deletions rockcraft-gradle/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ plugins {
id("com.gradle.plugin-publish") version "1.3.0"
}

group = "io.rockcrafters"
version = "0.1.1"

repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* Copyright 2024 Canonical Ltd.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.canonical.rockcraft.gradle;

import com.canonical.rockcraft.builder.RockcraftOptions;
import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.Input;

import javax.inject.Inject;

/**
* Base class for rockcraft tasks
*/
public class AbstractRockcraftTask extends DefaultTask {

@Input
private final RockcraftOptions options;

/**
* Constructs the CreateRockcraft task
*
* @param options - plugin options
*/
@Inject
public AbstractRockcraftTask(RockcraftOptions options) {
this.options = options;
}

/**
* Gets rockcraft project options
*
* @return rockcraft project options
*/
protected RockcraftOptions getOptions() {
return options;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,37 @@
package com.canonical.rockcraft.gradle;

import com.canonical.rockcraft.builder.RockBuilder;
import com.canonical.rockcraft.builder.RockProjectSettings;
import org.gradle.api.DefaultTask;
import com.canonical.rockcraft.builder.RockcraftOptions;
import org.gradle.api.tasks.TaskAction;

import javax.inject.Inject;
import java.io.IOException;

/**
* This task builds a ROCK image by calling <i>rockcraft pack</i>.
* It removes all previous ROCK artifacts from the build directory.
*/
public class BuildRockcraftTask extends DefaultTask {
public class BuildRockcraftTask extends AbstractRockcraftTask {


/**
* Constructs BuildRockcraft task
* Constructs BuildRockcraftTask
*
* @param options - rockcraft options
*/
public BuildRockcraftTask() {
super();
@Inject
public BuildRockcraftTask(RockcraftOptions options) {
super(options);
}

/**
* The task action
* @throws IOException - IO error while writing <i>rockcraft.yaml</i>
*
* @throws IOException - IO error while writing <i>rockcraft.yaml</i>
* @throws InterruptedException - <i>rockcraft</i> process was aborted
*/
@TaskAction
public void packRock() throws IOException, InterruptedException {
var buildDir = getProject().getLayout().getBuildDirectory().getAsFile().get();
var settings = new RockProjectSettings(getProject().getName(), String.valueOf(getProject().getVersion()), getProject().getProjectDir().toPath());
RockBuilder.buildRock(settings, buildDir);
RockBuilder.buildRock(RockSettingsFactory.createRockProjectSettings(getProject()), getOptions());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
package com.canonical.rockcraft.gradle;

import com.canonical.rockcraft.builder.RockCrafter;
import com.canonical.rockcraft.builder.RockProjectSettings;
import com.canonical.rockcraft.builder.RockcraftOptions;
import org.gradle.api.DefaultTask;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.tasks.TaskAction;


import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
Expand All @@ -28,21 +28,16 @@
/**
* This task writes <i>rockcraft.yaml</i> file for the application.
*/
public abstract class CreateRockcraftTask extends DefaultTask {

private final RockcraftOptions options;
public abstract class CreateRockcraftTask extends AbstractRockcraftTask {

/**
* Constructs the CreateRockcraft task
* @param options - plugin options
* Constructs CreateRockcraftTask
*
* @param options - rockcraft options
*/
@Inject
public CreateRockcraftTask(RockcraftOptions options) {
this.options = options;
}

private RockcraftOptions getOptions() {
return options;
super(options);
}

/**
Expand All @@ -51,14 +46,16 @@ private RockcraftOptions getOptions() {
@TaskAction
public void writeRockcraft() {
HashSet<File> artifacts = new HashSet<File>();
for (var conf : getProject().getConfigurations()) {
artifacts.addAll(conf.getArtifacts().getFiles().getFiles().stream().filter(x -> x.getName().endsWith("jar")).toList());
for (Configuration conf : getProject().getConfigurations()) {
for (File f : conf.getArtifacts().getFiles().getFiles()){
if (f.getName().endsWith("jar"))
artifacts.add(f);
}
}

try {
var buildDir = getProject().getLayout().getBuildDirectory();
var settings = new RockProjectSettings(getProject().getName(), String.valueOf(getProject().getVersion()), getProject().getProjectDir().toPath());
RockCrafter crafter = new RockCrafter(settings, getOptions(), buildDir.getAsFile().get(), new ArrayList<File>(artifacts));
RockCrafter crafter = new RockCrafter(RockSettingsFactory.createRockProjectSettings(getProject()),
getOptions(), new ArrayList<File>(artifacts));
crafter.writeRockcraft();
} catch (IOException e) {
throw new UnsupportedOperationException("Failed to write rockcraft.yaml: " + e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.canonical.rockcraft.gradle;

import com.canonical.rockcraft.builder.RockProjectSettings;
import org.gradle.api.Project;

/**
* Creates RockProjectSettings from Gradle project
*/
public class RockSettingsFactory {

/**
* Constructs RockSettingsFactory
*/
RockSettingsFactory() {}

/**
* Creates RockProjectSettings from Gradle project
*
* @param project - gradle project
* @return RockProjectSettings
*/
public static final RockProjectSettings createRockProjectSettings(Project project) {
return new RockProjectSettings("gradle", project.getName(),
String.valueOf(project.getVersion()), project.getProjectDir().toPath(),
project.getLayout().getBuildDirectory().getAsFile().get().toPath());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,13 @@
import com.google.gradle.osdetector.OsDetectorPlugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.tasks.TaskProvider;

import java.io.IOException;

import java.util.Set;

/**
* Gradle plugin for Rockcraft.
* Allows to build rock images for Gradle projects.
Expand All @@ -44,14 +48,14 @@ public void apply(Project project) {

project.getPlugins().apply(OsDetectorPlugin.class);

var options = project.getExtensions().create("rockcraft", RockcraftOptions.class);
RockcraftOptions options = project.getExtensions().create("rockcraft", RockcraftOptions.class);

var detector = project.getExtensions().getByType(OsDetector.class);
OsDetector detector = project.getExtensions().getByType(OsDetector.class);

if (!"linux".equals(detector.getOs()))
throw new UnsupportedOperationException("Rockcraft is only supported on linux systems");

var checkTask = project.getTasks().register("checkRockcraft", s -> {
TaskProvider<Task> checkTask = project.getTasks().register("checkRockcraft", s -> {
s.doFirst(x -> {
try {
RockBuilder.checkRockcraft();
Expand All @@ -61,21 +65,21 @@ public void apply(Project project) {
});
});

var buildTasks = project.getTasksByName("build", false);
Set<Task> buildTasks = project.getTasksByName("build", false);
if (buildTasks.isEmpty())
throw new UnsupportedOperationException("Rockcraft plugin requires build task");

for (var t : buildTasks)
for (Task t : buildTasks)
t.finalizedBy(checkTask);

var tasks = project.getTasksByName("bootJar", false);
Set<Task> tasks = project.getTasksByName("bootJar", false);
if (tasks.isEmpty())
tasks = project.getTasksByName("jar", false);
if (tasks.isEmpty())
throw new UnsupportedOperationException("Rockcraft plugin requires bootJar or jar task");

project.getTasks().register("build-rock", BuildRockcraftTask.class);
var create = project.getTasks().register("create-rock", CreateRockcraftTask.class, options);
project.getTasks().register("build-rock", BuildRockcraftTask.class, options);
TaskProvider<CreateRockcraftTask> create = project.getTasks().register("create-rock", CreateRockcraftTask.class, options);

project.getTasks().getByName("build-rock")
.dependsOn(create);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,12 @@

import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.io.TempDir;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Path;
import java.io.*;
import java.nio.file.Paths;

import static org.junit.jupiter.api.Assertions.assertTrue;

Expand All @@ -32,7 +30,7 @@ public abstract class BaseRockcraftTest {
protected File projectDir;

protected File getJavaSource() {
return Path.of(projectDir.getAbsolutePath(), "src", "main", "java", "Test.java").toFile();
return Paths.get(projectDir.getAbsolutePath(), "src", "main", "java", "Test.java").toFile();
}

protected File getProjectDir() {
Expand All @@ -53,25 +51,30 @@ protected void writeString(File file, String string) throws IOException {
}
}

protected String getResource(String file) throws IOException {
try (BufferedReader r = new BufferedReader( new InputStreamReader(getClass().getResourceAsStream(file)))) {
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = r.readLine()) != null) {
builder.append(line);
builder.append("\n");
}
return builder.toString();
}
}

TaskOutcome getLastTaskOutcome(BuildResult r){
if (r.getTasks().isEmpty())
return null;
return r.getTasks().get(r.getTasks().size() -1).getOutcome();
}

@BeforeEach
protected void setUp() throws IOException {
assertTrue(Path.of(projectDir.getAbsolutePath(), "src", "main", "java").toFile().mkdirs());
writeString(getJavaSource(),
"""
public class Test {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
""");
assertTrue(Paths.get(projectDir.getAbsolutePath(), "src", "main", "java").toFile().mkdirs());
writeString(getJavaSource(), getResource("default-test.in"));
writeString(getSettingsFile(), "");
writeString(getBuildFile(),
"""
plugins {
id('application')
id('io.rockcrafters.rockcraft')
}
""");
writeString(getBuildFile(), getResource("default-build.in"));
}

public BuildResult runBuild(String... target) {
Expand Down
Loading

0 comments on commit 50f5d5a

Please sign in to comment.