From 0010b34c888b579fdb51401c15bc0925568f6286 Mon Sep 17 00:00:00 2001 From: pfg666 Date: Tue, 28 Apr 2026 14:38:40 +0200 Subject: [PATCH 1/3] Fix compilation errors. --- learner/install.sh | 4 +-- learner/pom.xml | 9 +++--- learner/src/Learner/MultiBuilder.java | 12 ++++---- learner/src/Learner/TCPMapperSul.java | 18 +++++------ .../Learner/TCPStateFuzzerClientConfig.java | 4 +-- .../Learner/TCPStateFuzzerServerConfig.java | 4 +-- learner/src/Learner/TCPSulAdapter.java | 6 ++-- learner/src/Learner/TCPSulBuilder.java | 30 ++++++++++++------- learner/src/Learner/TCPSulClientConfig.java | 4 +-- learner/src/Learner/TCPSulServerConfig.java | 4 +-- 10 files changed, 52 insertions(+), 43 deletions(-) diff --git a/learner/install.sh b/learner/install.sh index d96b2f9..3dbe1ba 100755 --- a/learner/install.sh +++ b/learner/install.sh @@ -8,7 +8,7 @@ readonly LEARNER_SCRIPT_DIR readonly PATCHES_DIR="${LEARNER_SCRIPT_DIR}/experiments/patches" -readonly PROTOCOLSTATEFUZZER_COMMIT="b737a5d" +readonly PROTOCOLSTATEFUZZER_COMMIT="e8cddcc" readonly PROTOCOLSTATEFUZZER_REP_URL="https://github.com/protocol-fuzzing/protocol-state-fuzzer.git" readonly PROTOCOLSTATEFUZZER_FOLDER="ProtocolState-Fuzzer" @@ -81,7 +81,7 @@ function install_protocolstatefuzzer() { ( cd "${PROTOCOLSTATEFUZZER_FOLDER}" || exit echo "Installing ProtocolState-Fuzzer" - ./install.sh + mvn install ) fi } diff --git a/learner/pom.xml b/learner/pom.xml index 8459bbd..305dba9 100644 --- a/learner/pom.xml +++ b/learner/pom.xml @@ -1,4 +1,5 @@ - + + 4.0.0 TCP-Learner TCP-Learner @@ -6,8 +7,8 @@ UTF-8 - 17 - 17 + 21 + 21 @@ -15,7 +16,7 @@ com.github.protocolfuzzing protocolstatefuzzer - 1.0.0 + 0.1.0 diff --git a/learner/src/Learner/MultiBuilder.java b/learner/src/Learner/MultiBuilder.java index 7272589..f0c1dbe 100644 --- a/learner/src/Learner/MultiBuilder.java +++ b/learner/src/Learner/MultiBuilder.java @@ -4,9 +4,9 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.alphabet.AlphabetBuilderStandard; import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.alphabet.xml.AlphabetSerializerXml; import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.statistics.MealyMachineWrapper; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulBuilder; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulWrapper; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulWrapperStandard; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULBuilder; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULWrapper; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULWrapperStandard; import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.mapper.context.ExecutionContext; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.core.StateFuzzer; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.core.StateFuzzerBuilder; @@ -42,16 +42,16 @@ public class MultiBuilder ); // ExecutionContextImpl, SulBuilderImpl need to be implemented - protected SulBuilder< + protected SULBuilder< TCPInput, TCPOutput, ExecutionContext > sulBuilder = new TCPSulBuilder(); - protected SulWrapper< + protected SULWrapper< TCPInput, TCPOutput, ExecutionContext - > sulWrapper = new SulWrapperStandard<>(); + > sulWrapper = new SULWrapperStandard<>(); // SulClientConfigImpl and MapperConfigImpl need to be implemented @Override diff --git a/learner/src/Learner/TCPMapperSul.java b/learner/src/Learner/TCPMapperSul.java index 272df6b..68de82a 100644 --- a/learner/src/Learner/TCPMapperSul.java +++ b/learner/src/Learner/TCPMapperSul.java @@ -5,9 +5,9 @@ import java.net.UnknownHostException; import java.util.concurrent.ThreadLocalRandom; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.AbstractSul; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulAdapter; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulConfig; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.AbstractSUL; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULAdapter; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULConfig; import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.sulwrappers.DynamicPortProvider; import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.sulwrappers.ProcessHandler; import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.mapper.Mapper; @@ -16,7 +16,7 @@ public class TCPMapperSul implements - AbstractSul< + AbstractSUL< TCPInput, TCPOutput, ExecutionContext @@ -25,7 +25,7 @@ public class TCPMapperSul private SocketMapperSul socketSul; /** Stores the constructor parameter. */ - protected SulConfig sulConfig; + protected SULConfig sulConfig; /** Stores the constructor parameter. */ protected CleanupTasks cleanupTasks; @@ -43,9 +43,9 @@ public class TCPMapperSul protected TCPMapper mapper; /** Stores the SulAdapter instance. */ - protected SulAdapter sulAdapter; + protected SULAdapter sulAdapter; - public TCPMapperSul( + public TCPMapperSul( T sulConfig, CleanupTasks cleanupTasks ) throws UnknownHostException, IOException { @@ -186,7 +186,7 @@ public TCPOutput step(TCPInput in) { } @Override - public SulConfig getSulConfig() { + public SULConfig getSULConfig() { return sulConfig; } @@ -217,7 +217,7 @@ > getMapper() { } @Override - public SulAdapter getSulAdapter() { + public SULAdapter getSULAdapter() { return sulAdapter; } } diff --git a/learner/src/Learner/TCPStateFuzzerClientConfig.java b/learner/src/Learner/TCPStateFuzzerClientConfig.java index ba773a1..7b0c678 100644 --- a/learner/src/Learner/TCPStateFuzzerClientConfig.java +++ b/learner/src/Learner/TCPStateFuzzerClientConfig.java @@ -1,7 +1,7 @@ package Learner; import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.config.LearnerConfigStandard; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulClientConfig; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULClientConfig; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.core.config.StateFuzzerClientConfigStandard; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.testrunner.core.config.TestRunnerConfigStandard; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.testrunner.timingprobe.config.TimingProbeConfigStandard; @@ -9,7 +9,7 @@ public class TCPStateFuzzerClientConfig extends StateFuzzerClientConfigStandard { - public TCPStateFuzzerClientConfig(SulClientConfig sulClientConfig) { + public TCPStateFuzzerClientConfig(SULClientConfig sulClientConfig) { super( new LearnerConfigStandard(), sulClientConfig, diff --git a/learner/src/Learner/TCPStateFuzzerServerConfig.java b/learner/src/Learner/TCPStateFuzzerServerConfig.java index 5f4b690..b77f350 100644 --- a/learner/src/Learner/TCPStateFuzzerServerConfig.java +++ b/learner/src/Learner/TCPStateFuzzerServerConfig.java @@ -1,7 +1,7 @@ package Learner; import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.config.LearnerConfigStandard; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulServerConfig; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULServerConfig; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.core.config.StateFuzzerServerConfigStandard; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.testrunner.core.config.TestRunnerConfigStandard; import com.github.protocolfuzzing.protocolstatefuzzer.statefuzzer.testrunner.timingprobe.config.TimingProbeConfigStandard; @@ -9,7 +9,7 @@ public class TCPStateFuzzerServerConfig extends StateFuzzerServerConfigStandard { - public TCPStateFuzzerServerConfig(SulServerConfig sulServerConfig) { + public TCPStateFuzzerServerConfig(SULServerConfig sulServerConfig) { super( new LearnerConfigStandard(), sulServerConfig, diff --git a/learner/src/Learner/TCPSulAdapter.java b/learner/src/Learner/TCPSulAdapter.java index c770015..3ddc4e2 100644 --- a/learner/src/Learner/TCPSulAdapter.java +++ b/learner/src/Learner/TCPSulAdapter.java @@ -1,8 +1,8 @@ package Learner; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulAdapter; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULAdapter; -public class TCPSulAdapter implements SulAdapter { +public class TCPSulAdapter implements SULAdapter { @Override public void connect() { @@ -33,7 +33,7 @@ public boolean checkStopped() { } @Override - public Integer getSulPort() { + public Integer getSULPort() { // TODO Auto-generated method stub throw new UnsupportedOperationException( "Unimplemented method 'getSulPort'" diff --git a/learner/src/Learner/TCPSulBuilder.java b/learner/src/Learner/TCPSulBuilder.java index 6a8489f..ee6412d 100644 --- a/learner/src/Learner/TCPSulBuilder.java +++ b/learner/src/Learner/TCPSulBuilder.java @@ -1,27 +1,28 @@ package Learner; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.AbstractSul; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulBuilder; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulWrapper; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulWrapperStandard; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulConfig; +import java.io.IOException; + +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.AbstractSUL; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULBuilder; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULWrapper; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULWrapperStandard; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULConfig; import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.mapper.context.ExecutionContext; import com.github.protocolfuzzing.protocolstatefuzzer.utils.CleanupTasks; -import java.io.IOException; public class TCPSulBuilder implements - SulBuilder< + SULBuilder< TCPInput, TCPOutput, ExecutionContext > { @Override - public AbstractSul> buildSul(SulConfig sulConfig, + public AbstractSUL> buildSUL(SULConfig sulConfig, CleanupTasks cleanupTasks) { try { - AbstractSul< + AbstractSUL< TCPInput, TCPOutput, ExecutionContext @@ -46,7 +47,14 @@ public AbstractSul> buildWrapper() { - return new SulWrapperStandard<>(); + public SULWrapper> buildWrapper() { + return new SULWrapperStandard<>(); } + +// @Override +// public AbstractSUL> build(SULConfig sulConfig, +// CleanupTasks cleanupTasks) { +// // TODO Auto-generated method stub +// return null; +// } } diff --git a/learner/src/Learner/TCPSulClientConfig.java b/learner/src/Learner/TCPSulClientConfig.java index 056256a..39e5388 100644 --- a/learner/src/Learner/TCPSulClientConfig.java +++ b/learner/src/Learner/TCPSulClientConfig.java @@ -1,10 +1,10 @@ package Learner; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULClientConfigStandard; import com.beust.jcommander.ParametersDelegate; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulClientConfigStandard; public class TCPSulClientConfig - extends SulClientConfigStandard + extends SULClientConfigStandard implements TCPMapperConfigProvider { @ParametersDelegate diff --git a/learner/src/Learner/TCPSulServerConfig.java b/learner/src/Learner/TCPSulServerConfig.java index 0ff1492..a6ca41e 100644 --- a/learner/src/Learner/TCPSulServerConfig.java +++ b/learner/src/Learner/TCPSulServerConfig.java @@ -1,10 +1,10 @@ package Learner; +import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULServerConfigStandard; import com.beust.jcommander.ParametersDelegate; -import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SulServerConfigStandard; public class TCPSulServerConfig - extends SulServerConfigStandard + extends SULServerConfigStandard implements TCPMapperConfigProvider { @ParametersDelegate From 8369ea58af52c45020298ebc2e5ef16b732533cb Mon Sep 17 00:00:00 2001 From: pfg666 Date: Tue, 28 Apr 2026 14:51:26 +0200 Subject: [PATCH 2/3] Make naming consistent with PSF. --- learner/src/Learner/MultiBuilder.java | 6 +++--- .../{SocketMapperSul.java => SocketMapperSUL.java} | 4 ++-- .../Learner/{TCPMapperSul.java => TCPMapperSUL.java} | 10 +++++----- .../Learner/{TCPSulAdapter.java => TCPSULAdapter.java} | 2 +- .../Learner/{TCPSulBuilder.java => TCPSULBuilder.java} | 10 +++++----- ...TCPSulClientConfig.java => TCPSULClientConfig.java} | 10 +++++----- ...TCPSulServerConfig.java => TCPSULServerConfig.java} | 10 +++++----- 7 files changed, 26 insertions(+), 26 deletions(-) rename learner/src/Learner/{SocketMapperSul.java => SocketMapperSUL.java} (97%) rename learner/src/Learner/{TCPMapperSul.java => TCPMapperSUL.java} (97%) rename learner/src/Learner/{TCPSulAdapter.java => TCPSULAdapter.java} (96%) rename learner/src/Learner/{TCPSulBuilder.java => TCPSULBuilder.java} (89%) rename learner/src/Learner/{TCPSulClientConfig.java => TCPSULClientConfig.java} (64%) rename learner/src/Learner/{TCPSulServerConfig.java => TCPSULServerConfig.java} (64%) diff --git a/learner/src/Learner/MultiBuilder.java b/learner/src/Learner/MultiBuilder.java index f0c1dbe..d4a5e5b 100644 --- a/learner/src/Learner/MultiBuilder.java +++ b/learner/src/Learner/MultiBuilder.java @@ -46,7 +46,7 @@ public class MultiBuilder TCPInput, TCPOutput, ExecutionContext - > sulBuilder = new TCPSulBuilder(); + > sulBuilder = new TCPSULBuilder(); protected SULWrapper< TCPInput, TCPOutput, @@ -56,13 +56,13 @@ public class MultiBuilder // SulClientConfigImpl and MapperConfigImpl need to be implemented @Override public StateFuzzerClientConfig buildClientConfig() { - return new TCPStateFuzzerClientConfig(new TCPSulClientConfig()); + return new TCPStateFuzzerClientConfig(new TCPSULClientConfig()); } // SulServerConfigImpl (and MapperConfigImpl) need to be implemented @Override public StateFuzzerServerConfig buildServerConfig() { - return new TCPStateFuzzerServerConfig(new TCPSulServerConfig()); + return new TCPStateFuzzerServerConfig(new TCPSULServerConfig()); } @Override diff --git a/learner/src/Learner/SocketMapperSul.java b/learner/src/Learner/SocketMapperSUL.java similarity index 97% rename from learner/src/Learner/SocketMapperSul.java rename to learner/src/Learner/SocketMapperSUL.java index 4d685f9..4d37777 100644 --- a/learner/src/Learner/SocketMapperSul.java +++ b/learner/src/Learner/SocketMapperSUL.java @@ -9,12 +9,12 @@ /** * Socket interface with the external SSH mapper (test harness). */ -public class SocketMapperSul { +public class SocketMapperSUL { private PrintWriter sockout; private BufferedReader sockin; - public SocketMapperSul(Socket sock) { + public SocketMapperSUL(Socket sock) { try { // Create socket out (no buffering) and in sockout = new PrintWriter(sock.getOutputStream(), true); diff --git a/learner/src/Learner/TCPMapperSul.java b/learner/src/Learner/TCPMapperSUL.java similarity index 97% rename from learner/src/Learner/TCPMapperSul.java rename to learner/src/Learner/TCPMapperSUL.java index 68de82a..93dfb91 100644 --- a/learner/src/Learner/TCPMapperSul.java +++ b/learner/src/Learner/TCPMapperSUL.java @@ -14,7 +14,7 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.mapper.context.ExecutionContext; import com.github.protocolfuzzing.protocolstatefuzzer.utils.CleanupTasks; -public class TCPMapperSul +public class TCPMapperSUL implements AbstractSUL< TCPInput, @@ -22,7 +22,7 @@ public class TCPMapperSul ExecutionContext > { - private SocketMapperSul socketSul; + private SocketMapperSUL socketSul; /** Stores the constructor parameter. */ protected SULConfig sulConfig; @@ -45,7 +45,7 @@ public class TCPMapperSul /** Stores the SulAdapter instance. */ protected SULAdapter sulAdapter; - public TCPMapperSul( + public TCPMapperSUL( T sulConfig, CleanupTasks cleanupTasks ) throws UnknownHostException, IOException { @@ -55,7 +55,7 @@ public TCPMapperSul( this.cleanupTasks = cleanupTasks; // mapper and sulAdapter will be provided in subclasses this.mapper = new TCPMapper(); - this.sulAdapter = new TCPSulAdapter(); + this.sulAdapter = new TCPSULAdapter(); // ------------------------------------------------------------------- String mapperAddress = sulConfig @@ -93,7 +93,7 @@ public void run() { } ); - socketSul = new SocketMapperSul(sock); + socketSul = new SocketMapperSUL(sock); } // Before each query we create a blank context diff --git a/learner/src/Learner/TCPSulAdapter.java b/learner/src/Learner/TCPSULAdapter.java similarity index 96% rename from learner/src/Learner/TCPSulAdapter.java rename to learner/src/Learner/TCPSULAdapter.java index 3ddc4e2..1dfa2b8 100644 --- a/learner/src/Learner/TCPSulAdapter.java +++ b/learner/src/Learner/TCPSULAdapter.java @@ -2,7 +2,7 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SULAdapter; -public class TCPSulAdapter implements SULAdapter { +public class TCPSULAdapter implements SULAdapter { @Override public void connect() { diff --git a/learner/src/Learner/TCPSulBuilder.java b/learner/src/Learner/TCPSULBuilder.java similarity index 89% rename from learner/src/Learner/TCPSulBuilder.java rename to learner/src/Learner/TCPSULBuilder.java index ee6412d..3888649 100644 --- a/learner/src/Learner/TCPSulBuilder.java +++ b/learner/src/Learner/TCPSULBuilder.java @@ -10,7 +10,7 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.mapper.context.ExecutionContext; import com.github.protocolfuzzing.protocolstatefuzzer.utils.CleanupTasks; -public class TCPSulBuilder +public class TCPSULBuilder implements SULBuilder< TCPInput, @@ -28,14 +28,14 @@ public AbstractSUL > tcpSulConfig = null; if (sulConfig.isFuzzingClient()) { - tcpSulConfig = new TCPMapperSul( - (TCPSulClientConfig) sulConfig, + tcpSulConfig = new TCPMapperSUL( + (TCPSULClientConfig) sulConfig, cleanupTasks ); return tcpSulConfig; } else { - tcpSulConfig = new TCPMapperSul( - (TCPSulServerConfig) sulConfig, + tcpSulConfig = new TCPMapperSUL( + (TCPSULServerConfig) sulConfig, cleanupTasks ); return tcpSulConfig; diff --git a/learner/src/Learner/TCPSulClientConfig.java b/learner/src/Learner/TCPSULClientConfig.java similarity index 64% rename from learner/src/Learner/TCPSulClientConfig.java rename to learner/src/Learner/TCPSULClientConfig.java index 39e5388..300395e 100644 --- a/learner/src/Learner/TCPSulClientConfig.java +++ b/learner/src/Learner/TCPSULClientConfig.java @@ -3,19 +3,19 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULClientConfigStandard; import com.beust.jcommander.ParametersDelegate; -public class TCPSulClientConfig +public class TCPSULClientConfig extends SULClientConfigStandard implements TCPMapperConfigProvider { @ParametersDelegate - private TCPMapperConfig sshMapperConfig; + private TCPMapperConfig tcpMapperConfig; - public TCPSulClientConfig() { - sshMapperConfig = new TCPMapperConfig(); + public TCPSULClientConfig() { + tcpMapperConfig = new TCPMapperConfig(); } @Override public TCPMapperConfig getTCPMapperConfig() { - return sshMapperConfig; + return tcpMapperConfig; } } diff --git a/learner/src/Learner/TCPSulServerConfig.java b/learner/src/Learner/TCPSULServerConfig.java similarity index 64% rename from learner/src/Learner/TCPSulServerConfig.java rename to learner/src/Learner/TCPSULServerConfig.java index a6ca41e..5539dc7 100644 --- a/learner/src/Learner/TCPSulServerConfig.java +++ b/learner/src/Learner/TCPSULServerConfig.java @@ -3,19 +3,19 @@ import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.config.SULServerConfigStandard; import com.beust.jcommander.ParametersDelegate; -public class TCPSulServerConfig +public class TCPSULServerConfig extends SULServerConfigStandard implements TCPMapperConfigProvider { @ParametersDelegate - private TCPMapperConfig sshMapperConfig; + private TCPMapperConfig tcpMapperConfig; - public TCPSulServerConfig() { - sshMapperConfig = new TCPMapperConfig(); + public TCPSULServerConfig() { + tcpMapperConfig = new TCPMapperConfig(); } @Override public TCPMapperConfig getTCPMapperConfig() { - return sshMapperConfig; + return tcpMapperConfig; } } From 695566468fe425d96afe890714de48c27ccccd2c Mon Sep 17 00:00:00 2001 From: pfg666 Date: Tue, 28 Apr 2026 15:01:51 +0200 Subject: [PATCH 3/3] Add preliminary CI --- .github/workflows/CI.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/CI.yml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..17b2e72 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,19 @@ +name: CI +on: [push, pull_request] + +jobs: + install: + if: ${{ !contains(github.event.head_commit.message, 'ci skip') }} + runs-on: ubuntu-latest + strategy: + fail-fast: true + steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '21' + - name: Install + run: cd learner; ./install.sh