jenkins-pipelines/scripts/archive-misc.sh
Davlet Panech 0a297aae9d build.conf: new parameter ARCHIVE_BIG_DIRS
New configuration ARCHIVE_BIG_DIRS to hardlink, copy or symlink the
bigger directories, "mirrors", "aptly" and "docker", when archiving
them to /localdisk/loadbuild.

This option can take on these values:

* checksum-hardlink (default): hardlink files with identical files
  from previous builds' archive directories. Look for StxChecksums
  files in older builds' directories to determine whether the files
  are identical.
* checksum-copy: really copy the files
* top-symlink: create a top-level symlink, such as
  $BUILD_OUTPUT_HOME/mirrors that points to $BUILD_HOME/mirrors

This option also accepts a space-separated list of "dir:method"
pairs, eg:

  checksum-hardlink mirrors:top-symlink

means "use the hardlink method by default, but for mirros/ use the
top-symlink method". The last specification in the list takes
precedence in case of multiple matches.

The default behavior, when this option is empty or missing in
build.conf, is "checksum-hardlink".

New script: helpers/archive-dir.sh, executed as root within a docker
container during the build.

TESTS
=====================================

* Call "archive-misc.sh" manually in various ways and check the output

* Jenkins build + ARCHIVE_BIG_DIRS="checksum-hardlink"
  - Run a full build and make sure most files are copied, but the
    files common between mirrors and aptly (4rd-party DEBs) are
    hardlinked
  - Run a second build and make sure all files are hardlinked
  - Add a dummy change to "build-info", rebuild it, then make sure
    that package is copied, but all other files are hardlinked

* Jenkins build + ARCHIVE_BIG_DIRS commented out
  - Make sure Jenkins creates the hardlinks

Story: 2010226
Task: 47860

Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
Change-Id: I604f840007b79461b5a48dcc4c21fc6316de9a52
2023-04-24 14:24:45 -04:00

169 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright (c) 2022 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# Archive evrything except:
# - symlinks that point to $BUILD_OUTPUT_HOME
# - localdisk/deploy/ which is archive separately by archive-iso.sh
# - large temp dirs left behind by ostree
#
set -e
THIS_DIR="$(readlink -f "$(dirname "$0")")"
source "$THIS_DIR"/lib/job_utils.sh
source "$THIS_DIR"/lib/publish_utils.sh
load_build_env
notice "archiving misc files"
#VERBOSE_ARG="--verbose"
exclude_args=()
exclude_args+=(--exclude "/localdisk/designer/**") # symlink inside
exclude_args+=(--exclude "/aptly") # see below
exclude_args+=(--exclude "/mirrors") # see below
exclude_args+=(--exclude "/docker") # see below
exclude_args+=(--exclude "/workspace") # symlink
exclude_args+=(--exclude "/repo") # symlink
exclude_args+=(--exclude "/localdisk/workdir/**") # ostree temp files
exclude_args+=(--exclude "/localdisk/sub_workdir/workdir/**") # ostree temp files
exclude_args+=(--exclude "/localdisk/deploy/**") # archived by archive-iso.sh
mkdir -p "$BUILD_OUTPUT_HOME"
safe_copy_dir $DRY_RUN_ARG $VERBOSE_ARG \
"${exclude_args[@]}" \
"$BUILD_HOME/" "$BUILD_OUTPUT_HOME/"
print_regfile_name_if_exists() {
if [[ -f "$1" ]] ; then
echo "$1"
fi
}
find_old_archive_dirs() {
find "$BUILD_OUTPUT_ROOT" -mindepth 1 -maxdepth 1 -type d \! -name "$TIMESTAMP" \
-regextype posix-extended -regex '.*/[0-9]{4,}[^/]*$'
}
find_old_checksum_files__mirrors() {
local archive_dir package_dir
find_old_archive_dirs | while read archive_dir ; do
print_regfile_name_if_exists "$archive_dir/mirrors/$CHECKSUMS_FILENAME"
print_regfile_name_if_exists "$archive_dir/aptly/$CHECKSUMS_FILENAME"
done
check_pipe_status
}
find_old_checksum_files__aptly() {
find_old_checksum_files__mirrors
}
find_old_checksum_files__docker() {
local archive_dir
find_old_archive_dirs | while read archive_dir ; do
print_regfile_name_if_exists "$archive_dir/docker/$CHECKSUMS_FILENAME"
done
check_pipe_status
}
# Usage: do_archive_dir DIR_ID [EXTRA_CHECKSUMS_FILE...]
#
# DIR_ID is "mirrors" "docker" or "aptly"
#
# Example:
#
# # archive mirrors/
# do_archive_dir "mirrors"
#
# # archive aptly/ , but also consider files archived under "mirrors" by the
# # the previous line for hardlinking
# do_archive_dir "aptly" "$BUILD_OUTPUT_HOME/mirrors/StxChecksums"
#
do_archive_dir() {
local id="$1" ; shift || :
local dir="$id"
local spec
local spec_id spec_metod
notice "archiving $id"
# ARCHIVE_BIG_DIRS contains a space-separated list of "method"
# or "dir:method" pairs, eg:
# "top-symlink aptly:shecksum-hardlink",
spec_method="checksum-hardlink"
for spec in $ARCHIVE_BIG_DIRS ; do
if [[ "$spec" =~ : ]] ; then
spec_id="${spec%%:*}"
if [[ "$spec_id" == "$id" ]] ; then
spec_method="${spec#*:}"
fi
continue
fi
spec_method="$spec"
done
info "dir=$dir method=$spec_method"
case "$spec_method" in
top-symlink)
if [[ -e "$BUILD_HOME/$dir" ]] ; then
if [[ -e "$BUILD_OUTPUT_HOME/$dir" && -d "$BUILD_OUTPUT_HOME/$dir" ]] ; then
safe_rm $DRY_RUN_ARG "$BUILD_OUTPUT_HOME/$dir"
fi
maybe_run ln -sfn "$BUILD_HOME/$dir" "$BUILD_OUTPUT_HOME/$dir"
fi
;;
checksum-hardlink|checksum-copy)
if [[ -e "$BUILD_HOME/$dir" ]] ; then
if [[ -e "$BUILD_OUTPUT_HOME/$dir" ]] ; then
safe_rm "$BUILD_OUTPUT_HOME/$dir"
fi
tmp_dir="$BUILD_HOME/tmp/archive-misc"
mkdir -p "$tmp_dir/$id"
cp -a "$THIS_DIR/helpers/archive-dir.sh" "$tmp_dir/"
local archive_args=()
if [[ "$spec_method" == "checksum-hardlink" ]] ; then
local old_checksums_file_list="$tmp_dir/$id/old_checksums_file.list"
local find_func=find_old_checksum_files__$id
$find_func >"$old_checksums_file_list"
archive_args+=("--checksum-hardlink" "$old_checksums_file_list")
local extra_checksums_file
for extra_checksums_file in "$@" ; do
print_regfile_name_if_exists "$extra_checksums_file"
done >>"$old_checksums_file_list"
fi
#local egid
#egid=$(id -g)
#archive_args+=(--owner "$EUID" --group "$egid")
local src_dir="$BUILD_HOME/$dir"
local dst_dir="$BUILD_OUTPUT_HOME/$dir"
maybe_run mkdir -p "$dst_dir"
safe_docker_run $DRY_RUN_ARG --writeable-archive-root --rm "$COREUTILS_DOCKER_IMG" "$tmp_dir/archive-dir.sh" \
"${archive_args[@]}" \
-j ${BUILD_PACKAGES_PARALLEL_JOBS:-1} \
--output-checksums "$BUILD_OUTPUT_HOME/$dir/$CHECKSUMS_FILENAME" \
"$src_dir" \
"$dst_dir" \
"$tmp_dir/$id"
fi
;;
*)
die "ARCHIVE_BIG_DIRS: invalid copy method \"$spec_method\": expecting \"top_symlink\", \"checksum-hardlink\" or \"checksum-copy\""
;;
esac
}
do_archive_dir "mirrors"
do_archive_dir "aptly" "$BUILD_OUTPUT_HOME/mirrors/$CHECKSUMS_FILENAME"
do_archive_dir "docker"