feat: Build spec job suggestion for python projects (OD-2048)

This commit is contained in:
Robin Shen 2024-09-01 09:44:47 +08:00
parent d35cf26d80
commit 151b4ce11f
6 changed files with 114 additions and 2 deletions

View File

@ -636,8 +636,8 @@
</repository>
</repositories>
<properties>
<commons.version>3.0.3</commons.version>
<agent.version>2.1.7</agent.version>
<commons.version>3.0.4</commons.version>
<agent.version>2.1.8</agent.version>
<slf4j.version>2.0.9</slf4j.version>
<logback.version>1.4.14</logback.version>
<antlr.version>4.7.2</antlr.version>

View File

@ -23,6 +23,7 @@
<module>server-plugin-buildspec-dotnet</module>
<module>server-plugin-buildspec-gradle</module>
<module>server-plugin-buildspec-node</module>
<module>server-plugin-buildspec-python</module>
<module>server-plugin-authenticator-ldap</module>
<module>server-plugin-mailservice-smtpimap</module>
<module>server-plugin-mailservice-office365</module>

View File

@ -0,0 +1,13 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>server-plugin-buildspec-python</artifactId>
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>11.0.8</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.buildspec.python.PythonModule</moduleClass>
</properties>
</project>

View File

@ -0,0 +1,73 @@
package io.onedev.server.plugin.buildspec.python;
import com.google.common.collect.Lists;
import io.onedev.server.buildspec.job.Job;
import io.onedev.server.buildspec.job.JobSuggestion;
import io.onedev.server.buildspec.job.trigger.BranchUpdateTrigger;
import io.onedev.server.buildspec.job.trigger.PullRequestUpdateTrigger;
import io.onedev.server.buildspec.step.*;
import io.onedev.server.git.BlobIdent;
import io.onedev.server.model.Project;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import java.util.ArrayList;
import java.util.Collection;
public class PythonJobSuggestion implements JobSuggestion {
@Override
public Collection<Job> suggestJobs(Project project, ObjectId commitId) {
Collection<Job> jobs = new ArrayList<>();
if (project.getBlob(new BlobIdent(commitId.name(), "poetry.lock", FileMode.TYPE_FILE), false) != null) {
Job job = new Job();
job.setName("python ci");
CheckoutStep checkout = new CheckoutStep();
checkout.setName("checkout code");
job.getSteps().add(checkout);
var generateChecksum = new GenerateChecksumStep();
generateChecksum.setName("generate poetry lock checksum");
generateChecksum.setFiles("poetry.lock");
generateChecksum.setTargetFile("checksum");
job.getSteps().add(generateChecksum);
var setupCache = new SetupCacheStep();
setupCache.setName("set up poetry cache");
setupCache.setKey("poetry_cache_@file:checksum@");
setupCache.setPaths(Lists.newArrayList("/root/.cache/pypoetry"));
setupCache.getLoadKeys().add("poetry_cache");
job.getSteps().add(setupCache);
CommandStep detectBuildVersion = new CommandStep();
detectBuildVersion.setName("detect build version");
detectBuildVersion.setImage("alpine");
detectBuildVersion.getInterpreter().setCommands("" +
"apk add yq\n" +
"yq '.tool.poetry.version' pyproject.toml > buildVersion\n");
job.getSteps().add(detectBuildVersion);
SetBuildVersionStep setBuildVersion = new SetBuildVersionStep();
setBuildVersion.setName("set build version");
setBuildVersion.setBuildVersion("@file:buildVersion@");
job.getSteps().add(setBuildVersion);
CommandStep build = new CommandStep();
build.setName("test");
build.setImage("python");
build.getInterpreter().setCommands("" +
"curl -sSL https://install.python-poetry.org | python\n" +
"/root/.local/bin/poetry install\n" +
"/root/.local/bin/poetry run pytest\n");
job.getSteps().add(build);
job.getTriggers().add(new BranchUpdateTrigger());
job.getTriggers().add(new PullRequestUpdateTrigger());
jobs.add(job);
}
return jobs;
}
}

View File

@ -0,0 +1,20 @@
package io.onedev.server.plugin.buildspec.python;
import io.onedev.commons.loader.AbstractPluginModule;
import io.onedev.server.buildspec.job.JobSuggestion;
/**
* NOTE: Do not forget to rename moduleClass property defined in the pom if you've renamed this class.
*
*/
public class PythonModule extends AbstractPluginModule {
@Override
protected void configure() {
super.configure();
// put your guice bindings here
contribute(JobSuggestion.class, PythonJobSuggestion.class);
}
}

View File

@ -60,6 +60,11 @@
<artifactId>server-plugin-buildspec-dotnet</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.onedev</groupId>
<artifactId>server-plugin-buildspec-python</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.onedev</groupId>
<artifactId>server-plugin-buildspec-node</artifactId>