diff --git a/OtherVersions.md b/OtherVersions.md index 58c42d212f..5c400b1e10 100644 --- a/OtherVersions.md +++ b/OtherVersions.md @@ -90,4 +90,4 @@ The following 3 tasks can be used for deployment: Deploying any of these to the roboRIO will disable the current startup project until it is redeployed. -From here, ssh into the roboRIO using the `admin` account (`lvuser` will fail to run in many cases). In the admin home directory, a file for each deploy type will exist (`myRobotCpp`, `myRobotCppStatic` and `myRobotJavaRun`). These can be run to start up the corresponding project. +From here, ssh into the roboRIO using the `lvuser` account and run `frcRunRobot.sh` (It's in path). diff --git a/buildSrc/src/main/groovy/WPIJREArtifact.groovy b/buildSrc/src/main/groovy/WPIJREArtifact.groovy index abe4851473..1a0139b627 100644 --- a/buildSrc/src/main/groovy/WPIJREArtifact.groovy +++ b/buildSrc/src/main/groovy/WPIJREArtifact.groovy @@ -1,13 +1,14 @@ -import groovy.transform.CompileStatic -import javax.inject.Inject -import edu.wpi.first.deployutils.deploy.artifact.MavenArtifact -import edu.wpi.first.deployutils.deploy.context.DeployContext -import org.gradle.api.Project -import edu.wpi.first.deployutils.ActionWrapper -import edu.wpi.first.deployutils.deploy.target.RemoteTarget -import edu.wpi.first.deployutils.PredicateWrapper +import groovy.transform.CompileStatic; +import javax.inject.Inject; -import java.util.function.Function +import org.gradle.api.Project; + +import edu.wpi.first.deployutils.deploy.CommandDeployResult; +import edu.wpi.first.deployutils.deploy.artifact.MavenArtifact; +import edu.wpi.first.deployutils.deploy.context.DeployContext; +import edu.wpi.first.deployutils.deploy.target.RemoteTarget; +import edu.wpi.first.deployutils.PredicateWrapper; +import edu.wpi.first.deployutils.ActionWrapper; @CompileStatic public class WPIJREArtifact extends MavenArtifact { @@ -17,6 +18,18 @@ public class WPIJREArtifact extends MavenArtifact { return configName; } + public boolean isCheckJreVersion() { + return checkJreVersion; + } + + public void setCheckJreVersion(boolean checkJreVersion) { + this.checkJreVersion = checkJreVersion; + } + + private boolean checkJreVersion = true; + + private final String artifactLocation = "edu.wpi.first.jdk:roborio-2023:17.0.5u7-1" + @Inject public WPIJREArtifact(String name, RemoteTarget target) { super(name, target); @@ -24,10 +37,10 @@ public class WPIJREArtifact extends MavenArtifact { this.configName = configName; Project project = target.getProject(); getConfiguration().set(project.getConfigurations().create(configName)); - getDependency().set(project.getDependencies().add(configName, "edu.wpi.first.jdk:roborio-2022:11.0.12u5-1")); + getDependency().set(project.getDependencies().add(configName, artifactLocation)); setOnlyIf(new PredicateWrapper({ DeployContext ctx -> - return jreMissing(ctx) || project.hasProperty("force-redeploy-jre"); + return jreMissing(ctx) || jreOutOfDate(ctx) || project.hasProperty("force-redeploy-jre"); })); getDirectory().set("/tmp"); @@ -35,7 +48,7 @@ public class WPIJREArtifact extends MavenArtifact { getPostdeploy().add(new ActionWrapper({ DeployContext ctx -> ctx.getLogger().log("Installing JRE..."); - ctx.execute("opkg remove frc2022-openjdk*; opkg install /tmp/frcjre.ipk; rm /tmp/frcjre.ipk"); + ctx.execute("opkg remove frc*-openjdk*; opkg install /tmp/frcjre.ipk; rm /tmp/frcjre.ipk"); ctx.getLogger().log("JRE Deployed!"); })); } @@ -44,5 +57,21 @@ public class WPIJREArtifact extends MavenArtifact { return ctx.execute("if [[ -f \"/usr/local/frc/JRE/bin/java\" ]]; then echo OK; else echo MISSING; fi").getResult().contains("MISSING"); } - + private boolean jreOutOfDate(DeployContext ctx) { + if (!checkJreVersion) { + return false; + } + String version = getDependency().get().getVersion(); + CommandDeployResult cmdResult = ctx.execute("opkg list-installed | grep openjdk"); + if (cmdResult.getExitCode() != 0) { + ctx.getLogger().log("JRE not found"); + return false; + } + String result = cmdResult.getResult().trim(); + ctx.getLogger().log("Searching for JRE " + version); + ctx.getLogger().log("Found JRE " + result); + boolean matches = result.contains(version); + ctx.getLogger().log(matches ? "JRE Is Correct Version" : "JRE is mismatched. Reinstalling"); + return !matches; + } } diff --git a/myRobot/build.gradle b/myRobot/build.gradle index 6cd26e8531..d337daff0e 100644 --- a/myRobot/build.gradle +++ b/myRobot/build.gradle @@ -58,7 +58,7 @@ def simProjects = ['halsim_gui'] deploy { targets { roborio(RemoteTarget) { - directory = '/home/admin' + directory = '/home/lvuser' maxChannels = 4 locations { ssh(SshDeployLocation) { @@ -78,7 +78,8 @@ deploy { artifacts { all { predeploy << { ctx -> - ctx.execute('/usr/local/frc/bin/frcKillRobot.sh -t') + ctx.execute('. /etc/profile.d/natinst-path.sh; /usr/local/frc/bin/frcKillRobot.sh -t 2> /dev/null') + ctx.execute("sed -i -e 's/\"exec /\"/' /usr/local/frc/bin/frcRunRobot.sh") } postdeploy << { ctx -> ctx.execute("sync") @@ -92,6 +93,9 @@ deploy { excludes.add('**/*.so.debug') excludes.add('**/*.so.*.debug') postdeploy << { ctx -> + ctx.execute("echo '/home/lvuser/myRobotCpp' > /home/lvuser/robotCommand") + ctx.execute("chmod +x /home/lvuser/robotCommand; chown lvuser /home/lvuser/robotCommand") + ctx.execute("setcap cap_sys_nice+eip \"/home/lvuser/myRobotCpp\"") ctx.execute('chmod +x myRobotCpp') } } @@ -99,18 +103,28 @@ deploy { myRobotCppStatic(NativeExecutableArtifact) { libraryDirectory = '/usr/local/frc/third-party/lib' postdeploy << { ctx -> + ctx.execute("echo '/home/lvuser/myRobotCppStatic' > /home/lvuser/robotCommand") + ctx.execute("chmod +x /home/lvuser/robotCommand; chown lvuser /home/lvuser/robotCommand") + ctx.execute("setcap cap_sys_nice+eip \"/home/lvuser/myRobotCppStatic\"") ctx.execute('chmod +x myRobotCppStatic') } } + myRobotCppJava(NativeExecutableArtifact) { + libraryDirectory = '/usr/local/frc/third-party/lib' + def excludes = getLibraryFilter().getExcludes() + excludes.add('**/*.so.debug') + excludes.add('**/*.so.*.debug') + } + jre(WPIJREArtifact) { } myRobotJava(JavaArtifact) { jarTask = shadowJar postdeploy << { ctx -> - ctx.execute("echo '/usr/local/frc/JRE/bin/java -XX:+UseConcMarkSweepGC -Djava.library.path=/usr/local/frc/third-party/lib -Djava.lang.invoke.stringConcat=BC_SB -jar /home/admin/myRobot-all.jar' > /home/admin/myRobotJavaRun") - ctx.execute("chmod +x /home/admin/myRobotJavaRun; chown lvuser /home/admin/myRobotJavaRun") + ctx.execute("echo '/usr/local/frc/JRE/bin/java -XX:+UseG1GC -XX:MaxGCPauseMillis=1 -XX:GCTimeRatio=1 -Djava.library.path=/usr/local/frc/third-party/lib -Djava.lang.invoke.stringConcat=BC_SB -jar /home/lvuser/myRobot-all.jar' > /home/lvuser/robotCommand") + ctx.execute("chmod +x /home/lvuser/robotCommand; chown lvuser /home/lvuser/robotCommand") } } } @@ -122,7 +136,7 @@ tasks.register('deployJava') { try { dependsOn tasks.named('deployjreroborio') dependsOn tasks.named('deploymyRobotJavaroborio') - dependsOn tasks.named('deploymyRobotCpproborio') // Deploying shared C++ is how to get the Java shared libraries. + dependsOn tasks.named('deploymyRobotCppJavaroborio') // Deploying shared C++ is how to get the Java shared libraries. } catch (ignored) { } } @@ -161,6 +175,7 @@ model { if (binary.targetPlatform.name == nativeUtils.wpi.platforms.roborio) { if (binary.buildType.name == 'debug') { deploy.targets.roborio.artifacts.myRobotCpp.binary = binary + deploy.targets.roborio.artifacts.myRobotCppJava.binary = binary } } lib project: ':wpilibNewCommands', library: 'wpilibNewCommands', linkage: 'shared'