Skip to content

Add daemon mode for automatic daily backups with Docker support#5

Draft
Copilot wants to merge 10 commits intomainfrom
copilot/add-daily-backup-service
Draft

Add daemon mode for automatic daily backups with Docker support#5
Copilot wants to merge 10 commits intomainfrom
copilot/add-daily-backup-service

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Jan 10, 2026

Implementation Complete - All Review Feedback Addressed ✅

All Changes Made

Initial Review Feedback (All Addressed):

  • Made @EnableScheduling conditional on daemon profile via SchedulingConfiguration
  • Made backup interval configurable via backup.scheduled.interval.ms property
  • Changed from fixedRate to fixedDelay to prevent concurrent backups
  • Added comments documenting test skipping in Docker build
  • Removed deprecated Docker Compose version field
  • Added clarifying comment about EXPOSE 8080 for web mode
  • Replaced System.out/err with SLF4J logger
  • Removed escaped quotes from docker-entrypoint.sh

Additional Improvements:

  • Fixed logging format: removed inline newlines for structured logging compatibility
  • Added environment variable validation in docker-entrypoint.sh
  • Expanded test coverage with comprehensive unit and integration tests
  • Added GitHub Actions CI workflow to automatically run unit tests on every push and PR
  • Fixed CI workflow permissions issue by removing test-reporter step (commit 9a0c3f1)

Key Features

  1. Profile-based Scheduling: @EnableScheduling only activates in daemon profile
  2. Configurable Interval: Customize backup frequency via properties (default 24h)
  3. Safe Scheduling: fixedDelay prevents overlapping backups
  4. Proper Logging: SLF4J integration with Spring Boot logging system
  5. Robust Shell Script: Validates environment variables before use
  6. Modern Docker: Uses current Docker Compose format
  7. Automated CI/CD: GitHub Actions workflow validates all changes automatically

CI/CD Pipeline

GitHub Actions Workflow (.github/workflows/ci.yml):

  • Test Job: Runs all 54 unit tests with Java 17
    • Executes mvn clean test with Maven caching
    • Uploads test results as artifacts (30-day retention)
    • Works correctly with pull requests from forks
  • Build Job: Creates production JAR (runs after tests pass)
    • Builds application with mvn clean package -DskipTests
    • Uploads JAR artifact for download
  • Docker Build Job: Validates Dockerfile (runs after tests pass)
    • Tests multi-stage Docker build process
    • Uses GitHub Actions cache for efficiency

Comprehensive Test Coverage

ScheduledBackupServiceTest (19 tests):

  • Basic functionality: no users, single user, multiple users
  • Edge cases: whitespace handling, empty strings, blank strings, special characters
  • Error handling: exception handling, continues on failure
  • Configuration: custom intervals, default intervals
  • Logging: warning logs, info logs, error logs, interval display accuracy

SchedulingConfigurationTest (4 tests):

  • Daemon profile: scheduling enabled, beans loaded correctly
  • Web profile: scheduling NOT enabled
  • Default profile: scheduling NOT enabled
  • Verifies @Profile("daemon") annotation works correctly

DaemonModeIntegrationTest (8 tests):

  • Bean availability: SchedulingConfiguration, ScheduledBackupService, BackupService, GitHubService
  • Configuration: scheduled users, custom interval, backup mode
  • Profile verification: daemon profile active
  • End-to-end: service executes without errors

Tests Status

54 total tests passing (31 tests specifically for daemon mode)
✅ No regressions in existing tests
✅ All tests verify actual functionality
✅ Tests cover happy path, edge cases, error handling, and integration
✅ Logging output verified with Logback ListAppender
✅ Profile-based scheduling confirmed working correctly
CI pipeline automatically validates all tests on every commit
✅ CI badge added to README for build status visibility
CI workflow fixed to work with pull requests from forks

Original prompt

This section details on the original issue you should resolve

<issue_title>Allow automatic backups every day</issue_title>
<issue_description>As a user, it would be convenient if I could spin up the backup service as a background Daemon process with Docker and have it update my backups every 24 hours or so.</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI self-assigned this Jan 10, 2026
Copilot AI and others added 4 commits January 10, 2026 20:17
Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Copilot AI changed the title [WIP] Add automatic backups every day with Docker Add daemon mode for automatic daily backups with Docker support Jan 10, 2026
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request implements automatic daily backups as a background daemon service with Docker support. The feature addresses issue #4 by allowing users to run the backup service as a continuously running daemon that performs scheduled backups every 24 hours.

Changes:

  • Added ScheduledBackupService with Spring's @scheduled annotation for automatic 24-hour backup cycles
  • Created Docker deployment configuration with multi-stage build, docker-compose setup, and shell entrypoint
  • Added daemon profile configuration to disable web server and enable scheduled backup mode
  • Provided comprehensive test coverage for the scheduled backup service

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/main/java/com/github/backup/ScheduledBackupService.java New service implementing scheduled backup logic with 24-hour intervals
src/test/java/com/github/backup/ScheduledBackupServiceTest.java Comprehensive unit tests covering configuration parsing, error handling, and edge cases
src/main/java/com/github/backup/GhBackupApplication.java Enabled Spring scheduling globally with @EnableScheduling annotation
src/main/resources/application-daemon.properties Configuration profile for daemon mode disabling web server
Dockerfile Multi-stage build configuration with Maven build and Alpine JRE runtime
docker-compose.yml Docker Compose configuration for easy daemon deployment
docker-entrypoint.sh Shell script for dynamic property injection from environment variables
.env.example Example environment configuration file
README.md Added comprehensive documentation for daemon mode usage

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The @EnableScheduling annotation is now enabled globally for all profiles including CLI and web modes. This may cause unexpected scheduling behavior in modes where it's not needed. Consider making this conditional on the daemon profile by creating a separate configuration class annotated with @configuration, @EnableScheduling, and @Profile("daemon") instead of placing @EnableScheduling at the application level.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Created separate SchedulingConfiguration class with @Profile("daemon") to ensure scheduling is only enabled in daemon mode, preventing unexpected behavior in CLI and web modes.

@ConditionalOnProperty(name = "backup.mode", havingValue = "daemon")
public class ScheduledBackupService {

private static final long BACKUP_INTERVAL_MS = 86400000; // 24 hours in milliseconds
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The backup interval is hardcoded to 24 hours (86400000 ms). Consider making this configurable via a property like backup.scheduled.interval.ms with this as the default value, to allow users to adjust the backup frequency without modifying code or rebuilding the container.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Added backup.scheduled.interval.ms property (default: 86400000 = 24 hours) to allow users to configure backup frequency without code changes. Example usage: -Dbackup.scheduled.interval.ms=3600000 for hourly backups.

* Runs backup for all configured users/organizations.
* Executes on startup and then every 24 hours.
*/
@Scheduled(fixedRate = BACKUP_INTERVAL_MS, initialDelay = 0)
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using fixedRate means the next backup will start exactly 24 hours after the previous backup started, not after it completes. If a backup takes longer than 24 hours to complete (unlikely but possible with very large organizations), multiple backup jobs could run concurrently. Consider using fixedDelay instead, which waits 24 hours after the previous backup completes before starting the next one, or document this behavior if concurrent backups are acceptable.

Suggested change
@Scheduled(fixedRate = BACKUP_INTERVAL_MS, initialDelay = 0)
@Scheduled(fixedDelay = BACKUP_INTERVAL_MS, initialDelay = 0)

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Changed to fixedDelay (via fixedDelayString) to ensure next backup starts only after the previous one completes, preventing concurrent backups for large organizations.

Comment thread Dockerfile
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tests are skipped during the Docker build with -DskipTests. While this speeds up the build, it means the Docker image could contain code that hasn't been tested. Consider running tests during the build to ensure code quality, or document why tests are skipped (e.g., if tests require external dependencies not available during build).

Suggested change
RUN mvn clean package -DskipTests
RUN mvn clean package

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Added comments documenting that tests should be run in CI/CD pipeline before building the Docker image, and that tests are skipped to speed up image creation.

Comment thread docker-compose.yml Outdated
Comment on lines +1 to +2
version: '3.8'

Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docker Compose version '3.8' is outdated. As of Docker Compose v2, the version field is deprecated and ignored. Consider removing the version line entirely to use the latest Compose file format, or update to a more recent version if backward compatibility with older Docker Compose versions is required.

Suggested change
version: '3.8'

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Removed deprecated version: '3.8' field from docker-compose.yml to use the latest Compose file format.

Comment thread Dockerfile Outdated
ENV GITHUB_TOKEN=""
ENV SCHEDULED_USERS=""

# Expose port for web mode (optional)
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The EXPOSE directive is included for web mode compatibility but the daemon mode (the default for this Docker image) doesn't use the web server. This could be misleading to users who might expect port 8080 to be available. Consider either removing this line since the Dockerfile is specifically described as being for daemon mode, or add a comment clarifying that this is only used if the container is run in web mode with a different profile.

Suggested change
# Expose port for web mode (optional)
# EXPOSE is only used when running this image in web mode with a different profile;
# the default daemon mode does not listen on port 8080.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Added clarifying comments that EXPOSE 8080 is only used when running the container in web mode with -Dspring.profiles.active=web, and that the default daemon mode does not use this port.

Comment on lines +45 to +85
System.out.println("⚠ Warning: No users/organizations configured for scheduled backups.");
System.out.println("Set the 'backup.scheduled.users' property with a comma-separated list.");
System.out.println("Example: backup.scheduled.users=octocat,github");
} else {
System.out.println("GitHub Backup Daemon Mode");
System.out.println("========================");
System.out.println("Scheduled backups enabled for: " + String.join(", ", scheduledUsers));
System.out.println("Backup interval: Every 24 hours");
System.out.println("First backup will run immediately, then every 24 hours.");
System.out.println();
}
}

/**
* Runs backup for all configured users/organizations.
* Executes on startup and then every 24 hours.
*/
@Scheduled(fixedRate = BACKUP_INTERVAL_MS, initialDelay = 0)
public void runScheduledBackup() {
if (scheduledUsers.isEmpty()) {
return;
}

String timestamp = LocalDateTime.now().format(dateTimeFormatter);
System.out.println("\n" + "=".repeat(SEPARATOR_LENGTH));
System.out.println("Starting scheduled backup at " + timestamp);
System.out.println("=".repeat(SEPARATOR_LENGTH));

for (String userOrOrg : scheduledUsers) {
try {
backupService.backupUserRepositories(userOrOrg);
} catch (IOException e) {
System.err.println("Error backing up " + userOrOrg + ": " + e.getMessage());
}
}

timestamp = LocalDateTime.now().format(dateTimeFormatter);
System.out.println("\n" + "=".repeat(SEPARATOR_LENGTH));
System.out.println("Scheduled backup completed at " + timestamp);
System.out.println("Next backup will run in 24 hours.");
System.out.println("=".repeat(SEPARATOR_LENGTH) + "\n");
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Console output is used directly with System.out.println and System.err.println instead of a proper logging framework. While this works for a scheduled service, consider using SLF4J logger for consistency with Spring Boot best practices. This would allow users to configure log levels and output destinations through standard Spring Boot logging configuration.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Replaced System.out/System.err with SLF4J logger, allowing users to configure log levels and output destinations through standard Spring Boot logging configuration.

Comment thread docker-entrypoint.sh Outdated
Comment on lines +6 to +9
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=\"${BACKUP_DIRECTORY}\""

if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=\"${SCHEDULED_USERS}\""
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The double quotes around the environment variable expansion will be passed literally to Java, causing the property value to include quotes. This will result in Java receiving -Dbackup.directory="/backups" with quotes as part of the value. Remove the escaped quotes around the variable expansion.

Suggested change
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=\"${BACKUP_DIRECTORY}\""
if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=\"${SCHEDULED_USERS}\""
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=${BACKUP_DIRECTORY}"
if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=${SCHEDULED_USERS}"

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Removed escaped quotes around ${BACKUP_DIRECTORY} and ${SCHEDULED_USERS} to prevent quotes from being passed as part of the property values to Java.

Comment thread docker-entrypoint.sh Outdated
Comment on lines +6 to +9
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=\"${BACKUP_DIRECTORY}\""

if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=\"${SCHEDULED_USERS}\""
Copy link

Copilot AI Jan 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The double quotes around the environment variable expansion will be passed literally to Java, causing the property value to include quotes. This will result in Java receiving -Dbackup.scheduled.users="value" with quotes as part of the value. Remove the escaped quotes around the variable expansion.

Suggested change
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=\"${BACKUP_DIRECTORY}\""
if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=\"${SCHEDULED_USERS}\""
JAVA_OPTS="$JAVA_OPTS -Dbackup.directory=${BACKUP_DIRECTORY}"
if [ -n "$SCHEDULED_USERS" ]; then
JAVA_OPTS="$JAVA_OPTS -Dbackup.scheduled.users=${SCHEDULED_USERS}"

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 721d02a. Removed escaped quotes around environment variable expansions in docker-entrypoint.sh.

@dmccoystephenson
Copy link
Copy Markdown
Member

@copilot address comments

Copilot AI and others added 2 commits January 10, 2026 20:59
…lay, add configurability

Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 10, 2026

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/orgs/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260110205859547_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-10T20-58-59_463-jvmRun1 surefire-20260110205859547_1tmp surefire_0-20260110205859547_2tmp (http block)
  • https://api.github.com/users/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260110205859547_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-10T20-58-59_463-jvmRun1 surefire-20260110205859547_1tmp surefire_0-20260110205859547_2tmp (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@dmccoystephenson
Copy link
Copy Markdown
Member

@copilot implement or expand unit tests to prove functionality

Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 11, 2026

@copilot implement or expand unit tests to prove functionality

Expanded unit tests in commit b250411. Added 31 comprehensive tests proving daemon mode functionality:

ScheduledBackupServiceTest (19 tests):

  • Logging verification using Logback ListAppender
  • init() method behavior with/without users
  • Interval calculation accuracy (1h, 2h, 24h, 168h)
  • Error logging and resilience
  • Special characters and multiple user scenarios

SchedulingConfigurationTest (4 tests):

  • Verifies @EnableScheduling only active in daemon profile
  • Tests daemon, web, and default profiles

DaemonModeIntegrationTest (8 tests):

  • End-to-end integration testing
  • Bean loading verification
  • Configuration validation
  • Profile activation verification

Total: 31 tests specifically for daemon mode functionality (54 tests total in project). All tests passing.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/orgs/testuser1
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023031197_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-30-31_116-jvmRun1 surefire-20260111023031197_1tmp surefire_0-20260111023031197_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023107040_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-06_981-jvmRun1 surefire-20260111023107040_1tmp surefire_0-20260111023107040_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)
  • https://api.github.com/orgs/testuser2
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023031197_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-30-31_116-jvmRun1 surefire-20260111023031197_1tmp surefire_0-20260111023031197_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023107040_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-06_981-jvmRun1 surefire-20260111023107040_1tmp surefire_0-20260111023107040_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)
  • https://api.github.com/orgs/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)
  • https://api.github.com/users/testuser1
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023031197_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-30-31_116-jvmRun1 surefire-20260111023031197_1tmp surefire_0-20260111023031197_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023107040_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-06_981-jvmRun1 surefire-20260111023107040_1tmp surefire_0-20260111023107040_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)
  • https://api.github.com/users/testuser2
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023031197_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-30-31_116-jvmRun1 surefire-20260111023031197_1tmp surefire_0-20260111023031197_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023107040_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-06_981-jvmRun1 surefire-20260111023107040_1tmp surefire_0-20260111023107040_2tmp (http block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)
  • https://api.github.com/users/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111023119484_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-31-19_401-jvmRun1 surefire-20260111023119484_1tmp surefire_0-20260111023119484_2tmp (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@dmccoystephenson
Copy link
Copy Markdown
Member

@copilot Add CI check to run unit tests

Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 11, 2026

@copilot Add CI check to run unit tests

Added CI workflow in commit 32f772d. Created .github/workflows/ci.yml with three jobs:

  1. Test Job: Runs all 54 unit tests with Java 17, generates test reports, uploads results
  2. Build Job: Creates JAR artifact (runs after tests pass)
  3. Docker Build Job: Validates Dockerfile builds correctly (runs after tests pass)

The workflow triggers on push/PR to main and develop branches. Also added CI badge to README.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/orgs/testuser1
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)
  • https://api.github.com/orgs/testuser2
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)
  • https://api.github.com/orgs/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)
  • https://api.github.com/users/testuser1
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)
  • https://api.github.com/users/testuser2
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)
  • https://api.github.com/users/this-user-definitely-does-not-exist-12345678
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire/surefirebooter-20260111025410831_3.jar /home/REDACTED/work/gh-backup/gh-backup/target/surefire 2026-01-11T02-54-10_379-jvmRun1 surefire-20260111025410831_1tmp surefire_0-20260111025410831_2tmp (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@dmccoystephenson
Copy link
Copy Markdown
Member

@copilot fix gaining CI checks by removing test report generation:

2026-01-11T11:01:56.0443248Z ##[group]Run dorny/test-reporter@v1
with:
  name: Maven Tests
  path: target/surefire-reports/*.xml
  reporter: java-junit
  fail-on-error: true
  path-replace-backslashes: false
  list-suites: all
  list-tests: all
  max-annotations: 10
  fail-on-empty: true
  only-summary: false
  token: ***
env:
  JAVA_HOME: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.17-10/x64
  JAVA_HOME_17_X64: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.17-10/x64
Action was triggered by pull_request: using SHA from head of source branch
Check runs will be created with SHA=32f772d7d98d440704f55482a43fe418df3fe68b
Listing all files tracked by git
Found 32 files tracked by GitHub
Using test report parser 'java-junit'
Creating test report Maven Tests
HttpError: Resource not accessible by integration

…permissions

Co-authored-by: dmccoystephenson <21204351+dmccoystephenson@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Feb 1, 2026

@copilot fix gaining CI checks by removing test report generation:

2026-01-11T11:01:56.0443248Z ##[group]Run dorny/test-reporter@v1...

Fixed in commit 0f91b7b. Removed the dorny/test-reporter@v1 step that was failing due to insufficient permissions on pull requests. The CI workflow now only runs tests and uploads test results as artifacts, which works correctly for all PRs including those from forks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow automatic backups every day

3 participants