use stage dir for buildcache create (#36091)

This commit is contained in:
Harmen Stoppels 2023-03-14 09:35:47 +01:00 committed by GitHub
parent 5bae742826
commit f7da7db9b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -42,6 +42,7 @@
import spack.platforms import spack.platforms
import spack.relocate as relocate import spack.relocate as relocate
import spack.repo import spack.repo
import spack.stage
import spack.store import spack.store
import spack.traverse as traverse import spack.traverse as traverse
import spack.util.crypto import spack.util.crypto
@ -1218,15 +1219,37 @@ def _build_tarball(
if not spec.concrete: if not spec.concrete:
raise ValueError("spec must be concrete to build tarball") raise ValueError("spec must be concrete to build tarball")
# set up some paths with tempfile.TemporaryDirectory(dir=spack.stage.get_stage_root()) as tmpdir:
tmpdir = tempfile.mkdtemp() _build_tarball_in_stage_dir(
cache_prefix = build_cache_prefix(tmpdir) spec,
out_url,
stage_dir=tmpdir,
force=force,
relative=relative,
unsigned=unsigned,
allow_root=allow_root,
key=key,
regenerate_index=regenerate_index,
)
def _build_tarball_in_stage_dir(
spec,
out_url,
stage_dir,
force=False,
relative=False,
unsigned=False,
allow_root=False,
key=None,
regenerate_index=False,
):
cache_prefix = build_cache_prefix(stage_dir)
tarfile_name = tarball_name(spec, ".spack") tarfile_name = tarball_name(spec, ".spack")
tarfile_dir = os.path.join(cache_prefix, tarball_directory_name(spec)) tarfile_dir = os.path.join(cache_prefix, tarball_directory_name(spec))
tarfile_path = os.path.join(tarfile_dir, tarfile_name) tarfile_path = os.path.join(tarfile_dir, tarfile_name)
spackfile_path = os.path.join(cache_prefix, tarball_path_name(spec, ".spack")) spackfile_path = os.path.join(cache_prefix, tarball_path_name(spec, ".spack"))
remote_spackfile_path = url_util.join(out_url, os.path.relpath(spackfile_path, tmpdir)) remote_spackfile_path = url_util.join(out_url, os.path.relpath(spackfile_path, stage_dir))
mkdirp(tarfile_dir) mkdirp(tarfile_dir)
if web_util.url_exists(remote_spackfile_path): if web_util.url_exists(remote_spackfile_path):
@ -1245,7 +1268,7 @@ def _build_tarball(
signed_specfile_path = "{0}.sig".format(specfile_path) signed_specfile_path = "{0}.sig".format(specfile_path)
remote_specfile_path = url_util.join( remote_specfile_path = url_util.join(
out_url, os.path.relpath(specfile_path, os.path.realpath(tmpdir)) out_url, os.path.relpath(specfile_path, os.path.realpath(stage_dir))
) )
remote_signed_specfile_path = "{0}.sig".format(remote_specfile_path) remote_signed_specfile_path = "{0}.sig".format(remote_specfile_path)
@ -1261,7 +1284,7 @@ def _build_tarball(
raise NoOverwriteException(url_util.format(remote_specfile_path)) raise NoOverwriteException(url_util.format(remote_specfile_path))
pkg_dir = os.path.basename(spec.prefix.rstrip(os.path.sep)) pkg_dir = os.path.basename(spec.prefix.rstrip(os.path.sep))
workdir = os.path.join(tmpdir, pkg_dir) workdir = os.path.join(stage_dir, pkg_dir)
# TODO: We generally don't want to mutate any files, but when using relative # TODO: We generally don't want to mutate any files, but when using relative
# mode, Spack unfortunately *does* mutate rpaths and links ahead of time. # mode, Spack unfortunately *does* mutate rpaths and links ahead of time.
@ -1285,14 +1308,10 @@ def _build_tarball(
# optionally make the paths in the binaries relative to each other # optionally make the paths in the binaries relative to each other
# in the spack install tree before creating tarball # in the spack install tree before creating tarball
try:
if relative: if relative:
make_package_relative(workdir, spec, buildinfo, allow_root) make_package_relative(workdir, spec, buildinfo, allow_root)
elif not allow_root: elif not allow_root:
ensure_package_relocatable(buildinfo, binaries_dir) ensure_package_relocatable(buildinfo, binaries_dir)
except Exception as e:
shutil.rmtree(tmpdir)
tty.die(e)
_do_create_tarball(tarfile_path, binaries_dir, pkg_dir, buildinfo) _do_create_tarball(tarfile_path, binaries_dir, pkg_dir, buildinfo)
@ -1341,18 +1360,15 @@ def _build_tarball(
tty.debug('Buildcache for "{0}" written to \n {1}'.format(spec, remote_spackfile_path)) tty.debug('Buildcache for "{0}" written to \n {1}'.format(spec, remote_spackfile_path))
try:
# push the key to the build cache's _pgp directory so it can be # push the key to the build cache's _pgp directory so it can be
# imported # imported
if not unsigned: if not unsigned:
push_keys(out_url, keys=[key], regenerate_index=regenerate_index, tmpdir=tmpdir) push_keys(out_url, keys=[key], regenerate_index=regenerate_index, tmpdir=stage_dir)
# create an index.json for the build_cache directory so specs can be # create an index.json for the build_cache directory so specs can be
# found # found
if regenerate_index: if regenerate_index:
generate_package_index(url_util.join(out_url, os.path.relpath(cache_prefix, tmpdir))) generate_package_index(url_util.join(out_url, os.path.relpath(cache_prefix, stage_dir)))
finally:
shutil.rmtree(tmpdir)
return None return None