mirror of
				https://github.com/flatcar/scripts.git
				synced 2025-10-25 14:21:36 +02:00 
			
		
		
		
	- Tighten the patterns used for nightly tags detection.
- Compare hashes instead of names to figure out if we are on top of a
  branch (fixes the issue of no nightly tags reachable from the
  release branches). Jenkins is doing `git fetch origin "${branch}";
  git checkout FETCH_HEAD` and this was confusing the `git rev-parse
  --abbrev-ref HEAD` code (it returned `HEAD` instead of `${branch}`).
- Account for possible multiple tags in a single commit.
- Made the tagging fail in dubious situations.
- Reindent the code, modernize a bit.
		
	
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| #
 | |
| # Copyright (c) 2021 The Flatcar Maintainers.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| # >>> This file is supposed to be SOURCED from the repository ROOT. <<<
 | |
| #
 | |
| # packages_tag() should be called w/ the positional INPUT parameters below.
 | |
| 
 | |
| # build tag automation stub.
 | |
| #   This script will update the versionfile with the OS packages version to build,
 | |
| #    and will add a version tag (see INPUT) to the scripts repo.
 | |
| #
 | |
| # PREREQUISITES:
 | |
| #
 | |
| #   1. SDK version is recorded in sdk_container/.repo/manifests/version.txt
 | |
| #   2. SDK container is either
 | |
| #       - available via ghcr.io/flatcar/flatcar-sdk-[ARCH]:[VERSION] (official SDK release)
 | |
| #       OR
 | |
| #       - available via build cache server "/containers/[VERSION]/flatcar-sdk-[ARCH]-[VERSION].tar.gz"
 | |
| #         (dev SDK)
 | |
| #
 | |
| # INPUT:
 | |
| #
 | |
| #   1. Version of the TARGET OS image to build (string).
 | |
| #       The version pattern '(alpha|beta|stable|lts)-MMMM.m.p' (e.g. 'alpha-3051.0.0')
 | |
| #         denotes a "official" build, i.e. a release build to be published.
 | |
| #       Use any version diverging from the pattern (e.g. 'alpha-3051.0.0-nightly-4302') for development / CI builds.
 | |
| #       A tag of this version will be created in the scripts repo and pushed upstream.
 | |
| #
 | |
| #
 | |
| # OPTIONAL INPUT:
 | |
| #
 | |
| #   1. A file ../scripts.patch to apply with "git am -3" for the scripts repo.
 | |
| #
 | |
| #   2. AVOID_NIGHTLY_BUILD_SHORTCUTS. Environment variable. Tells the script to build the SDK even if nothing has changed since last nightly build.
 | |
| #        See the description in ci-config.env.
 | |
| #
 | |
| # OUTPUT:
 | |
| #
 | |
| #   1. Updated scripts repository
 | |
| #        - version tag
 | |
| #        - sdk_container/.repo/manifests/version.txt denotes new FLATCAR OS version
 | |
| #   2. "./skip-build" as flag file to signal that the build should stop
 | |
| 
 | |
| function packages_tag() {
 | |
|     # Run a subshell, so the traps, environment changes and global
 | |
|     # variables are not spilled into the caller.
 | |
|     (
 | |
|         set -euo pipefail
 | |
| 
 | |
|         _packages_tag_impl "${@}"
 | |
|     )
 | |
| }
 | |
| # --
 | |
| 
 | |
| function _packages_tag_impl() {
 | |
|     local version=${1}
 | |
| 
 | |
|     source ci-automation/ci_automation_common.sh
 | |
|     source ci-automation/gpg_setup.sh
 | |
| 
 | |
|     check_version_string "${version}"
 | |
| 
 | |
|     source sdk_container/.repo/manifests/version.txt
 | |
|     local sdk_version=${FLATCAR_SDK_VERSION}
 | |
| 
 | |
|     if [[ -n ${CIA_DEBUGTESTRUN:-} ]]; then
 | |
|         set -x
 | |
|     fi
 | |
|     # Create new tag in scripts repo w/ updated versionfile
 | |
|     # Also push the changes to the branch ONLY IF we're doing a nightly
 | |
|     #   build of the 'flatcar-MAJOR' branch AND we're definitely ON the respective branch
 | |
|     local target_branch=''
 | |
|     # These variables are here to make it easier to test nightly
 | |
|     # builds without messing with actual release branches.
 | |
|     local flatcar_branch_prefix=${CIA_DEBUGFLATCARBRANCHPREFIX:-flatcar}
 | |
|     local nightly=${CIA_DEBUGNIGHTLY:-nightly}
 | |
|     # Matches the usual nightly tag name (stable-1234.2.3-nightly-yyyymmdd-hhmm)
 | |
|     local nightly_pattern='^(stable|alpha|beta|lts)-([0-9]+)(\.[0-9]+){2}-'"${nightly}"'-[0-9]{8}-[0-9]{4}$'
 | |
|     local -i major_version=0
 | |
|     local branch_name=''
 | |
|     local branch_hash=''
 | |
|     if [[ ${version} =~ ${nightly_pattern} ]]; then
 | |
|         major_version=${BASH_REMATCH[2]}
 | |
|         branch_name=${flatcar_branch_prefix}-${major_version}
 | |
|         branch_hash=$(git rev-parse "origin/${branch_name}")
 | |
|     fi
 | |
|     local -a existing_tags=()
 | |
|     if [[ -n ${branch_hash} ]]; then
 | |
|         if [[ $(git rev-parse HEAD) != "${branch_hash}" ]]; then
 | |
|             echo "We are doing a nightly build but we are not on top of the ${branch_name} branch. This is wrong and would result in the nightly tag not being a part of the branch." >&2
 | |
|             exit 1
 | |
|         fi
 | |
|         target_branch=${branch_name}
 | |
|         # Check for the existing tag only when we allow shortcutting
 | |
|         # the builds. That way we can skip the checks for build
 | |
|         # shortcutting.
 | |
|         if bool_is_true "${AVOID_NIGHTLY_BUILD_SHORTCUTS}"; then
 | |
|             echo "Continuing the build because AVOID_NIGHTLY_BUILD_SHORTCUTS is bool true (${AVOID_NIGHTLY_BUILD_SHORTCUTS})" >&2
 | |
|         else
 | |
|             git fetch --all --tags --force
 | |
|             # exit code of git tag is always 0; output may be empty,
 | |
|             # but may also have multiple tags
 | |
|             mapfile -t existing_tags < <(git tag --points-at HEAD)
 | |
|         fi
 | |
|     fi
 | |
|     local nightly_or_release_tag=''
 | |
|     if [[ major_version -gt 0 && ${#existing_tags[@]} -gt 0 ]]; then
 | |
|         local nightly_or_release_pattern='^(stable|alpha|beta|lts)-'"${major_version}"'(\.[0-9]+){2}(-'"${nightly}"'-[0-9]{8}-[0-9]{4})?$'
 | |
|         local tag
 | |
|         for tag in "${existing_tags[@]}"; do
 | |
|             if [[ ${tag} =~ ${nightly_or_release_pattern} ]]; then
 | |
|                 nightly_or_release_tag=${tag}
 | |
|                 break
 | |
|             fi
 | |
|         done
 | |
|     fi
 | |
|     # If the found tag is a release or nightly tag, we stop this build
 | |
|     # if there are no changes and the relevant images can be found in
 | |
|     # bincache.
 | |
|     if [[ -n ${nightly_or_release_tag} ]]; then
 | |
|         local -i ret=0
 | |
|         git diff --exit-code --quiet "${nightly_or_release_tag}" || ret=$?
 | |
|         if [[ ret -eq 0 ]]; then
 | |
|             # no changes in the code, but check if images exist (they
 | |
|             # could be missing if build failed)
 | |
|             if check_bincache_images_existence \
 | |
|                    "https://${BUILDCACHE_SERVER}/images/amd64/${FLATCAR_VERSION}/flatcar_production_image.bin.bz2" \
 | |
|                    "https://${BUILDCACHE_SERVER}/images/arm64/${FLATCAR_VERSION}/flatcar_production_image.bin.bz2"; then
 | |
|                 touch ./skip-build
 | |
|                 echo "Creating ./skip-build flag file, indicating that the build must not to continue because no new tag got created as there are no changes since tag ${nightly_or_release_tag} and the Flatcar images exist" >&2
 | |
|                 return 0
 | |
|             fi
 | |
|             echo "No changes but continuing build because Flatcar images do not exist"
 | |
|         elif [[ ret -eq 1 ]]; then
 | |
|             echo "HEAD is tagged with a nightly tag and yet there a differences? This is fishy and needs to be investigated. Maybe you forgot to commit your changes?" >&2
 | |
|             exit 1
 | |
|         else
 | |
|             echo "Error: Unexpected git diff return code (${ret})" >&2
 | |
|             return 1
 | |
|         fi
 | |
|     fi
 | |
|     if [[ -n ${CIA_DEBUGTESTRUN:-} ]]; then
 | |
|         set +x
 | |
|     fi
 | |
| 
 | |
|     # Create version file
 | |
|     (
 | |
|         source sdk_lib/sdk_container_common.sh
 | |
|         create_versionfile "${sdk_version}" "${version}"
 | |
|     )
 | |
|     if [[ -n ${CIA_DEBUGTESTRUN:-} ]]; then
 | |
|         set -x
 | |
|     fi
 | |
|     update_and_push_version "${version}" "${target_branch}"
 | |
|     if [[ -n ${CIA_DEBUGTESTRUN:-} ]]; then
 | |
|         exit 0
 | |
|     fi
 | |
|     apply_local_patches
 | |
| }
 | |
| # --
 |