Jomocool преди 5 месеца
родител
ревизия
24714d69f0
променени са 3 файла, в които са добавени 59 реда и са изтрити 3 реда
  1. 16 2
      dadk-config/src/common/task.rs
  2. 1 1
      dadk-config/tests/test_user_config.rs
  3. 42 0
      dadk-user/src/executor/mod.rs

+ 16 - 2
dadk-config/src/common/task.rs

@@ -46,12 +46,26 @@ pub struct BuildConfig {
     /// 构建命令
     #[serde(rename = "build-command")]
     pub build_command: Option<String>,
+    /// 构建前执行的脚本
+    #[serde(rename = "pre-build")]
+    pub pre_build: Option<PathBuf>,
+    #[serde(rename = "post-build")]
+    /// 构建后执行的脚本
+    pub post_build: Option<PathBuf>,
 }
 
 impl BuildConfig {
     #[allow(dead_code)]
-    pub fn new(build_command: Option<String>) -> Self {
-        Self { build_command }
+    pub fn new(
+        build_command: Option<String>,
+        pre_build: Option<PathBuf>,
+        post_build: Option<PathBuf>,
+    ) -> Self {
+        Self {
+            build_command,
+            pre_build,
+            post_build,
+        }
     }
 
     pub fn validate(&self) -> Result<()> {

+ 1 - 1
dadk-config/tests/test_user_config.rs

@@ -51,7 +51,7 @@ fn test_parse_dadk_user_config(ctx: &mut DadkConfigTestContext) {
                 version: "0.1.2".to_string(),
             },
         ],
-        build: BuildConfig::new(Some("make install".to_string())),
+        build: BuildConfig::new(Some("make install".to_string()), None, None),
         install: InstallConfig::new(Some(PathBuf::from("/bin"))),
         clean: CleanConfig::new(Some("make clean".to_string())),
         envs: vec![

+ 42 - 0
dadk-user/src/executor/mod.rs

@@ -149,8 +149,12 @@ impl Executor {
 
         match self.action {
             Action::Build => {
+                // 构建前的工作
+                self.pre_build()?;
                 // 构建任务
                 self.build()?;
+                // 构建完毕后的工作
+                self.post_build()?;
             }
             Action::Install => {
                 // 把构建结果安装到DragonOS
@@ -172,6 +176,25 @@ impl Executor {
         return Ok(());
     }
 
+    fn pre_build(&mut self) -> Result<(), ExecutorError> {
+        if let Some(pre_build) = self.entity.task().build.pre_build {
+            let output = Command::new(pre_build)
+                .output()
+                .expect("Failed to execute pre_build script");
+
+            // 检查脚本执行结果
+            if output.status.success() {
+                info!("Pre-build script executed successfully");
+            } else {
+                error!("Pre-build script failed");
+                return Err(ExecutorError::TaskFailed(
+                    "Pre-build script failed".to_string(),
+                ));
+            }
+        }
+        Ok(())
+    }
+
     fn build(&mut self) -> Result<(), ExecutorError> {
         if let Some(status) = self.task_log().build_status() {
             if let Some(build_time) = self.task_log().build_time() {
@@ -191,6 +214,25 @@ impl Executor {
         return self.do_build();
     }
 
+    fn post_build(&mut self) -> Result<(), ExecutorError> {
+        if let Some(post_build) = self.entity.task().build.post_build {
+            let output = Command::new(post_build)
+                .output()
+                .expect("Failed to execute post_build script");
+
+            // 检查脚本执行结果
+            if output.status.success() {
+                info!("Post-build script executed successfully");
+            } else {
+                error!("Post-build script failed");
+                return Err(ExecutorError::TaskFailed(
+                    "Post-buildscript failed".to_string(),
+                ));
+            }
+        }
+        Ok(())
+    }
+
     /// # 执行build操作
     fn do_build(&mut self) -> Result<(), ExecutorError> {
         // 确认源文件就绪