我正在尝试创建一个自动部署系统,所以我可能会接近这一切都错了。基本上我们的安装包括移出源代码(不是使用git,而是使用自己开发的RCS包装器),运行make命令,调整配置文件,然后运行自定义向上/向下/更新脚本以使服务器恢复运行。该系统是一个实时系统,所以必须在我们的运营商周围安排一切。在我们的环境中,我们可以访问C,KornShell,FORTRAN,Pascal和Java。
我目前的想法是写一些你可以执行命令行命令,与stdin / out交互并跟踪进程及其子进程的退出代码。从那里我们可以设置配置文件,说出命令,它的预期退出代码,如果它需要用户输入等待go / no go time以及退出命令。我的问题是我应该从哪里开始用C或Java来完成这项任务。我找到了一些资源,但我似乎无法跟踪子进程。还有其他方法可以进行自动部署吗?
答案 0 :(得分:0)
您可以使用标准ProcessBuilder进行此提议。
一个例子:
public class GNUMakeExecutor {
private static final String GNU_MAKE = "make";
public static void main(String[] args) throws Exception {
File sourceRootDir = new File("/home/dev/project_root");
String makeFileName = "MyCustomMakeFile";
List<String> command = new ArrayList<>();
command.add(GNU_MAKE);
// and add/check some flag to skip, in case of pre-compiled headers
if( Runtime.getRuntime().availableProcessors() > 1 ) {
command.add("-j"+Runtime.getRuntime().availableProcessors());
}
if(null != makeFileName && makeFileName.length() > 0) {
command.add("-f");
command.add(makeFileName);
}
String path = System.getenv("PATH") + File.pathSeparator + "/opt/my_additional_util/bin";
ProcessBuilder pb = new ProcessBuilder().directory(sourceRootDir)
.command(command).redirectError(Redirect.INHERIT).redirectOutput(Redirect.INHERIT);
pb.environment().put("PATH", path);
Process makeProcess = pb.start();
int exitCode = makeProcess.waitFor();
if(exitCode != 0)
System.err.println("Build failed, exit code: " + exitCode );
else
System.out.println("Build success");
}
}
同时,您可以使用Jenkins使用一组依赖任务。 即首先使用make / cmake等制作C项目,然后执行一些bash / docker / cheef / maven /等等。