Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrated code lifecycle: Limit build logs size #9861

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

Expand All @@ -17,6 +18,12 @@
@Component
public class BuildLogsMap {

@Value("${artemis.continuous-integration.build-logs.max-lines-per-job:10000}")
private int maxLogLinesPerBuildJob;

@Value("${artemis.continuous-integration.build-logs.max-chars-per-line:1024}")
private int maxCharsPerLine;

BBesrour marked this conversation as resolved.
Show resolved Hide resolved
private final ConcurrentMap<String, List<BuildLogEntry>> buildLogsMap = new ConcurrentHashMap<>();

public List<BuildLogEntry> getBuildLogs(String buildLogId) {
Expand All @@ -34,4 +41,37 @@ public void appendBuildLogEntry(String buildLogId, BuildLogEntry buildLog) {
public void removeBuildLogs(String buildLogId) {
buildLogsMap.remove(buildLogId);
}

/**
* Retrieves and truncates the build logs for the specified build log ID.
*
* @param buildLogId the ID of the build log to retrieve and truncate
* @return a list of truncated build log entries, or null if no logs are found for the specified ID
*/
public List<BuildLogEntry> getAndTruncateBuildLogs(String buildLogId) {
List<BuildLogEntry> buildLogs = buildLogsMap.get(buildLogId);

if (buildLogs == null) {
return null;
}
BBesrour marked this conversation as resolved.
Show resolved Hide resolved

// Truncate the build logs to maxLogLinesPerBuildJob
if (buildLogs.size() > maxLogLinesPerBuildJob) {
List<BuildLogEntry> truncatedBuildLogs = new ArrayList<>(buildLogs.subList(0, maxLogLinesPerBuildJob));
truncatedBuildLogs.add(new BuildLogEntry(ZonedDateTime.now(), "Truncated build logs...\n"));
buildLogs = truncatedBuildLogs;
}

// Truncate each line to maxCharsPerLine
for (int i = 0; i < buildLogs.size(); i++) {
BuildLogEntry buildLog = buildLogs.get(i);
String log = buildLog.getLog();
if (log.length() > maxCharsPerLine) {
String truncatedLog = log.substring(0, maxCharsPerLine) + "\n";
buildLogs.set(i, new BuildLogEntry(buildLog.getTime(), truncatedLog));
}
}

return buildLogs;
}
BBesrour marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ private void processBuild(BuildJobQueueItem buildJob) {
buildJob.exerciseId(), buildJob.retryCount(), buildJob.priority(), BuildStatus.SUCCESSFUL, buildJob.repositoryInfo(), jobTimingInfo, buildJob.buildConfig(),
null);

List<BuildLogEntry> buildLogs = buildLogsMap.getBuildLogs(buildJob.id());
List<BuildLogEntry> buildLogs = buildLogsMap.getAndTruncateBuildLogs(buildJob.id());
buildLogsMap.removeBuildLogs(buildJob.id());

ResultQueueItem resultQueueItem = new ResultQueueItem(buildResult, finishedJob, buildLogs, null);
Expand Down Expand Up @@ -435,7 +435,7 @@ private void processBuild(BuildJobQueueItem buildJob) {

job = new BuildJobQueueItem(buildJob, completionDate, status);

List<BuildLogEntry> buildLogs = buildLogsMap.getBuildLogs(buildJob.id());
List<BuildLogEntry> buildLogs = buildLogsMap.getAndTruncateBuildLogs(buildJob.id());
buildLogsMap.removeBuildLogs(buildJob.id());

BuildResult failedResult = new BuildResult(buildJob.buildConfig().branch(), buildJob.buildConfig().assignmentCommitHash(), buildJob.buildConfig().testCommitHash(),
BBesrour marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
9 changes: 6 additions & 3 deletions src/main/resources/config/application-buildagent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,12 @@ artemis:
cleanup-schedule-minutes: 60
pause-grace-period-seconds: 60
build-timeout-seconds:
min: 10
default: 120
max: 240
min: 10
default: 120
max: 240
build-logs:
max-lines-per-job: 10000
max-chars-per-line: 1024
git:
name: Artemis
email: [email protected]
Expand Down
Loading