From f935771a531d3f7ae44e10675560b219ed1955d1 Mon Sep 17 00:00:00 2001 From: Dmitry Burmistrov Date: Wed, 15 Jun 2016 11:07:10 +0300 Subject: [PATCH] [build] Implement hotfix workflow Implement builder part of hotfix workflow descibed at https://review.fuel-infra.org/21267 Change-Id: I38f8030a8079f65dc788c8db65efbde0fb2308f1 --- perestroika/build-deb.sh | 31 ++++-- perestroika/build-functions.sh | 36 ++++++ perestroika/build-rpm.sh | 29 ++++- .../publisher.v5/publish-deb-binaries.sh | 103 +++++++++--------- .../publisher.v5/publish-rpm-binaries.sh | 17 ++- 5 files changed, 146 insertions(+), 70 deletions(-) diff --git a/perestroika/build-deb.sh b/perestroika/build-deb.sh index 949c8b6..9b3d4a2 100755 --- a/perestroika/build-deb.sh +++ b/perestroika/build-deb.sh @@ -56,6 +56,8 @@ main () { [ "$GERRIT_CHANGE_STATUS" == "NEW" ] \ && [ ${GERRIT_PROJECT} == "${SRC_PROJECT}" ] \ && _rev=$(( $_rev + 1 )) + [ "$IS_HOTFIX" == "true" ] \ + && _rev=$(get_extra_revision hotfix ${_srcpath} ${release_tag}) local release=$(dpkg-parsechangelog --show-field Version -l${_debianpath}/debian/changelog | awk -F'-' '{print $NF}' | sed -r 's|[0-9]+$||') local release="${release}${_rev}" local fullver=${epochnumber}${version}-${release} @@ -121,16 +123,30 @@ main () { # Build stage local REQUEST=$REQUEST_NUM [ -n "$LP_BUG" ] && REQUEST=$LP_BUG - COMPONENTS="main restricted" + DEB_HOTFIX_DIST_NAME=${DEB_HOTFIX_DIST_NAME:-hotfix} [ -n "${EXTRAREPO}" ] && EXTRAREPO="${EXTRAREPO}|" EXTRAREPO="${EXTRAREPO}http://${REMOTE_REPO_HOST}/${DEB_REPO_PATH} ${DEB_DIST_NAME} ${COMPONENTS}" - [ "$IS_UPDATES" == 'true' ] \ - && EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${DEB_REPO_PATH} ${DEB_PROPOSED_DIST_NAME} ${COMPONENTS}" - [ "$GERRIT_CHANGE_STATUS" == "NEW" ] && [ "$IS_UPDATES" != "true" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] \ - && EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${DEB_REPO_PATH} ${DEB_DIST_NAME} ${COMPONENTS}" - [ "$GERRIT_CHANGE_STATUS" == "NEW" ] && [ "$IS_UPDATES" == "true" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] \ - && EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${DEB_REPO_PATH} ${DEB_PROPOSED_DIST_NAME} ${COMPONENTS}" + if [ "$IS_HOTFIX" == "true" ] ; then + EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${DEB_REPO_PATH} ${DEB_HOTFIX_DIST_NAME} ${COMPONENTS}" + EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${DEB_REPO_PATH} ${DEB_UPDATES_DIST_NAME} ${COMPONENTS}" + else + [ "$IS_UPDATES" == 'true' ] \ + && EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${DEB_REPO_PATH} ${DEB_PROPOSED_DIST_NAME} ${COMPONENTS}" + fi + + if [ "$GERRIT_CHANGE_STATUS" == "NEW" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] ; then + if [ "$IS_UPDATES" == "true" ] ; then + if [ "$IS_HOTFIX" == "true" ] ; then + EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${DEB_REPO_PATH} ${DEB_HOTFIX_DIST_NAME} ${COMPONENTS}" + else + EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${DEB_REPO_PATH} ${DEB_PROPOSED_DIST_NAME} ${COMPONENTS}" + fi + else + EXTRAREPO="${EXTRAREPO}|http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${DEB_REPO_PATH} ${DEB_DIST_NAME} ${COMPONENTS}" + fi + fi + export EXTRAREPO if [ -n "$EXTRAREPO" ] ; then @@ -168,6 +184,7 @@ main () { REQUEST_NUM=$REQUEST_NUM LP_BUG=$LP_BUG IS_SECURITY=$IS_SECURITY + IS_HOTFIX=$IS_HOTFIX EXTRAREPO="$EXTRAREPO" REPO_TYPE=deb DIST=$DIST diff --git a/perestroika/build-functions.sh b/perestroika/build-functions.sh index ac62db0..4f96710 100644 --- a/perestroika/build-functions.sh +++ b/perestroika/build-functions.sh @@ -55,6 +55,7 @@ request_is_merged () { set_default_params () { [ -z "$PROJECT_NAME" ] && error "Project name is not defined! Exiting!" [ -z "$PROJECT_VERSION" ] && error "Project version is not defined! Exiting!" + [ "$IS_HOTFIX" == "true" -a "$IS_UPDATES" == "false" ] && error "ERROR: Hotfix update before release" [ -z "$SECUPDATETAG" ] && local SECUPDATETAG="^Security-update" [ -z "$IS_SECURITY" ] && IS_SECURITY='false' if [ -n "$GERRIT_PROJECT" ]; then @@ -232,6 +233,41 @@ get_last_commit_info () { fi } +get_extra_revision () { + local type=$1 + local _srcpath=$2 + [ -n "$3" ] && local release_tag=$3 + case "$type" in + security) + local _prefix="0." + unset _suffix + ;; + hotfix) + unset _prefix + local _suffix=".0" + ;; + esac + # hotfix branch name for openstack projects should be like + # "{stable_branch_name}-hotfix-" + # security branch name for openstack projects should be like + # "{stable_branch_name}-security-" + # Get parent branch + local _parent_branch=$(echo "$SOURCE_BRANCH" | sed -r "s|-${type}-.*$||") + [ $(git -C "$_srcpath" branch -a | fgrep -c "origin/$_parent_branch") -eq 0 ] && error "Can't find parent source branch" + # Get common ancestor + local _merge_base=$(git -C "$_srcpath" merge-base "origin/$_parent_branch" "origin/$SOURCE_BRANCH") + # Calculate ancestor revision + if [ -n "$release_tag" ] ; then + local _base_rev=$(git -C "$_srcpath" rev-list --no-merges "$release_tag".."$_merge_base" | wc -l) + else + local _base_rev=$(git -C "$_srcpath" rev-list --no-merges "$_merge_base" | wc -l) + fi + # Calculate delta revision + local _delta_rev=$(( $_rev - $_base_rev )) + local _rev=${_base_rev}.${_prefix}${_delta_rev}${_suffix} + echo "$_rev" +} + fill_buildresult () { #$status $time $PACKAGENAME $pkgtype local status=$1 diff --git a/perestroika/build-rpm.sh b/perestroika/build-rpm.sh index e18e696..a84cee8 100755 --- a/perestroika/build-rpm.sh +++ b/perestroika/build-rpm.sh @@ -61,6 +61,8 @@ This package provides the %{-n*} kernel modules [ "$GERRIT_CHANGE_STATUS" == "NEW" ] \ && [ ${GERRIT_PROJECT} == "${SRC_PROJECT}" ] \ && _rev=$(( $_rev + 1 )) + [ "$IS_HOTFIX" == "true" ] \ + && _rev=$(get_extra_revision hotfix ${_srcpath} ${release_tag}) local release="mos${_rev}" local TAR_NAME=${PACKAGENAME}-${version}.tar.gz # Update version and changelog @@ -128,15 +130,29 @@ This package provides the %{-n*} kernel modules # Build stage local REQUEST=$REQUEST_NUM [ -n "$LP_BUG" ] && REQUEST=$LP_BUG + RPM_HOTFIX_REPO_PATH=${RPM_HOTFIX_REPO_PATH:-${RPM_OS_REPO_PATH%/*}/hotfix} [ -n "${EXTRAREPO}" ] && EXTRAREPO="${EXTRAREPO}|" EXTRAREPO="${EXTRAREPO}repo1,http://${REMOTE_REPO_HOST}/${RPM_OS_REPO_PATH}/x86_64" + if [ "$IS_HOTFIX" == 'true' ] ; then + EXTRAREPO="${EXTRAREPO}|repo2,http://${REMOTE_REPO_HOST}/${RPM_HOTFIX_REPO_PATH}/x86_64" + EXTRAREPO="${EXTRAREPO}|repo3,http://${REMOTE_REPO_HOST}/${RPM_UPDATES_REPO_PATH}/x86_64" + else + [ "$IS_UPDATES" == 'true' ] \ + && EXTRAREPO="${EXTRAREPO}|repo2,http://${REMOTE_REPO_HOST}/${RPM_PROPOSED_REPO_PATH}/x86_64" + fi + + if [ "$GERRIT_CHANGE_STATUS" == "NEW" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] ; then + if [ "$IS_UPDATES" == "true" ] ; then + if [ "$IS_HOTFIX" == 'true' ] ; then + EXTRAREPO="${EXTRAREPO}|repo4,http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${RPM_HOTFIX_REPO_PATH}/x86_64" + else + EXTRAREPO="${EXTRAREPO}|repo4,http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${RPM_PROPOSED_REPO_PATH}/x86_64" + fi + else + EXTRAREPO="${EXTRAREPO}|repo4,http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${RPM_OS_REPO_PATH}/x86_64" + fi + fi - [ "$IS_UPDATES" == 'true' ] && \ - EXTRAREPO="${EXTRAREPO}|repo2,http://${REMOTE_REPO_HOST}/${RPM_PROPOSED_REPO_PATH}/x86_64" - [ "$GERRIT_CHANGE_STATUS" == "NEW" ] && [ "$IS_UPDATES" != "true" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] && \ - EXTRAREPO="${EXTRAREPO}|repo3,http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${RPM_OS_REPO_PATH}/x86_64" - [ "$GERRIT_STATUS" == "NEW" ] && [ "$IS_UPDATES" == "true" ] && [ -n "$LP_BUG" -o -n "$CUSTOM_REPO_ID" ] && \ - EXTRAREPO="${EXTRAREPO}|repo3,http://${REMOTE_REPO_HOST}/${REPO_REQUEST_PATH_PREFIX}/${REQUEST}/${RPM_PROPOSED_REPO_PATH}/x86_64" export EXTRAREPO if [ -n "$EXTRAREPO" ] ; then @@ -175,6 +191,7 @@ This package provides the %{-n*} kernel modules REQUEST_NUM=$REQUEST_NUM LP_BUG=$LP_BUG IS_SECURITY=$IS_SECURITY + IS_HOTFIX=$IS_HOTFIX EXTRAREPO="$EXTRAREPO" REPO_TYPE=rpm DIST=$DIST diff --git a/perestroika/publisher.v5/publish-deb-binaries.sh b/perestroika/publisher.v5/publish-deb-binaries.sh index 678d50e..f8b0d0a 100755 --- a/perestroika/publisher.v5/publish-deb-binaries.sh +++ b/perestroika/publisher.v5/publish-deb-binaries.sh @@ -48,62 +48,59 @@ main() { fi # Repos - for repo_path in ${DEB_REPO_PATH} ; do - local LOCAL_REPO_PATH=${REPO_BASE_PATH}/${repo_path} - local DBDIR="+b/db" - local CONFIGDIR="${LOCAL_REPO_PATH}/conf" - local DISTDIR="${LOCAL_REPO_PATH}/public/dists/" - local OUTDIR="+b/public/" - if [ ! -d "${CONFIGDIR}" ] ; then - mkdir -p ${CONFIGDIR} - job_lock ${CONFIGDIR}.lock wait 3600 - for dist_name in ${DEB_DIST_NAME} ${DEB_PROPOSED_DIST_NAME} ${DEB_UPDATES_DIST_NAME} \ - ${DEB_SECURITY_DIST_NAME} ${DEB_HOLDBACK_DIST_NAME} ; do - cat >> ${CONFIGDIR}/distributions <<- EOF - Origin: ${ORIGIN} - Label: ${DEB_DIST_NAME} - Suite: ${dist_name} - Codename: ${dist_name} - Version: ${PRODUCT_VERSION} - Architectures: amd64 i386 source - Components: main restricted - UDebComponents: main restricted - Contents: . .gz .bz2 + DEB_UPDATES_DIST_NAME=${DEB_UPDATES_DIST_NAME:-$EB_DIST_NAME} + DEB_PROPOSED_DIST_NAME=${DEB_PROPOSED_DIST_NAME:-$DEB_DIST_NAME} + DEB_SECURITY_DIST_NAME=${DEB_SECURITY_DIST_NAME:-$DEB_DIST_NAME} + DEB_HOLDBACK_DIST_NAME=${DEB_HOLDBACK_DIST_NAME:-$DEB_DIST_NAME} + DEB_HOTFIX_DIST_NAME=${DEB_HOTFIX_DIST_NAME:-hotfix} + DEB_UPDATES_COMPONENT=${DEB_UPDATES_COMPONENT:-$DEB_COMPONENT} + DEB_PROPOSED_COMPONENT=${DEB_PROPOSED_COMPONENT:-$DEB_COMPONENT} + DEB_SECURITY_COMPONENT=${DEB_SECURITY_COMPONENT:-$DEB_COMPONENT} + DEB_HOLDBACK_COMPONENT=${DEB_HOLDBACK_COMPONENT:-$DEB_COMPONENT} + DEB_HOTFIX_COMPONENT=${DEB_HOTFIX_COMPONENT:-$DEB_COMPONENT} - EOF + local LOCAL_REPO_PATH=${REPO_BASE_PATH}/${DEB_REPO_PATH} + local DBDIR="+b/db" + local CONFIGDIR="${LOCAL_REPO_PATH}/conf" + local DISTDIR="${LOCAL_REPO_PATH}/public/dists/" + local OUTDIR="+b/public/" + if [ ! -d "${CONFIGDIR}" ] ; then + mkdir -p ${CONFIGDIR} + job_lock ${CONFIGDIR}.lock wait 3600 + for dist_name in ${DEB_DIST_NAME} ${DEB_PROPOSED_DIST_NAME} \ + ${DEB_UPDATES_DIST_NAME} ${DEB_SECURITY_DIST_NAME} \ + ${DEB_HOLDBACK_DIST_NAME} ${DEB_HOTFIX_DIST_NAME} ; do + cat >> ${CONFIGDIR}/distributions <<- EOF + Origin: ${ORIGIN} + Label: ${DEB_DIST_NAME} + Suite: ${dist_name} + Codename: ${dist_name} + Version: ${PRODUCT_VERSION} + Architectures: amd64 i386 source + Components: main restricted + UDebComponents: main restricted + Contents: . .gz .bz2 - reprepro --basedir ${LOCAL_REPO_PATH} --dbdir ${DBDIR} \ - --outdir ${OUTDIR} --distdir ${DISTDIR} --confdir ${CONFIGDIR} \ - export ${dist_name} - # Fix Codename field - local release_file="${DISTDIR}/${dist_name}/Release" - sed "s|^Codename:.*$|Codename: ${DEB_DIST_NAME}|" \ - -i ${release_file} - rm -f ${release_file}.gpg - # ReSign Release file - if [ "${USE_SIGUL}" = "true" ] ; then - retry -c4 -s1 _sigul "$KEY_PASSPHRASE" -u "$SIGUL_USER" sign-data --armor -o "${release_file}.gpg" "${SIGKEYID}" "${release_file}" - else - [ -n "${SIGN_STRING}" ] \ - && gpg --sign --local-user ${SIGKEYID} -ba \ - -o ${release_file}.gpg ${release_file} - fi - done - job_lock ${CONFIGDIR}.lock unset - fi - done + EOF + + reprepro --basedir ${LOCAL_REPO_PATH} --dbdir ${DBDIR} \ + --outdir ${OUTDIR} --distdir ${DISTDIR} --confdir ${CONFIGDIR} \ + export ${dist_name} + # Fix Codename field + local release_file="${DISTDIR}/${dist_name}/Release" + sed "s|^Codename:.*$|Codename: ${DEB_DIST_NAME}|" \ + -i ${release_file} + rm -f ${release_file}.gpg + # ReSign Release file + [ -n "${SIGN_STRING}" ] \ + && gpg --sign --local-user ${SIGKEYID} -ba \ + -o ${release_file}.gpg ${release_file} + done + job_lock ${CONFIGDIR}.lock unset + fi DEB_BASE_DIST_NAME=${DEB_DIST_NAME} - [ -z "${DEB_UPDATES_DIST_NAME}" ] && DEB_UPDATES_DIST_NAME=${DEB_DIST_NAME} - [ -z "${DEB_PROPOSED_DIST_NAME}" ] && DEB_PROPOSED_DIST_NAME=${DEB_DIST_NAME} - [ -z "${DEB_SECURITY_DIST_NAME}" ] && DEB_SECURITY_DIST_NAME=${DEB_DIST_NAME} - [ -z "${DEB_HOLDBACK_DIST_NAME}" ] && DEB_HOLDBACK_DIST_NAME=${DEB_DIST_NAME} - [ -z "${DEB_UPDATES_COMPONENT}" ] && DEB_UPDATES_COMPONENT=${DEB_COMPONENT} - [ -z "${DEB_PROPOSED_COMPONENT}" ] && DEB_PROPOSED_COMPONENT=${DEB_COMPONENT} - [ -z "${DEB_SECURITY_COMPONENT}" ] && DEB_SECURITY_COMPONENT=${DEB_COMPONENT} - [ -z "${DEB_HOLDBACK_COMPONENT}" ] && DEB_HOLDBACK_COMPONENT=${DEB_COMPONENT} - if [ "${IS_UPDATES}" = 'true' ] ; then DEB_DIST_NAME=${DEB_PROPOSED_DIST_NAME} DEB_COMPONENT=${DEB_PROPOSED_COMPONENT} @@ -116,6 +113,10 @@ main() { DEB_DIST_NAME=${DEB_SECURITY_DIST_NAME} DEB_COMPONENT=${DEB_SECURITY_COMPONENT} fi + if [ "${IS_HOTFIX}" = 'true' ] ; then + DEB_DIST_NAME=${DEB_HOTFIX_DIST_NAME} + DEB_COMPONENT=${DEB_HOTFIX_COMPONENT} + fi [ -z "${DEB_COMPONENT}" ] && local DEB_COMPONENT=main [ "${IS_RESTRICTED}" = 'true' ] && DEB_COMPONENT=restricted diff --git a/perestroika/publisher.v5/publish-rpm-binaries.sh b/perestroika/publisher.v5/publish-rpm-binaries.sh index 0d63820..d8a257e 100755 --- a/perestroika/publisher.v5/publish-rpm-binaries.sh +++ b/perestroika/publisher.v5/publish-rpm-binaries.sh @@ -49,7 +49,16 @@ main() { fi # Create all repositories - for repo_path in ${RPM_OS_REPO_PATH} ${RPM_PROPOSED_REPO_PATH} ${RPM_UPDATES_REPO_PATH} ${RPM_SECURITY_REPO_PATH} ${RPM_HOLDBACK_REPO_PATH} ; do + RPM_UPDATES_REPO_PATH=${RPM_UPDATES_REPO_PATH:-$RPM_OS_REPO_PATH} + RPM_PROPOSED_REPO_PATH=${RPM_PROPOSED_REPO_PATH:-$RPM_OS_REPO_PATH} + RPM_SECURITY_REPO_PATH=${RPM_SECURITY_REPO_PATH:-$RPM_OS_REPO_PATH} + RPM_HOLDBACK_REPO_PATH=${RPM_HOLDBACK_REPO_PATH:-$RPM_OS_REPO_PATH} + RPM_HOTFIX_REPO_PATH=${RPM_HOTFIX_REPO_PATH:-${RPM_OS_REPO_PATH%/*}/hotfix} + + + for repo_path in ${RPM_OS_REPO_PATH} ${RPM_PROPOSED_REPO_PATH} \ + ${RPM_UPDATES_REPO_PATH} ${RPM_SECURITY_REPO_PATH} \ + ${RPM_HOLDBACK_REPO_PATH} ${RPM_HOTFIX_REPO_PATH} ; do local LOCAL_REPO_PATH=${REPO_BASE_PATH}/${repo_path} if [ ! -d "${LOCAL_REPO_PATH}" ] ; then mkdir -p ${LOCAL_REPO_PATH}/{x86_64/Packages,Source/SPackages,x86_64/repodata} @@ -60,15 +69,11 @@ main() { fi done - [ -z "${RPM_UPDATES_REPO_PATH}" ] && RPM_UPDATES_REPO_PATH=${RPM_OS_REPO_PATH} - [ -z "${RPM_PROPOSED_REPO_PATH}" ] && RPM_PROPOSED_REPO_PATH=${RPM_OS_REPO_PATH} - [ -z "${RPM_SECURITY_REPO_PATH}" ] && RPM_SECURITY_REPO_PATH=${RPM_OS_REPO_PATH} - [ -z "${RPM_HOLDBACK_REPO_PATH}" ] && RPM_HOLDBACK_REPO_PATH=${RPM_OS_REPO_PATH} - RPM_REPO_PATH=${RPM_OS_REPO_PATH} [ "${IS_UPDATES}" == 'true' ] && RPM_REPO_PATH=${RPM_PROPOSED_REPO_PATH} [ "${IS_HOLDBACK}" == 'true' ] && RPM_REPO_PATH=${RPM_HOLDBACK_REPO_PATH} [ "${IS_SECURITY}" == 'true' ] && RPM_REPO_PATH=${RPM_SECURITY_REPO_PATH} + [ "${IS_HOTFIX}" == 'true' ] && RPM_REPO_PATH=${RPM_HOTFIX_REPO_PATH} local LOCAL_REPO_PATH=${REPO_BASE_PATH}/${RPM_REPO_PATH}