From 1a8a8c73be93fcf6072e8ad987500c7600259de8 Mon Sep 17 00:00:00 2001 From: brfrn169 Date: Thu, 12 Jun 2025 10:55:42 +0900 Subject: [PATCH 1/6] Fix build error in data-loader --- data-loader/cli/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/data-loader/cli/build.gradle b/data-loader/cli/build.gradle index f1b37d0c58..5b66c8f542 100644 --- a/data-loader/cli/build.gradle +++ b/data-loader/cli/build.gradle @@ -34,6 +34,7 @@ javadoc { // Build a fat jar shadowJar { + mustRunAfter distZip, distTar archiveClassifier.set("") manifest { attributes 'Main-Class': 'com.scalar.db.dataloader.DataLoaderCli' From a0ba5e3751ef0dbad34e5d11d934060c44576a79 Mon Sep 17 00:00:00 2001 From: Jishnu J Date: Thu, 12 Jun 2025 13:55:15 +0530 Subject: [PATCH 2/6] Added data loader build CI workflow --- .github/workflows/data-loader-ci.yaml | 45 +++++++++++++++++++ .../cli/util/DirectoryUtilsTest.java | 24 ++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/data-loader-ci.yaml diff --git a/.github/workflows/data-loader-ci.yaml b/.github/workflows/data-loader-ci.yaml new file mode 100644 index 0000000000..825aa94636 --- /dev/null +++ b/.github/workflows/data-loader-ci.yaml @@ -0,0 +1,45 @@ +name: CI for CLI + +on: + pull_request: + workflow_dispatch: + +jobs: + data_loader_ci: + name: Build Data Loader CLI + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set version + id: version + run: | + VERSION=$(echo "${GITHUB_REF}" | sed -e "s#refs/tags/v##g") + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Set up JDK 8 and 11 (default 8) + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: | + 11 + 8 + + - name: Cache Gradle packages + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Gradle Data Loader CLI build + run: ./gradlew :data-loader:cli:build --no-daemon --stacktrace + + - name: Cleanup Gradle cache + run: | + rm -f ~/.gradle/caches/modules-2/modules-2.lock + rm -f ~/.gradle/caches/modules-2/gc.properties \ No newline at end of file diff --git a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java index 1ff380c19c..7d63ccd254 100755 --- a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java +++ b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java @@ -8,8 +8,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.attribute.PosixFilePermission; +import java.util.HashSet; +import java.util.Set; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; @@ -44,13 +48,25 @@ void validateOrCreateTargetDirectory_DirectoryDoesNotExist_CreatesDirectory() @Test void validateOrCreateTargetDirectory_DirectoryNotWritable_ThrowsException() throws IOException { Path readOnlyDirectory = Files.createDirectory(Paths.get(tempDir.toString(), "readOnlyDir")); - readOnlyDirectory.toFile().setWritable(false); + // Try to make it read-only using POSIX if supported + try { + Set perms = new HashSet<>(); + perms.add(PosixFilePermission.OWNER_READ); + perms.add(PosixFilePermission.OWNER_EXECUTE); // Allow entering directory + Files.setPosixFilePermissions(readOnlyDirectory, perms); + } catch (UnsupportedOperationException | IOException e) { + // Fall back for systems without POSIX support + readOnlyDirectory.toFile().setWritable(false); + } + // ✅ Verify it is actually non-writable + boolean isWritable = Files.isWritable(readOnlyDirectory); + Assumptions.assumeFalse(isWritable, "Directory is still writable; skipping test."); + + // Test assertThrows( DirectoryValidationException.class, - () -> { - DirectoryUtils.validateOrCreateTargetDirectory(readOnlyDirectory.toString()); - }); + () -> DirectoryUtils.validateOrCreateTargetDirectory(readOnlyDirectory.toString())); } @Test From 98d6f495766d48d7c4a86e3028876b3b38395a7f Mon Sep 17 00:00:00 2001 From: Jishnu J Date: Thu, 12 Jun 2025 13:56:31 +0530 Subject: [PATCH 3/6] Minor change --- .../com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java index 7d63ccd254..773cb27dec 100755 --- a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java +++ b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java @@ -53,13 +53,13 @@ void validateOrCreateTargetDirectory_DirectoryNotWritable_ThrowsException() thro try { Set perms = new HashSet<>(); perms.add(PosixFilePermission.OWNER_READ); - perms.add(PosixFilePermission.OWNER_EXECUTE); // Allow entering directory + perms.add(PosixFilePermission.OWNER_EXECUTE); Files.setPosixFilePermissions(readOnlyDirectory, perms); } catch (UnsupportedOperationException | IOException e) { // Fall back for systems without POSIX support readOnlyDirectory.toFile().setWritable(false); } - // ✅ Verify it is actually non-writable + // Verify it is actually non-writable boolean isWritable = Files.isWritable(readOnlyDirectory); Assumptions.assumeFalse(isWritable, "Directory is still writable; skipping test."); From fe4761c02a0e253d088543ff6971a57a9964d515 Mon Sep 17 00:00:00 2001 From: Peckstadt Yves Date: Mon, 16 Jun 2025 12:56:21 +0900 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: Mitsunori Komatsu --- .github/workflows/data-loader-ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/data-loader-ci.yaml b/.github/workflows/data-loader-ci.yaml index 825aa94636..f21aa8272a 100644 --- a/.github/workflows/data-loader-ci.yaml +++ b/.github/workflows/data-loader-ci.yaml @@ -1,4 +1,4 @@ -name: CI for CLI +name: CI for Data Loader CLI on: pull_request: @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set version id: version From 0b40a16a15636ff2591f0933219d376096713a11 Mon Sep 17 00:00:00 2001 From: Peckstadt Yves Date: Mon, 16 Jun 2025 13:48:35 +0900 Subject: [PATCH 5/6] Apply feedback --- .github/workflows/data-loader-ci.yaml | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/.github/workflows/data-loader-ci.yaml b/.github/workflows/data-loader-ci.yaml index f21aa8272a..fbceef00a7 100644 --- a/.github/workflows/data-loader-ci.yaml +++ b/.github/workflows/data-loader-ci.yaml @@ -12,34 +12,15 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set version - id: version - run: | - VERSION=$(echo "${GITHUB_REF}" | sed -e "s#refs/tags/v##g") - echo "version=${VERSION}" >> $GITHUB_OUTPUT - - - name: Set up JDK 8 and 11 (default 8) + - name: Set up JDK 8 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: | - 11 - 8 + java-version: 8 - - name: Cache Gradle packages - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 - name: Gradle Data Loader CLI build run: ./gradlew :data-loader:cli:build --no-daemon --stacktrace - - name: Cleanup Gradle cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties \ No newline at end of file From 6def4199fb1a36560a0d45aec3f8b277d9c147eb Mon Sep 17 00:00:00 2001 From: Peckstadt Yves Date: Tue, 17 Jun 2025 18:26:48 +0900 Subject: [PATCH 6/6] Restore DirectoryUtilsTest changes --- .../cli/util/DirectoryUtilsTest.java | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java index 773cb27dec..1ff380c19c 100755 --- a/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java +++ b/data-loader/cli/src/test/java/com/scalar/db/dataloader/cli/util/DirectoryUtilsTest.java @@ -8,12 +8,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.nio.file.attribute.PosixFilePermission; -import java.util.HashSet; -import java.util.Set; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; @@ -48,25 +44,13 @@ void validateOrCreateTargetDirectory_DirectoryDoesNotExist_CreatesDirectory() @Test void validateOrCreateTargetDirectory_DirectoryNotWritable_ThrowsException() throws IOException { Path readOnlyDirectory = Files.createDirectory(Paths.get(tempDir.toString(), "readOnlyDir")); + readOnlyDirectory.toFile().setWritable(false); - // Try to make it read-only using POSIX if supported - try { - Set perms = new HashSet<>(); - perms.add(PosixFilePermission.OWNER_READ); - perms.add(PosixFilePermission.OWNER_EXECUTE); - Files.setPosixFilePermissions(readOnlyDirectory, perms); - } catch (UnsupportedOperationException | IOException e) { - // Fall back for systems without POSIX support - readOnlyDirectory.toFile().setWritable(false); - } - // Verify it is actually non-writable - boolean isWritable = Files.isWritable(readOnlyDirectory); - Assumptions.assumeFalse(isWritable, "Directory is still writable; skipping test."); - - // Test assertThrows( DirectoryValidationException.class, - () -> DirectoryUtils.validateOrCreateTargetDirectory(readOnlyDirectory.toString())); + () -> { + DirectoryUtils.validateOrCreateTargetDirectory(readOnlyDirectory.toString()); + }); } @Test