public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Anton Mikanovich <amikan@ilbers.de>
To: isar-users@googlegroups.com
Cc: Anton Mikanovich <amikan@ilbers.de>
Subject: [PATCH v2 2/4] imager: Migrate from buildchroot to schroot
Date: Fri, 30 Dec 2022 22:08:22 +0300	[thread overview]
Message-ID: <20221230190824.12256-3-amikan@ilbers.de> (raw)
In-Reply-To: <20221230190824.12256-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, 72 insertions(+), 9 deletions(-)

diff --git a/meta/classes/image-tools-extension.bbclass b/meta/classes/image-tools-extension.bbclass
index 2d3dda4f..85f0d551 100644
--- a/meta/classes/image-tools-extension.bbclass
+++ b/meta/classes/image-tools-extension.bbclass
@@ -5,13 +5,15 @@
 #
 # This file extends the image.bbclass to supply tools for futher imager functions
 
-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}-${ISAR_BUILD_UUID}"
+
+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[network] = "${TASK_USE_NETWORK_AND_SUDO}"
@@ -25,11 +27,9 @@ do_install_imager_deps() {
         distro="${HOST_BASE_DISTRO}-${BASE_DISTRO_CODENAME}"
     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="-" \
@@ -38,10 +38,72 @@ 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"
+do_start_imager_session[network] = "${TASK_USE_SUDO}"
+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"
+do_stop_imager_session[network] = "${TASK_USE_SUDO}"
+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 ba0fd6ef..5851b94d 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -296,6 +296,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-12-30 19:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-30 19:08 [PATCH v2 0/4] Imager schroot migration Anton Mikanovich
2022-12-30 19:08 ` [PATCH v2 1/4] sbuild: Allow setting custom config paths Anton Mikanovich
2022-12-30 19:08 ` Anton Mikanovich [this message]
2022-12-30 19:08 ` [PATCH v2 3/4] imager: Move image types to schroot Anton Mikanovich
2022-12-30 19:08 ` [PATCH v2 4/4] events: Cleanup lost schroot sessions if any Anton Mikanovich
2023-01-03  9:55   ` Roberto A. Foglietta
2023-01-04 11:19     ` Roberto A. Foglietta
2022-12-30 19:13 ` [PATCH v2 0/4] Imager schroot migration 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=20221230190824.12256-3-amikan@ilbers.de \
    --to=amikan@ilbers.de \
    --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