chore: Add django support for build spec job suggestion

This commit is contained in:
Robin Shen 2024-09-02 22:09:07 +08:00
parent a90cb71704
commit 060892904e
5 changed files with 92 additions and 24 deletions

View File

@ -637,7 +637,7 @@
</repositories>
<properties>
<commons.version>3.0.4</commons.version>
<agent.version>2.1.8</agent.version>
<agent.version>2.1.9</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

@ -7,6 +7,13 @@
<artifactId>server-plugin</artifactId>
<version>11.0.9</version>
</parent>
<dependencies>
<dependency>
<groupId>io.onedev</groupId>
<artifactId>server-plugin-report-junit</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<moduleClass>io.onedev.server.plugin.buildspec.python.PythonModule</moduleClass>
</properties>

View File

@ -1,6 +1,7 @@
package io.onedev.server.plugin.buildspec.python;
import com.google.common.collect.Lists;
import io.onedev.k8shelper.ExecuteCondition;
import io.onedev.server.buildspec.job.Job;
import io.onedev.server.buildspec.job.JobSuggestion;
import io.onedev.server.buildspec.job.trigger.BranchUpdateTrigger;
@ -10,14 +11,26 @@ import io.onedev.server.buildspec.step.commandinterpreter.ShellInterpreter;
import io.onedev.server.git.Blob;
import io.onedev.server.git.BlobIdent;
import io.onedev.server.model.Project;
import io.onedev.server.plugin.report.junit.PublishJUnitReportStep;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import org.yaml.snakeyaml.Yaml;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
public class PythonJobSuggestion implements JobSuggestion {
private PublishJUnitReportStep newUnitTestReportPublishStep() {
var publishUnitTestReport = new PublishJUnitReportStep();
publishUnitTestReport.setName("publish unit test report");
publishUnitTestReport.setReportName("Unit Test");
publishUnitTestReport.setFilePatterns("test-result.xml");
publishUnitTestReport.setCondition(ExecuteCondition.ALWAYS);
return publishUnitTestReport;
}
@Override
public Collection<Job> suggestJobs(Project project, ObjectId commitId) {
Collection<Job> jobs = new ArrayList<>();
@ -45,10 +58,8 @@ public class PythonJobSuggestion implements JobSuggestion {
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");
detectBuildVersion.setImage("1dev/yq:1.0.0");
detectBuildVersion.getInterpreter().setCommands("yq '.tool.poetry.version' pyproject.toml > buildVersion");
job.getSteps().add(detectBuildVersion);
SetBuildVersionStep setBuildVersion = new SetBuildVersionStep();
@ -58,18 +69,17 @@ public class PythonJobSuggestion implements JobSuggestion {
CommandStep test = new CommandStep();
test.setName("test");
test.setImage("python");
String commands = "" +
"curl -sSL https://install.python-poetry.org | python\n" +
"/root/.local/bin/poetry install\n";
test.setImage("1dev/poetry:1.0.1");
String commands = "poetry install\n";
if (blob.getText().getContent().contains("pytest"))
commands += "/root/.local/bin/poetry run pytest";
else
commands += "/root/.local/bin/poetry run python -m unittest";
test.getInterpreter().setCommands(commands);
job.getSteps().add(test);
if (blob.getText().getContent().contains("\"pytest\"")) {
test.getInterpreter().setCommands(commands + "poetry run pytest --junitxml=./test-result.xml");
job.getSteps().add(test);
job.getSteps().add(newUnitTestReportPublishStep());
} else {
test.getInterpreter().setCommands(commands + "poetry run python -m unittest");
job.getSteps().add(test);
}
job.getTriggers().add(new BranchUpdateTrigger());
job.getTriggers().add(new PullRequestUpdateTrigger());
@ -106,17 +116,68 @@ public class PythonJobSuggestion implements JobSuggestion {
"source .venv/bin/activate\n" +
"pip install -r requirements.txt\n";
if (blob.getText().getContent().contains("pytest"))
commands += "pytest";
else
commands += "python -m unittest";
interpreter.setCommands(commands);
job.getSteps().add(test);
var blobContent = blob.getText().getContent();
if (blobContent.contains("pytest==")) {
interpreter.setCommands(commands + "pytest --junitxml=./test-result.xml");
job.getSteps().add(test);
job.getSteps().add(newUnitTestReportPublishStep());
} else if (blobContent.contains("Django==")) {
interpreter.setCommands(commands + "python manage.py test");
job.getSteps().add(test);
} else {
interpreter.setCommands(commands + "python -m unittest");
job.getSteps().add(test);
}
job.getTriggers().add(new BranchUpdateTrigger());
job.getTriggers().add(new PullRequestUpdateTrigger());
jobs.add(job);
} else if ((blob = project.getBlob(new BlobIdent(commitId.name(), "environment.yml", 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 environment checksum");
generateChecksum.setFiles("environment.yml");
generateChecksum.setTargetFile("checksum");
job.getSteps().add(generateChecksum);
var setupCache = new SetupCacheStep();
setupCache.setName("set up environment cache");
setupCache.setKey("conda_cache_@file:checksum@");
setupCache.setPaths(Lists.newArrayList("/root/miniconda3/envs"));
setupCache.getLoadKeys().add("conda_cache");
job.getSteps().add(setupCache);
var blobContent = blob.getText().getContent();
Map<String, Object> environments = new Yaml().load(blobContent);
CommandStep test = new CommandStep();
test.setName("test");
test.setImage("1dev/conda:1.0.4");
test.setInterpreter(new ShellInterpreter());
String commands = "" +
"source /root/.bashrc\n" +
"conda env update\n" +
"conda activate " + environments.get("name") + "\n";
if (blobContent.contains("pytest")) {
test.getInterpreter().setCommands(commands + "pytest --junitxml=./test-result.xml");
job.getSteps().add(test);
job.getSteps().add(newUnitTestReportPublishStep());
} else {
test.getInterpreter().setCommands(commands + "python -m unittest");
job.getSteps().add(test);
}
job.getTriggers().add(new BranchUpdateTrigger());
job.getTriggers().add(new PullRequestUpdateTrigger());
jobs.add(job);
}
return jobs;
}

View File

@ -571,7 +571,7 @@ public class ServerDockerExecutor extends JobExecutor implements RegistryLoginAw
}, new ArrayList<>());
cacheHelper.buildFinished();
cacheHelper.buildFinished(successful);
return successful;
} finally {

View File

@ -244,7 +244,7 @@ public class ServerShellExecutor extends JobExecutor implements Testable<TestDat
}, new ArrayList<>());
cacheHelper.buildFinished();
cacheHelper.buildFinished(successful);
return successful;
} finally {