From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6771003121820762112 Date: Tue, 21 Jan 2020 05:01:32 -0800 (PST) From: vijai kumar To: isar-users Message-Id: In-Reply-To: <20200121105417.37bb6ad4@md1za8fc.ad001.siemens.net> References: <20191216115011.17664-1-henning.schild@siemens.com> <20191216115011.17664-24-henning.schild@siemens.com> <20200121105417.37bb6ad4@md1za8fc.ad001.siemens.net> Subject: Re: [PATCHv2 23/25] base-apt: pull base-apt population to the front of the build chain MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_1825_1083405080.1579611692677" X-Google-Token: EKzsm_EFGhJfp9yMcJI0 X-Google-IP: 139.181.36.34 X-TUID: r+0B+59Z2pg7 ------=_Part_1825_1083405080.1579611692677 Content-Type: multipart/alternative; boundary="----=_Part_1826_612504666.1579611692678" ------=_Part_1826_612504666.1579611692678 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Henning, On Tuesday, January 21, 2020 at 3:24:20 PM UTC+5:30, Henning Schild wrote: > > Hi Vijai, > > On Tue, 21 Jan 2020 00:55:43 -0800 > vijai kumar > wrote: > > > Hi Henning, > > > > Can't we have the base-apt repo generation towards the end of the > > build chain? > > Could you go into detail why you think the point in time matters? It > was at the end because the old implementation relied on the rootfs > hopefully keeping all .debs in its cache. While that worked it was > never really robust. > > And it was optional, now it just "comes for free along the way". > Whether you use it or not is still optional. > > > Right now if you need to generate a base-apt then you need to build > > twice. Once without > > ISAR_USE_CACHED_BASE_REPO and once with ISAR_USE_CACHED_BASE_REPO set. > > Still the case. You will need a second run where you tell Isar to use > that repo. Only difference its creation during the first run was > implicit instead of explicit. > > > What if we could just generate the repo towards the end nevertheless > > and let user decide > > whether to use the repo in the subsequent build by setting > > ISAR_USE_CACHED_BASE_REPO? > > Again, i do not see where the "point in time of the first build" makes > a difference. And the user still has to decide using that interface you > mention. > > We are also generating base-apt for redistribution to customers. So far we have relied on the single-step process of using cache_base_repo. Now this has become 2 steps for us. Run builds for all the boards and a dummy build to populate the base-apt(?). Which very well could be avoided if the base-apt is updated incrementally during subsequent builds. I was more curious about the extra step needed for this use-case. I don't have a solid reason for why it should be done at the end at this point in time. Vijai Kumar K Henning > > > Thanks, > > Vijai Kumar K > > > > > > On Monday, December 16, 2019 at 5:20:16 PM UTC+5:30, Henning Schild > > wrote: > > > > > > From: Henning Schild > > > > > > > Users had to call a special task before switching to using > > > base-apt. With this commit you flip one switch and the repo will be > > > created as one of the first steps. > > > > > > The base-apt repo gets moved from DL_DIR to DEPLOY_DIR. It is > > > "processed" files and not just a download-cache. > > > > > > Signed-off-by: Henning Schild > > > > --- > > > doc/user_manual.md | 8 +-- > > > meta/classes/image-cache-extension.bbclass | 64 > > > ------------------ meta/classes/image.bbclass | > > > 1 - meta/classes/rootfs.bbclass | 2 +- > > > meta/conf/bitbake.conf | 4 +- > > > .../isar-bootstrap/isar-bootstrap.inc | 1 + > > > meta/recipes-devtools/base-apt/base-apt.bb | 67 > > > ++++++++++++++++--- scripts/ci_build.sh | > > > 4 +- 8 files changed, 69 insertions(+), 82 deletions(-) > > > delete mode 100644 meta/classes/image-cache-extension.bbclass > > > > > > diff --git a/doc/user_manual.md b/doc/user_manual.md > > > index 4d699bd..aaf9638 100644 > > > --- a/doc/user_manual.md > > > +++ b/doc/user_manual.md > > > @@ -822,10 +822,10 @@ path to the public key in `conf/local.conf`, > > > e.g.: BASE_REPO_KEY = > > > "file://"' ``` > > > > > > - - Trigger creation of local apt caching Debian packages during > > > image generation. > > > + - Trigger the download and caching of all required files by doing > > > a warm-up build. > > > > > > ``` > > > -bitbake -c cache_base_repo mc:qemuarm-buster:isar-image-base > > > +bitbake mc:qemuarm-buster:isar-image-base > > > ``` > > > > > > - Set `ISAR_USE_CACHED_BASE_REPO` in `conf/local.conf`: > > > @@ -835,14 +835,14 @@ bitbake -c cache_base_repo > > > mc:qemuarm-buster:isar-image-base > > > #ISAR_USE_CACHED_BASE_REPO ?= "1" > > > #BB_NO_NETWORK ?= "1" > > > ``` > > > - - Remove build artifacts to use only local base-apt: > > > + - Remove build artifacts to use only local base-apt, in fact > > > toggling ISAR_USE_CACHED_BASE_REPO should trigger a full rebuild as > > > well. This is just the way to be extra sure that only the download > > > cache is used. > > > ``` > > > sudo rm -rf tmp > > > > > > ``` > > > > > > - - Trigger again generation of image (now using local caching > > > repo): > > > + - Trigger the generation of your image again (now a local repo > > > will be created out of the download cache from the last run): > > > > > > ``` > > > bitbake mc:qemuarm-buster:isar-image-base > > > diff --git a/meta/classes/image-cache-extension.bbclass > > > b/meta/classes/image-cache-extension.bbclass > > > deleted file mode 100644 > > > index 4123326..0000000 > > > --- a/meta/classes/image-cache-extension.bbclass > > > +++ /dev/null > > > @@ -1,64 +0,0 @@ > > > -# This software is a part of ISAR. > > > -# Copyright (C) Siemens AG, 2019 > > > -# > > > -# SPDX-License-Identifier: MIT > > > -# > > > -# This class extends the image.bbclass to supply the creation of > > > cache repositories > > > - > > > -inherit repository > > > - > > > -populate_base_apt() { > > > - find "${DEBDIR}"/"${DISTRO}" -name '*\.deb' | while read > > > package; do > > > - # NOTE: due to packages stored by reprepro are not > > > modified, we can > > > - # use search by filename to check if package is already in > > > repo. In > > > - # addition, md5sums are compared to ensure that the > > > package is the > > > - # same and should not be overwritten. This method is > > > easier and more > > > - # robust than querying reprepro by name. > > > - > > > - # Check if this package is taken from Isar-apt, if so - > > > ingore it. > > > - repo_contains_package "${REPO_ISAR_DIR}/${DISTRO}" > > > "${package}" && \ > > > - continue > > > - > > > - # Check if this package is already in base-apt > > > - ret=0 > > > - repo_contains_package "${REPO_BASE_DIR}/${BASE_DISTRO}" > > > "${package}" || > > > - ret=$? > > > - [ "${ret}" = "0" ] && continue > > > - if [ "${ret}" = "1" ]; then > > > - repo_del_package "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > - "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > - "${BASE_DISTRO_CODENAME}" \ > > > - "${base_apt_p}" > > > - fi > > > - > > > - repo_add_packages "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > - "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > - "${BASE_DISTRO_CODENAME}" \ > > > - "${package}" > > > - done > > > - > > > - find "${DEBSRCDIR}"/"${DISTRO}" -name '*\.dsc' | while read > > > package; do > > > - repo_add_srcpackage "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > - "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > - "${BASE_DISTRO_CODENAME}" \ > > > - "${package}" > > > - done > > > -} > > > - > > > -do_cache_base_repo[depends] = "base-apt:do_cache_config" > > > -do_cache_base_repo[lockfiles] = "${REPO_BASE_DIR}/isar.lock" > > > -do_cache_base_repo[stamp-extra-info] = "${DISTRO}-${MACHINE}" > > > -do_cache_base_repo() { > > > - if [ -d '${BUILDCHROOT_HOST_DIR}/var/cache/apt' ] && > > > - [ '${DISTRO}' != '${HOST_DISTRO}' ]; then > > > - # We would need two separate repository paths for that. > > > - # Otherwise packages (especially the 'all' arch ones) from > > > one > > > - # distribution can influence the package versions of the > > > other > > > - # distribution. > > > - bbfatal "Different host and target distributions are > > > currently not supported." \ > > > - "Try it without cross-build." > > > - fi > > > - > > > - populate_base_apt > > > -} > > > -addtask cache_base_repo after do_rootfs do_install_imager_deps > > > diff --git a/meta/classes/image.bbclass > > > b/meta/classes/image.bbclass index b687fcf..cfd617a 100644 > > > --- a/meta/classes/image.bbclass > > > +++ b/meta/classes/image.bbclass > > > @@ -66,7 +66,6 @@ ROOTFS_MANIFEST_DEPLOY_DIR ?= > > > "${DEPLOY_DIR_IMAGE}" > > > inherit rootfs > > > inherit image-sdk-extension > > > -inherit image-cache-extension > > > inherit image-tools-extension > > > inherit image-postproc-extension > > > inherit image-locales-extension > > > diff --git a/meta/classes/rootfs.bbclass > > > b/meta/classes/rootfs.bbclass index 6d4d42c..a10e7cc 100644 > > > --- a/meta/classes/rootfs.bbclass > > > +++ b/meta/classes/rootfs.bbclass > > > @@ -151,7 +151,7 @@ rootfs_install_pkgs_install() { > > > > > > do_rootfs_install[root_cleandirs] = "${ROOTFSDIR}" > > > do_rootfs_install[vardeps] = "${ROOTFS_CONFIGURE_COMMAND} > > > ${ROOTFS_INSTALL_COMMAND}" > > > -do_rootfs_install[depends] = "isar-bootstrap-${@'target' if > > > d.getVar('ROOTFS_ARCH') == d.getVar('DISTRO_ARCH') else > > > 'host'}:do_build isar-apt:do_cache_config" > > > +do_rootfs_install[depends] = "isar-bootstrap-${@'target' if > > > d.getVar('ROOTFS_ARCH') == d.getVar('DISTRO_ARCH') else > > > 'host'}:do_build isar-apt:do_cache_config base-apt:do_cache" > > > do_rootfs_install[deptask] = "do_deploy_deb" > > > python do_rootfs_install() { > > > configure_cmds = (d.getVar("ROOTFS_CONFIGURE_COMMAND", True) > > > or "").split() > > > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf > > > index d86c5b9..e46142d 100644 > > > --- a/meta/conf/bitbake.conf > > > +++ b/meta/conf/bitbake.conf > > > @@ -80,8 +80,8 @@ REPO_ISAR_DB_DIR = "${DEPLOY_DIR}/isar-apt/db" > > > THIRD_PARTY_APT_KEYRING = "/etc/apt/trusted.gpg.d/third_party.gpg" > > > > > > # Base apt repository paths > > > -REPO_BASE_DIR = "${DL_DIR}/base-apt/${DISTRO}/apt" > > > -REPO_BASE_DB_DIR = "${DL_DIR}/base-apt/${DISTRO}/db" > > > +REPO_BASE_DIR = "${DEPLOY_DIR}/base-apt/${DISTRO}/apt" > > > +REPO_BASE_DB_DIR = "${DEPLOY_DIR}/base-apt/${DISTRO}/db" > > > > > > BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH > > > BBSERVER DL_DIR \ > > > SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME > > > SHELL TERM \ > > > diff --git a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc > > > b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc > > > index 5b14cd3..57cdea9 100644 > > > --- a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc > > > +++ b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc > > > @@ -219,6 +219,7 @@ def get_host_release(): > > > > > > do_bootstrap[vardeps] += "DISTRO_APT_PREMIRRORS" > > > do_bootstrap[dirs] = "${DEPLOY_DIR_BOOTSTRAP}" > > > +do_bootstrap[depends] = "base-apt:do_cache" > > > > > > isar_bootstrap() { > > > deb_dl_dir_import "${ROOTFSDIR}" > > > diff --git a/meta/recipes-devtools/base-apt/base-apt.bb > > > b/meta/recipes-devtools/base-apt/base-apt.bb > > > index c9a7dad..2dba779 100644 > > > --- a/meta/recipes-devtools/base-apt/base-apt.bb > > > +++ b/meta/recipes-devtools/base-apt/base-apt.bb > > > @@ -9,26 +9,77 @@ inherit repository > > > BASE_REPO_KEY ?= "" > > > KEYFILES ?= "" > > > > > > -do_cache_config[stamp-extra-info] = "${DISTRO}" > > > -do_cache_config[lockfiles] = "${REPO_BASE_DIR}/isar.lock" > > > +populate_base_apt() { > > > + find "${DEBDIR}"/"${DISTRO}" -name '*\.deb' | while read > > > package; do > > > + # NOTE: due to packages stored by reprepro are not > > > modified, we can > > > + # use search by filename to check if package is already in > > > repo. In > > > + # addition, md5sums are compared to ensure that the > > > package is the > > > + # same and should not be overwritten. This method is > > > easier and more > > > + # robust than querying reprepro by name. > > > > > > -# Generate reprepro config for current distro if it doesn't exist. > > > Once it's > > > -# generated, this task should do nothing. > > > -repo_config() { > > > + # Check if this package is taken from Isar-apt, if so - > > > ingore it. > > > + repo_contains_package "${REPO_ISAR_DIR}/${DISTRO}" > > > "${package}" && \ > > > + continue > > > + > > > + # Check if this package is already in base-apt > > > + ret=0 > > > + repo_contains_package "${REPO_BASE_DIR}/${BASE_DISTRO}" > > > "${package}" || > > > + ret=$? > > > + [ "${ret}" = "0" ] && continue > > > + if [ "${ret}" = "1" ]; then > > > + repo_del_package "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > + "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > + "${BASE_DISTRO_CODENAME}" \ > > > + "${base_apt_p}" > > > + fi > > > + > > > + repo_add_packages "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > + "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > + "${BASE_DISTRO_CODENAME}" \ > > > + "${package}" > > > + done > > > + > > > + find "${DEBSRCDIR}"/"${DISTRO}" -name '*\.dsc' | while read > > > package; do > > > + repo_add_srcpackage "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > + "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > + "${BASE_DISTRO_CODENAME}" \ > > > + "${package}" > > > + done > > > +} > > > + > > > +do_cache[stamp-extra-info] = "${DISTRO}" > > > +do_cache[lockfiles] = "${REPO_BASE_DIR}/isar.lock" > > > + > > > +repo() { > > > repo_create "${REPO_BASE_DIR}"/"${BASE_DISTRO}" \ > > > "${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \ > > > "${BASE_DISTRO_CODENAME}" \ > > > "${KEYFILES}" > > > + > > > + if [ -d '${BUILDCHROOT_HOST_DIR}/var/cache/apt' ] && > > > + [ '${DISTRO}' != '${HOST_DISTRO}' ]; then > > > + # We would need two separate repository paths for that. > > > + # Otherwise packages (especially the 'all' arch ones) from > > > one > > > + # distribution can influence the package versions of the > > > other > > > + # distribution. > > > + bbfatal "Different host and target distributions are > > > currently not supported." \ > > > + "Try it without cross-build." > > > + fi > > > + > > > + populate_base_apt > > > } > > > > > > -python do_cache_config() { > > > +python do_cache() { > > > + if not > > > bb.utils.to_boolean(d.getVar('ISAR_USE_CACHED_BASE_REPO')): > > > + return 0 > > > + > > > for key in d.getVar('BASE_REPO_KEY').split(): > > > d.appendVar("SRC_URI", " %s" % key) > > > fetcher = bb.fetch2.Fetch([key], d) > > > filename = fetcher.localpath(key) > > > d.appendVar("KEYFILES", " %s" % filename) > > > > > > - bb.build.exec_func('repo_config', d) > > > + bb.build.exec_func('repo', d) > > > } > > > > > > -addtask cache_config after do_unpack before do_build > > > +addtask cache after do_unpack before do_build > > > diff --git a/scripts/ci_build.sh b/scripts/ci_build.sh > > > index 7da3ee9..733ba86 100755 > > > --- a/scripts/ci_build.sh > > > +++ b/scripts/ci_build.sh > > > @@ -145,7 +145,7 @@ if [ -n "$REPRO_BUILD" ]; then > > > > > > # Enable use of signed cached base repository > > > echo BASE_REPO_KEY=\"file://$ISAR_TESTSUITE_GPG_PUB_KEY_FILE\" > > > >> conf/local.conf > > > - bitbake $BB_ARGS -c cache_base_repo $REPRO_TARGETS_SET_SIGNED > > > + bitbake $BB_ARGS $REPRO_TARGETS_SET_SIGNED > > > while [ -e bitbake.sock ]; do sleep 1; done > > > sudo rm -rf tmp > > > sed -i -e 's/#ISAR_USE_CACHED_BASE_REPO ?= > > > "1"/ISAR_USE_CACHED_BASE_REPO ?= "1"/g' conf/local.conf > > > @@ -159,7 +159,7 @@ if [ -n "$REPRO_BUILD" ]; then > > > sed -i -e 's/^BASE_REPO_KEY/#BASE_REPO_KEY/g' conf/local.conf > > > > > > # Enable use of unsigned cached base repository > > > - bitbake $BB_ARGS -c cache_base_repo $REPRO_TARGETS_SET > > > + bitbake $BB_ARGS $REPRO_TARGETS_SET > > > while [ -e bitbake.sock ]; do sleep 1; done > > > sudo rm -rf tmp > > > sed -i -e 's/#ISAR_USE_CACHED_BASE_REPO ?= > > > "1"/ISAR_USE_CACHED_BASE_REPO ?= "1"/g' conf/local.conf > > > -- > > > 2.24.1 > > > > > > > > > > ------=_Part_1826_612504666.1579611692678 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Hi Henning,

On Tuesday, January 21, 2020 at 3:24:20= PM UTC+5:30, Henning Schild wrote:
Hi Vijai,

On Tue, 21 Jan 2020 00:55:43 -0800
vijai kumar <vijaikumar...@gmail.com> wrote:

> Hi Henning,
>=20
> Can't we have the base-apt repo generation towards the end of = the
> build chain?

Could you go into detail why you think the point in time matters? It
was at the end because the old implementation relied on the rootfs
hopefully keeping all .debs in its cache. While that worked it was
never really robust.

And it was optional, now it just "comes for free along the way&quo= t;.
Whether you use it or not is still optional.

> Right now if you need to generate a base-apt then you need to buil= d
> twice. Once without
> ISAR_USE_CACHED_BASE_REPO and once with ISAR_USE_CACHED_BASE_REPO = set.

Still the case. You will need a second run where you tell Isar to use
that repo. Only difference its creation during the first run was
implicit instead of explicit.

> What if we could just generate the repo towards the end neverthele= ss
> and let user decide
> whether to use the repo in the subsequent build by setting=20
> ISAR_USE_CACHED_BASE_REPO?

Again, i do not see where the "point in time of the first build&qu= ot; makes
a difference. And the user still has to decide using that interface you
mention.


We are also generating base-apt for re= distribution to customers. So far
we have relied on the single-st= ep process of using cache_base_repo.

Now this has = become 2 steps for us.

Run builds for all the boar= ds and a dummy build to populate the base-apt(?).
Which very well= could be avoided if the base-apt is updated incrementally
during= subsequent builds.

I was more curious about the e= xtra step needed for this use-case.
I don't have a solid reas= on for why it should be done at the end at this point
in time.
=C2=A0
Vijai Kumar K

Henning

> Thanks,
> Vijai Kumar K
>=20
>=20
> On Monday, December 16, 2019 at 5:20:16 PM UTC+5:30, Henning Schil= d
> wrote:
> >
> > From: Henning Schild <hennin...@siemens.com <jav= ascript:>>=20
> >
> > Users had to call a special task before switching to using
> > base-apt. With this commit you flip one switch and the repo w= ill be
> > created as one of the first steps.=20
> >
> > The base-apt repo gets moved from DL_DIR to DEPLOY_DIR. It is= =20
> > "processed" files and not just a download-cache.=20
> >
> > Signed-off-by: Henning Schild <hennin...@siemens.com <javascript:>>=20
> > ---=20
> > =C2=A0doc/user_manual.md =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A08 +--= =20
> > =C2=A0meta/classes/image-cache-extension.bbclass =C2=A0 = =C2=A0| 64
> > ------------------ meta/classes/image.bbclass =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
> > 1 - meta/classes/rootfs.bbclass =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A02 +-=20
> > =C2=A0meta/conf/bitbake.conf =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A04 +-=20
> > =C2=A0.../isar-bootstrap/isar-bootstrap.inc =C2=A0 =C2= =A0 =C2=A0 =C2=A0 | =C2=A01 +=20
> > =C2=A0meta/recipes-devtools/base-apt/
base-apt.bb =C2=A0 =C2=A0| 67
> > ++++++++++++++++--- scripts/ci_build.sh =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |
> > =C2=A04 +- 8 files changed, 69 insertions(+), 82 deletions(-)= =20
> > =C2=A0delete mode 100644 meta/classes/image-cache-extens= ion.bbclass=20
> >
> > diff --git a/doc/user_manual.md b/doc/user_manual.md=20
> > index 4d699bd..aaf9638 100644=20
> > --- a/doc/user_manual.md=20
> > +++ b/doc/user_manual.md=20
> > @@ -822,10 +822,10 @@ path to the public key in `conf/local.c= onf`,
> > e.g.: BASE_REPO_KEY =3D
> > "file://<absolute_path_to_your_pub_key_file>&= quot;' ```=20
> > =C2=A0=20
> > - - Trigger creation of local apt caching Debian packages dur= ing
> > image generation.=20
> > + - Trigger the download and caching of all required files by= doing
> > a warm-up build.=20
> > =C2=A0=20
> > =C2=A0```=20
> > -bitbake -c cache_base_repo mc:qemuarm-buster:isar-image-base=20
> > +bitbake mc:qemuarm-buster:isar-image-base=20
> > =C2=A0```=20
> > =C2=A0=20
> > =C2=A0 - Set `ISAR_USE_CACHED_BASE_REPO` in `conf/local.conf`= :=20
> > @@ -835,14 +835,14 @@ bitbake -c cache_base_repo=20
> > mc:qemuarm-buster:isar-image-base=20
> > =C2=A0#ISAR_USE_CACHED_BASE_REPO ?=3D "1"=20
> > =C2=A0#BB_NO_NETWORK ?=3D "1"=20
> > =C2=A0```=20
> > - - Remove build artifacts to use only local base-apt:=20
> > + - Remove build artifacts to use only local base-apt, in fac= t
> > toggling ISAR_USE_CACHED_BASE_REPO should trigger a full rebu= ild as
> > well. This is just the way to be extra sure that only the dow= nload
> > cache is used.=20
> > =C2=A0```=20
> > =C2=A0sudo rm -rf tmp=20
> > =C2=A0=20
> > =C2=A0```=20
> > =C2=A0=20
> > - - Trigger again generation of image (now using local cachin= g
> > repo):=20
> > + - Trigger the generation of your image again (now a local r= epo
> > will be created out of the download cache from the last run):= =20
> > =C2=A0=20
> > =C2=A0```=20
> > =C2=A0bitbake mc:qemuarm-buster:isar-image-base=20
> > diff --git a/meta/classes/image-cache-extension.bbclass= =20
> > b/meta/classes/image-cache-extension.bbclass=20
> > deleted file mode 100644=20
> > index 4123326..0000000=20
> > --- a/meta/classes/image-cache-extension.bbclass=20
> > +++ /dev/null=20
> > @@ -1,64 +0,0 @@=20
> > -# This software is a part of ISAR.=20
> > -# Copyright (C) Siemens AG, 2019=20
> > -#=20
> > -# SPDX-License-Identifier: MIT=20
> > -#=20
> > -# This class extends the image.bbclass to supply the creatio= n of
> > cache repositories=20
> > -=20
> > -inherit repository=20
> > -=20
> > -populate_base_apt() {=20
> > - =C2=A0 =C2=A0find "${DEBDIR}"/"${DISTRO}&quo= t; -name '*\.deb' | while read
> > package; do=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# NOTE: due to packages stored b= y reprepro are not
> > modified, we can=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# use search by filename to chec= k if package is already in
> > repo. In=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# addition, md5sums are compared= to ensure that the
> > package is the=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# same and should not be overwri= tten. This method is
> > easier and more=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# robust than querying reprepro = by name.=20
> > -=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check if this package is taken= from Isar-apt, if so -
> > ingore it.=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_contains_package "${RE= PO_ISAR_DIR}/${DISTRO}"
> > "${package}" && \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue=20
> > -=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check if this package is alrea= dy in base-apt=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0ret=3D0=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_contains_package "${RE= PO_BASE_DIR}/${BASE_DISTRO}"=20
> > "${package}" ||=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret=3D$?=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0[ "${ret}" =3D "0= " ] && continue=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0if [ "${ret}" =3D &quo= t;1" ]; then=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_del_package &= quot;${REPO_BASE_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${BASE_DISTRO_CODENAME}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${base_apt_p}"=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0fi=20
> > -=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_add_packages "${REPO_B= ASE_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${REPO_BASE_= DB_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${BASE_DISTR= O_CODENAME}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${package}&q= uot;=20
> > - =C2=A0 =C2=A0done=20
> > -=20
> > - =C2=A0 =C2=A0find "${DEBSRCDIR}"/"${DISTRO}&= quot; -name '*\.dsc' | while read
> > package; do=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_add_srcpackage "${REPO= _BASE_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${REPO_BASE_= DB_DIR}"/"${BASE_DISTRO}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${BASE_DISTR= O_CODENAME}" \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${package}&q= uot;=20
> > - =C2=A0 =C2=A0done=20
> > -}=20
> > -=20
> > -do_cache_base_repo[depends] =3D "base-apt:do_cache_conf= ig"=20
> > -do_cache_base_repo[lockfiles] =3D "${REPO_BASE_DIR}/isa= r.lock"=20
> > -do_cache_base_repo[stamp-extra-info] =3D "${DISTRO= }-${MACHINE}"=20
> > -do_cache_base_repo() {=20
> > - =C2=A0 =C2=A0if [ -d '${BUILDCHROOT_HOST_DIR}/var/= cache/apt' ] &&=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0[ '${DISTRO}' !=3D '= ${HOST_DISTRO}' ]; then=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# We would need two separate rep= ository paths for that.=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# Otherwise packages (especially= the 'all' arch ones) from
> > one=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# distribution can influence the= package versions of the
> > other=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0# distribution.=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0bbfatal "Different host and= target distributions are
> > currently not supported." \=20
> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;Try it without cross-build."=20
> > - =C2=A0 =C2=A0fi=20
> > -=20
> > - =C2=A0 =C2=A0populate_base_apt=20
> > -}=20
> > -addtask cache_base_repo after do_rootfs do_install_imager_de= ps=20
> > diff --git a/meta/classes/image.bbclass
> > b/meta/classes/image.bbclass index b687fcf..cfd617a 100644=20
> > --- a/meta/classes/image.bbclass=20
> > +++ b/meta/classes/image.bbclass=20
> > @@ -66,7 +66,6 @@ ROOTFS_MANIFEST_DEPLOY_DIR ?=3D
> > "${DEPLOY_DIR_IMAGE}"=20
> > =C2=A0inherit rootfs=20
> > =C2=A0inherit image-sdk-extension=20
> > -inherit image-cache-extension=20
> > =C2=A0inherit image-tools-extension=20
> > =C2=A0inherit image-postproc-extension=20
> > =C2=A0inherit image-locales-extension=20
> > diff --git a/meta/classes/rootfs.bbclass
> > b/meta/classes/rootfs.bbclass index 6d4d42c..a10e7cc 100644= =20
> > --- a/meta/classes/rootfs.bbclass=20
> > +++ b/meta/classes/rootfs.bbclass=20
> > @@ -151,7 +151,7 @@ rootfs_install_pkgs_install() {=20
> > =C2=A0=20
> > =C2=A0do_rootfs_install[root_cleandirs] =3D "${ROOT= FSDIR}"=20
> > =C2=A0do_rootfs_install[vardeps] =3D "${ROOTFS_CONFIGURE= _COMMAND}=20
> > ${ROOTFS_INSTALL_COMMAND}"=20
> > -do_rootfs_install[depends] =3D "isar-bootstrap-${@'= target' if=20
> > d.getVar('ROOTFS_ARCH') =3D=3D d.getVar('DISTRO_A= RCH') else
> > 'host'}:do_build isar-apt:do_cache_config"=20
> > +do_rootfs_install[depends] =3D "isar-bootstrap-${@'= target' if=20
> > d.getVar('ROOTFS_ARCH') =3D=3D d.getVar('DISTRO_A= RCH') else
> > 'host'}:do_build isar-apt:do_cache_config base-apt:do= _cache"=20
> > =C2=A0do_rootfs_install[deptask] =3D "do_deploy_deb"= ;=20
> > =C2=A0python do_rootfs_install() {=20
> > =C2=A0 =C2=A0 =C2=A0configure_cmds =3D (d.getVar("ROOTFS= _CONFIGURE_COMMAND", True)
> > or "").split()=20
> > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf= =20
> > index d86c5b9..e46142d 100644=20
> > --- a/meta/conf/bitbake.conf=20
> > +++ b/meta/conf/bitbake.conf=20
> > @@ -80,8 +80,8 @@ REPO_ISAR_DB_DIR =3D "${DEPLOY_DIR}/is= ar-apt/db"=20
> > =C2=A0THIRD_PARTY_APT_KEYRING =3D "/etc/apt/trusted.gpg.= d/third_party.gpg"=20
> > =C2=A0=20
> > =C2=A0# Base apt repository paths=20
> > -REPO_BASE_DIR =3D "${DL_DIR}/base-apt/${DISTRO}/ap= t"=20
> > -REPO_BASE_DB_DIR =3D "${DL_DIR}/base-apt/${DISTRO}/db"=20
> > +REPO_BASE_DIR =3D "${DEPLOY_DIR}/base-apt/${DISTRO= }/apt"=20
> > +REPO_BASE_DB_DIR =3D "${DEPLOY_DIR}/base-apt/${DIS= TRO}/db"=20
> > =C2=A0=20
> > =C2=A0BB_HASHBASE_WHITELIST ?=3D "TMPDIR FILE PATH PWD B= B_TASKHASH BBPATH=20
> > BBSERVER DL_DIR \=20
> > =C2=A0 =C2=A0 =C2=A0SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_D= IRNAME HOME LOGNAME
> > SHELL TERM \=20
> > diff --git a/meta/recipes-core/isar-bootstrap/isar-boots= trap.inc=20
> > b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc=20
> > index 5b14cd3..57cdea9 100644=20
> > --- a/meta/recipes-core/isar-bootstrap/isar-bootstrap.in= c=20
> > +++ b/meta/recipes-core/isar-bootstrap/isar-bootstrap.in= c=20
> > @@ -219,6 +219,7 @@ def get_host_release():=20
> > =C2=A0=20
> > =C2=A0do_bootstrap[vardeps] +=3D "DISTRO_APT_PREMIRRORS&= quot;=20
> > =C2=A0do_bootstrap[dirs] =3D "${DEPLOY_DIR_BOOTSTRAP}&qu= ot;=20
> > +do_bootstrap[depends] =3D "base-apt:do_cache"=20
> > =C2=A0=20
> > =C2=A0isar_bootstrap() {=20
> > =C2=A0 =C2=A0 =C2=A0deb_dl_dir_import "${ROOTFSDIR}"= ;=20
> > diff --git a/meta/recipes-devtools/base-apt/base-apt.bb=20
> > b/meta/recipes-devtools/base-apt/base-apt.bb=20
> > index c9a7dad..2dba779 100644=20
> > --- a/meta/recipes-devtools/base-apt/base-apt.bb=20
> > +++ b/meta/recipes-devtools/base-apt/base-apt.bb=20
> > @@ -9,26 +9,77 @@ inherit repository=20
> > =C2=A0BASE_REPO_KEY ?=3D ""=20
> > =C2=A0KEYFILES ?=3D ""=20
> > =C2=A0=20
> > -do_cache_config[stamp-extra-info] =3D "${DISTRO}&q= uot;=20
> > -do_cache_config[lockfiles] =3D "${REPO_BASE_DIR}/isar.l= ock"=20
> > +populate_base_apt() {=20
> > + =C2=A0 =C2=A0find "${DEBDIR}"/"${DISTRO}&quo= t; -name '*\.deb' | while read
> > package; do=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# NOTE: due to packages stored b= y reprepro are not
> > modified, we can=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# use search by filename to chec= k if package is already in
> > repo. In=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# addition, md5sums are compared= to ensure that the
> > package is the=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# same and should not be overwri= tten. This method is
> > easier and more=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# robust than querying reprepro = by name.=20
> > =C2=A0=20
> > -# Generate reprepro config for current distro if it doesn= 9;t exist.
> > Once it's=20
> > -# generated, this task should do nothing.=20
> > -repo_config() {=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check if this package is taken= from Isar-apt, if so -
> > ingore it.=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_contains_package "${RE= PO_ISAR_DIR}/${DISTRO}"
> > "${package}" && \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue=20
> > +=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check if this package is alrea= dy in base-apt=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret=3D0=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_contains_package "${RE= PO_BASE_DIR}/${BASE_DISTRO}"=20
> > "${package}" ||=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret=3D$?=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0[ "${ret}" =3D "0= " ] && continue=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if [ "${ret}" =3D &quo= t;1" ]; then=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_del_package &= quot;${REPO_BASE_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${REPO_BASE_DB_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${BASE_DISTRO_CODENAME}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;${base_apt_p}"=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0fi=20
> > +=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_add_packages "${REPO_B= ASE_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${REPO_BASE_= DB_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${BASE_DISTR= O_CODENAME}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${package}&q= uot;=20
> > + =C2=A0 =C2=A0done=20
> > +=20
> > + =C2=A0 =C2=A0find "${DEBSRCDIR}"/"${DISTRO}&= quot; -name '*\.dsc' | while read
> > package; do=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0repo_add_srcpackage "${REPO= _BASE_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${REPO_BASE_= DB_DIR}"/"${BASE_DISTRO}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${BASE_DISTR= O_CODENAME}" \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${package}&q= uot;=20
> > + =C2=A0 =C2=A0done=20
> > +}=20
> > +=20
> > +do_cache[stamp-extra-info] =3D "${DISTRO}"=20
> > +do_cache[lockfiles] =3D "${REPO_BASE_DIR}/isar.lock&quo= t;=20
> > +=20
> > +repo() {=20
> > =C2=A0 =C2=A0 =C2=A0repo_create "${REPO_BASE_DIR}"/= "${BASE_DISTRO}" \=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${REPO_BASE_DB_DIR}&q= uot;/"${BASE_DISTRO}" \=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${BASE_DISTRO_CODENAM= E}" \=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"${KEYFILES}"=20
> > +=20
> > + =C2=A0 =C2=A0if [ -d '${BUILDCHROOT_HOST_DIR}/var/= cache/apt' ] &&=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0[ '${DISTRO}' !=3D '= ${HOST_DISTRO}' ]; then=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# We would need two separate rep= ository paths for that.=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# Otherwise packages (especially= the 'all' arch ones) from
> > one=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# distribution can influence the= package versions of the
> > other=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0# distribution.=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0bbfatal "Different host and= target distributions are
> > currently not supported." \=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quo= t;Try it without cross-build."=20
> > + =C2=A0 =C2=A0fi=20
> > +=20
> > + =C2=A0 =C2=A0populate_base_apt=20
> > =C2=A0}=20
> > =C2=A0=20
> > -python do_cache_config() {=20
> > +python do_cache() {=20
> > + =C2=A0 =C2=A0if not
> > bb.utils.to_boolean(d.getVar('ISAR_USE_CACHED_BASE_R= EPO')):=20
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0=20
> > +=20
> > =C2=A0 =C2=A0 =C2=A0for key in d.getVar('BASE_REPO_KEY= 9;).split():=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d.appendVar("SRC_URI&q= uot;, " %s" % key)=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fetcher =3D bb.fetch2.Fetch= ([key], d)=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0filename =3D fetcher.localp= ath(key)=20
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d.appendVar("KEYFILES&= quot;, " %s" % filename)=20
> > =C2=A0=20
> > - =C2=A0 =C2=A0bb.build.exec_func('repo_config',= d)=20
> > + =C2=A0 =C2=A0bb.build.exec_func('repo', d)=20
> > =C2=A0}=20
> > =C2=A0=20
> > -addtask cache_config after do_unpack before do_build=20
> > +addtask cache after do_unpack before do_build=20
> > diff --git a/scripts/ci_build.sh b/scripts/ci_build.sh=20
> > index 7da3ee9..733ba86 100755=20
> > --- a/scripts/ci_build.sh=20
> > +++ b/scripts/ci_build.sh=20
> > @@ -145,7 +145,7 @@ if [ -n "$REPRO_BUILD" ]; then= =20
> > =C2=A0=20
> > =C2=A0 =C2=A0 =C2=A0# Enable use of signed cached base reposi= tory=20
> > =C2=A0 =C2=A0 =C2=A0echo BASE_REPO_KEY=3D\"file://$ISAR_= TESTSUITE_GPG_PUB_KEY_FILE\"
> > >> conf/local.conf=20
> > - =C2=A0 =C2=A0bitbake $BB_ARGS -c cache_base_repo $REPRO_TAR= GETS_SET_SIGNED=20
> > + =C2=A0 =C2=A0bitbake $BB_ARGS $REPRO_TARGETS_SET_SIGNED=20
> > =C2=A0 =C2=A0 =C2=A0while [ -e bitbake.sock ]; do sleep 1; do= ne=20
> > =C2=A0 =C2=A0 =C2=A0sudo rm -rf tmp=20
> > =C2=A0 =C2=A0 =C2=A0sed -i -e 's/#ISAR_USE_CACHED_BASE_RE= PO ?=3D=20
> > "1"/ISAR_USE_CACHED_BASE_REPO ?=3D "1"/g&= #39; conf/local.conf=20
> > @@ -159,7 +159,7 @@ if [ -n "$REPRO_BUILD" ]; then= =20
> > =C2=A0 =C2=A0 =C2=A0sed -i -e 's/^BASE_REPO_KEY/#BASE_REP= O_KEY/g' conf/local.conf=20
> > =C2=A0=20
> > =C2=A0 =C2=A0 =C2=A0# Enable use of unsigned cached base repo= sitory=20
> > - =C2=A0 =C2=A0bitbake $BB_ARGS -c cache_base_repo $REPRO_TAR= GETS_SET=20
> > + =C2=A0 =C2=A0bitbake $BB_ARGS $REPRO_TARGETS_SET=20
> > =C2=A0 =C2=A0 =C2=A0while [ -e bitbake.sock ]; do sleep 1; do= ne=20
> > =C2=A0 =C2=A0 =C2=A0sudo rm -rf tmp=20
> > =C2=A0 =C2=A0 =C2=A0sed -i -e 's/#ISAR_USE_CACHED_BASE_RE= PO ?=3D=20
> > "1"/ISAR_USE_CACHED_BASE_REPO ?=3D "1"/g&= #39; conf/local.conf=20
> > --=20
> > 2.24.1=20
> >
> > =C2=A0
>=20

------=_Part_1826_612504666.1579611692678-- ------=_Part_1825_1083405080.1579611692677--