public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Anton Mikanovich <amikan@ilbers.de>
To: isar-users@googlegroups.com
Cc: adriaan.schmidt@siemens.com, Anton Mikanovich <amikan@ilbers.de>
Subject: [PATCH 3/6] imager: Migrate from buildchroot to schroot
Date: Sat, 14 May 2022 10:07:33 +0300	[thread overview]
Message-ID: <20220514070736.12997-4-amikan@ilbers.de> (raw)
In-Reply-To: <20220514070736.12997-1-amikan@ilbers.de>

Install dependencies and perform all imager actions using one schroot
overlay. This requires to open a session which stays opened until all
the images are ready. This session will be closed then and all the
changes will be lost.

Signed-off-by: Anton Mikanovich <amikan@ilbers.de>
---
 meta/classes/image-tools-extension.bbclass | 80 +++++++++++++++++++---
 meta/classes/image.bbclass                 |  1 +
 2 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/meta/classes/image-tools-extension.bbclass b/meta/classes/image-tools-extension.bbclass
index b996813..54a6622 100644
--- a/meta/classes/image-tools-extension.bbclass
+++ b/meta/classes/image-tools-extension.bbclass
@@ -5,16 +5,18 @@
 #
 # This file extends the image.bbclass to supply tools for futher imager functions
 
-# Imager are expected to run natively, thus will use the target buildchroot.
+# Imager are expected to run natively, thus will use the target schroot.
 ISAR_CROSS_COMPILE = "0"
 
-inherit buildchroot
+inherit sbuild
 
 IMAGER_INSTALL ??= ""
 IMAGER_BUILD_DEPS ??= ""
 DEPENDS += "${IMAGER_BUILD_DEPS}"
 
-do_install_imager_deps[depends] = "${BUILDCHROOT_DEP} isar-apt:do_cache_config"
+IMAGER_SCHROOT_SESSION_ID = "isar-imager-${SCHROOT_USER}-${PN}-${MACHINE}-${BITBAKE_BUILD_ID}"
+
+do_install_imager_deps[depends] = "${SCHROOT_DEP} isar-apt:do_cache_config"
 do_install_imager_deps[deptask] = "do_deploy_deb"
 do_install_imager_deps[lockfiles] += "${REPO_ISAR_DIR}/isar.lock"
 do_install_imager_deps() {
@@ -22,11 +24,9 @@ do_install_imager_deps() {
         exit
     fi
 
-    buildchroot_do_mounts
-
     E="${@ isar_export_proxies(d)}"
-    deb_dl_dir_import ${BUILDCHROOT_DIR} ${DISTRO}
-    sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \
+    deb_dl_dir_import ${SCHROOT_DIR} ${DISTRO}
+    schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} -d / -u root -- sh -c ' \
         apt-get update \
             -o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \
             -o Dir::Etc::SourceParts="-" \
@@ -35,10 +35,70 @@ do_install_imager_deps() {
             --allow-unauthenticated --allow-downgrades --download-only install \
             ${IMAGER_INSTALL}'
 
-    deb_dl_dir_export ${BUILDCHROOT_DIR} ${DISTRO}
-    sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \
+    deb_dl_dir_export ${SCHROOT_DIR} ${DISTRO}
+    schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} -d / -u root -- sh -c ' \
         apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y \
             --allow-unauthenticated --allow-downgrades install \
             ${IMAGER_INSTALL}'
 }
-addtask install_imager_deps before do_image_tools
+addtask install_imager_deps before do_image_tools after do_start_imager_session
+
+SCHROOT_MOUNTS = "${WORKDIR}:${PP_WORK} ${IMAGE_ROOTFS}:${PP_ROOTFS} ${DEPLOY_DIR_IMAGE}:${PP_DEPLOY}"
+
+do_start_imager_session[dirs] = "${WORKDIR} ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}"
+do_start_imager_session[depends] = "${SCHROOT_DEP} isar-apt:do_cache_config"
+do_start_imager_session[nostamp] = "1"
+python do_start_imager_session() {
+    import subprocess
+    bb.build.exec_func("schroot_create_configs", d)
+    bb.build.exec_func("insert_mounts", d)
+    sbuild_chroot = d.getVar("SBUILD_CHROOT", True)
+    session_id = d.getVar("IMAGER_SCHROOT_SESSION_ID", True)
+    try:
+        if subprocess.run("schroot -l --all-sessions | grep %s" % session_id, shell=True).returncode:
+            subprocess.run("schroot -b -c %s -n %s" % (sbuild_chroot, session_id), shell=True, check=True)
+            bb.debug(2, "Open schroot session %s" % session_id)
+        else:
+            subprocess.run("schroot --recover-session -c %s" % session_id, shell=True, check=True)
+            bb.debug(2, "Reuse schroot session %s" % session_id)
+        d.setVar("SCHROOT_OPEN_SESSION_ID", session_id)
+    except subprocess.CalledProcessError as err:
+        subprocess.run("schroot -e -c %s" % session_id, shell=True)
+        bb.build.exec_func("remove_mounts", d)
+        bb.build.exec_func("schroot_delete_configs", d)
+        bb.fatal("Could not create schroot session: %s" % err.output.decode('utf-8') if err.output else "")
+}
+addtask start_imager_session before do_stop_imager_session after do_rootfs_finalize
+
+do_stop_imager_session[depends] = "${SCHROOT_DEP}"
+do_stop_imager_session[nostamp] = "1"
+python do_stop_imager_session() {
+    import subprocess
+    session_id = d.getVar("IMAGER_SCHROOT_SESSION_ID", True)
+    try:
+        id = subprocess.run("schroot -d / -r -c %s -- printenv -0 SCHROOT_ALIAS_NAME" % session_id,
+                            shell=True, check=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
+        bb.debug(2, "Close schroot session %s (%s)" % (session_id, id))
+        subprocess.run("schroot -e -c %s" % session_id, shell=True, check=True)
+    except subprocess.CalledProcessError as err:
+        bb.error("Could not close schroot session %s: %s" % (session_id, err.output.decode('utf-8')) if err.output else "")
+    finally:
+        if 'id' in locals():
+            d.setVar("SBUILD_CHROOT", id)
+            bb.build.exec_func("remove_mounts", d)
+            bb.build.exec_func("schroot_delete_configs", d)
+}
+addtask stop_imager_session before do_deploy after do_image
+
+imager_run() {
+    imager_cleanup() {
+        if id="$(schroot -d / -r -c ${IMAGER_SCHROOT_SESSION_ID} -- printenv -0 SCHROOT_ALIAS_NAME)"; then
+            schroot -e -c ${IMAGER_SCHROOT_SESSION_ID}
+            remove_mounts $id
+            schroot_delete_configs $id
+        fi
+    }
+    trap 'exit 1' INT HUP QUIT TERM ALRM USR1
+    trap 'imager_cleanup' EXIT
+    schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} "$@"
+}
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index 26b1b0d..651b252 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -275,6 +275,7 @@ python() {
         d.appendVarFlag(task, 'vardeps', ' ' + ' '.join(vardeps))
         d.appendVarFlag(task, 'vardepsexclude', ' ' + ' '.join(vardepsexclude))
         d.appendVarFlag(task, 'dirs', localdata.expand(' ${DEPLOY_DIR_IMAGE}'))
+        d.appendVarFlag(task, 'deptask', ' do_start_imager_session')
         if task_deps:
             d.appendVarFlag(task, 'depends', task_deps)
         bb.build.addtask(task, 'do_image', after, d)
-- 
2.17.1


  parent reply	other threads:[~2022-05-14  7:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-14  7:07 [PATCH 0/6] Imager schroot migration Anton Mikanovich
2022-05-14  7:07 ` [PATCH 1/6] sbuild: Allow setting custom config paths Anton Mikanovich
2022-05-14  7:07 ` [PATCH 2/6] base: Implement bitbake build ID Anton Mikanovich
2022-05-14  7:07 ` Anton Mikanovich [this message]
2022-05-14  7:07 ` [PATCH 4/6] imager: Move image types to schroot Anton Mikanovich
2022-05-14  7:07 ` [PATCH 5/6] events: Cleanup lost schroot sessions if any Anton Mikanovich
2022-05-14  7:07 ` [PATCH 6/6] meta: Remove buildchroot Anton Mikanovich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220514070736.12997-4-amikan@ilbers.de \
    --to=amikan@ilbers.de \
    --cc=adriaan.schmidt@siemens.com \
    --cc=isar-users@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox