#!/bin/bash
#------------------------------------------------------------------------------
set -u
declare Version=1.1.6
# For usage info, see ReleaseProcessOverview.md
# Micro functions.
function dbg () { [[ $DEBUG -eq 1 ]] && echo -e "DEBUG: $*" >&2; }
function msg () { echo -e $*; }
function bail () { msg "\nError: ${1:-Unknown Error}\n"; exit ${2:-1}; }
function cmd () { msg "Executing: $*"; $*; return $?; }
# $Product can be mixed case, $product is the lowercase form.
declare Product=SDP
declare product=$(echo $Product | tr '[:upper:]' '[:lower:]')
declare OldCL=
declare NewCL=
declare UpdateCL=
declare NewEpochTime=
declare DateString=
declare Description=
declare Type=
declare TypeTag=
declare DefaultMajorVersion=
declare MajorVersion=
declare VersionString=
declare Input=
declare DEBUG=0
# Folder name is assumed to be Product name, normalized to lowercase.
declare DevBranch="//guest/perforce_software/$product/dev"
declare BranchSpec="//guest/perforce_software/$product/dev"
declare Owner=perforce_software
declare BranchSpec="${Owner}-${product}-dev"
declare MainBranch="//guest/perforce_software/$product/main"
declare VersionDepotFile=$DevBranch/Version
declare VersionFile=
declare RelNotesDepotFile=$DevBranch/doc/ReleaseNotes.txt
declare RelNotesFile=
declare NewReleaseTag=
declare OS=
declare TmpDir=$(mktemp -d)
declare NewVersionFile=$TmpDir/Version
declare NewRelNotesFile=$TmpDir/ReleaseNotes.txt
declare TmpFile=$TmpDir/temp
declare -i NoOp=0
msg "Start ${0##*/} v$Version at $(date)."
if [[ $* == *"-n"* ]]; then
msg "\nRunning in No-Op (Preview) mode."
NoOp=1
fi
VersionFile=$(p4 -ztag -F %path% where $VersionDepotFile)
RelNotesFile=$(p4 -ztag -F %path% where $RelNotesDepotFile)
if [[ -n "$(p4 -s merge -n -b $BranchSpec 2>/dev/null | grep 'All revision(s) already integrated.')" ]]; then
msg "Verified: Merge Down preview from main shows dev is updated."
else
bail "A Merge Down from Main may be required. Aborting.Check with:\n\tp4 -s merge -n -b $BranchSpec\n"
fi
if [[ -n "$(p4 -s opened $DevBranch/... 2>/dev/null | grep 'not opened on this client')" ]]; then
msg "Verified: Nothing is checked out in the $Product dev branch."
else
bail "Failed to verify that no files are checked out in the $Product dev branch. The 'p4 opened' check shows:\n$(p4 -s opened $DevBranch/...)\nAborting."
fi
if [[ -n "$(p4 status $DevBranch/... | grep 'no file(s) to reconcile.')" ]]; then
msg "Verified: No excesss files are in the dev branch in your workspace."
else
bail "The 'p4 status' check failed for $DevBranch. The 'p4 status' check shows:\n$(p4 status $DevBranch/...)\nAborting."
fi
if [[ -n "$(p4 -s opened $MainBranch/... 2>/dev/null | grep 'not opened on this client')" ]]; then
msg "Verified: Nothing is checked out in the $Product main branch."
else
bail "Failed to verify that no files are checked out in the $Product main branch. The 'p4 opened' check shows:\n$(p4 -s opened $MainBranch/...)\nAborting."
fi
if [[ -n "$(p4 status $MainBranch/... | grep 'no file(s) to reconcile.')" ]]; then
msg "Verified: No excesss files are in the main branch in your workspace."
else
bail "The 'p4 status' check failed for $MainBranch. The 'p4 status' check shows:\n$(p4 status $MainBranch/...)\nAborting."
fi
msg Syncing $Product dev and main Branches.
if [[ $NoOp -eq 0 ]]; then
cmd p4 -s sync $DevBranch/... $MainBranch/... ||\
bail "Failed to sync $Product dev and main branches. Aborting."
else
msg NO-OP: Would run: p4 -s sync $DevBranch/... $MainBranch/...
fi
DefaultMajorVersion=$(cat $VersionFile|cut -d '/' -f 3|cut -d ' ' -f 1)
DefaultMajorVersion=$(echo $DefaultMajorVersion)
# Ask the user for the major version, e.g 2017.1, suggesting a default as whatever the
# current major version is. In preview mode, assume the default to avoid being
# interactive.
if [[ $NoOp -eq 0 ]]; then
echo -e -n "\n\nEnter $Product Major Version for this release [$DefaultMajorVersion]: "
read -e Input
Input=$(echo $Input)
fi
MajorVersion=${Input:-$DefaultMajorVersion}
NewCL=$(p4 -ztag -F %change% changes -s submitted -m 1 $DevBranch/...)
[[ -n "$NewCL" ]] ||\
bail "Could not get latest changelist in dev branch [$DevBranch]. Aborting."
NewEpochTime=$(p4 -ztag -F %time% describe -s $NewCL)
[[ -n "$NewEpochTime" ]] ||\
bail "Could not get epoch time for change [$NewCL]. Aborting."
# Given a current changelist number, get the date submitted. 'p4 -ztag'
# tagged/formatted output gives the data in epoch time format. (We could also
# parse the date from untagged output, so we could do our work parsing or do
# it converting. Converting deals with left cruft data, parsing might be more
# future proof if the format of the 'date' command changes. But I don't think
# it will.
# So we convert the 'epoch time' format (just a big integer, number of seconds
# elapsed since midnight, January 1, 1970) to a date in the formate we want for our
# current purposes, e.g. '2017/02/17.' The syntax of the 'date' command to
# convert is platform-specific (and possibly platform-version specific). This
# code works on Mac OSX Sierra and modern Linux 2.6 kernel, probably others too).
if [[ $(uname -s) == Darwin ]]; then
# At least as of Mac OSX 10.11.6 El Capitan, the 'time' command is different
# on Linux.
DateString=$(date -j -r $NewEpochTime +'%Y/%m/%d')
else
DateString=$(date -d @$NewEpochTime +'%Y/%m/%d')
fi
[[ -n "$DateString" ]] ||\
bail "Could not get date string from epoch time [$NewEpochTime]."
VersionString=${MajorVersion}.${NewCL}
OldCL=$(cat $VersionFile|cut -d '/' -f 4)
OldCL=${OldCL%%.*}
OldCL=${OldCL%% *}
echo "Rev. SDP/MultiArch/$MajorVersion/$NewCL ($DateString)." > $NewVersionFile
NewReleaseTag=$(head -1 $NewVersionFile)
NewReleaseTag=${NewReleaseTag%\.}
if [[ "$OldCL" == "$NewCL" ]]; then
bail "There appear to have been no changes in the dev branch since the last SDP release. Aborting."
fi
declare -i i= firstNLines= lastNLines=
i=0; while read line; do
[[ $line == "CHANGE HISTORY:" ]] && break
i=$((i+1))
done < $RelNotesFile
dbg i=$i
firstNLines=$((i+2))
dbg FNL=$firstNLines
lines=$(cat $RelNotesFile | wc -l)
lines=$(echo $lines)
dbg Total Lines=$lines
lastNLines=$((lines-$firstNLines+1))
dbg LNL=$lastNLines
dbg head -$firstNLines $RelNotesFile
head -$firstNLines $RelNotesFile > $NewRelNotesFile
echo -e "Released: $NewReleaseTag\n\nJobs Fixed since change $OldCL up to $NewCL (F=Feature, B=Bug):\n" >> $NewRelNotesFile
# Increment $OldCL by 1 after the message above, to exclude
# jobs associated with the last CL of the prior release.
OldCL=$((OldCL+1))
for j in $(p4 -ztag -F %Job% jobs $DevBranch/...@${OldCL},@${NewCL}); do
Description=$(p4 -ztag -F %Description% job -o $j|head -1)
Type=$(p4 -ztag -F %Type% job -o $j)
# Use a one-letter shorthand for job types.
case $Type in
(Feature) TypeTag=F;;
(Bug) TypeTag=B;;
(*) TypeTag=$Type;; # For unrecognized types, use the given name.
esac
echo -e "$j ($TypeTag): $Description" >> $NewRelNotesFile
done
dbg tail -$lastNLines $RelNotesFile
tail -$lastNLines $RelNotesFile >> $NewRelNotesFile
if [[ $NoOp -eq 0 ]]; then
cmd p4 -s edit $VersionFile $RelNotesFile ||\
bail "Failed to checkout Version and Release Notes files [$VersionFile and $RelNotesFile]."
cmd mv -f $NewRelNotesFile $RelNotesFile ||\
bail "Failed to move new Release Notes file in place."
cmd mv -f $NewVersionFile $VersionFile ||\
bail "Failed to move new Version file in place."
msg "\nVersion file from/to:"
cmd p4 diff $VersionFile
msg "\nUpdates to release notes:"
cmd p4 diff $RelNotesFile
echo -e "Change: new\n\nDescription:\n\tUpdated Version to release $Product $VersionString.\n\nFiles:\n\t$RelNotesDepotFile\n\t$VersionDepotFile" > $TmpFile
msg "Creating new pending changelist for Version and Release Notes files."
p4 -s change -i < $TmpFile ||\
bail "Failed to create changelist with Version and Release Notes files."
UpdateCL=$(p4 -ztag -F %change% opened -m 1 $DevBranch/...)
[[ -n "$UpdateCL" ]] ||\
bail "Could not find newly created pending changelist. Aborting."
msg "\nMassage the release notes and changelist description as needed.\nThen do:\n\tp4 -s submit -c $UpdateCL"
else
msg "\nPreview: Version file would change from/to:"
diff $VersionFile $NewVersionFile
msg "\nPreview Updates to release notes:"
diff $RelNotesFile $NewRelNotesFile
msg "\nPreview: Change Desc would be: Updated Version to release $Product $VersionString."
fi
/bin/rm -rf "$TmpDir"
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #24 | 29835 | C. Thomas Tyler |
Updated Release Process to account for migration to JIRA. Removed scripts made obsolete by this change to avoid confusion. |
||
| #23 | 29020 | C. Thomas Tyler | Added support for new 'Doc' type in jobspec. | ||
| #22 | 28991 | C. Thomas Tyler | Enhanced to change ':revdate:' field in ReleaseNotes.adoc. | ||
| #21 | 28258 | C. Thomas Tyler | Enhanced to apply new post-2020.1 versions. | ||
| #20 | 27538 | C. Thomas Tyler | Added explicit BASH version check. | ||
| #19 | 27523 | C. Thomas Tyler | Added release header. | ||
| #18 | 27461 | C. Thomas Tyler | Refined AsciiDoc generated doc update part of release process. | ||
| #17 | 27365 | C. Thomas Tyler |
rel_notes.sh v1.4.1: * Fixed bug in genererated per-job adoc refs. |
||
| #16 | 27329 | C. Thomas Tyler |
Updated user instructions in release notes script, to include generation of adoc-based release notes. |
||
| #15 | 27119 | C. Thomas Tyler | Further adoc adaptation. | ||
| #14 | 27117 | C. Thomas Tyler | Corrected file extension. | ||
| #13 | 27115 | C. Thomas Tyler |
Updated SDP release process doc, adding info on how to ensure generated script docs are incorporated in AsciiDoc files. Adjusted generated release notes file from .txt to .adoc format. Updated rel_notes.sh to add bulleted list items with links to each fixed job. Updated old release notes content to use new format (using disposable link conversion scripts). |
||
| #12 | 26884 | C. Thomas Tyler | Fixed issue with errors going to stderr not being caught in grep expressions. | ||
| #11 | 25503 | C. Thomas Tyler | rel_notes.sh: Shellcheck compliance only. | ||
| #10 | 25244 | C. Thomas Tyler | Enhanced to support patch release versions. | ||
| #9 | 21719 | C. Thomas Tyler |
Added '-n' flag to preview release notes. Added internal comments. |
||
| #8 | 21336 | C. Thomas Tyler |
Added check to fisrt a merge down preview, and bail if one is required. This prevents generating incorrect release notes that don't account for changes made directly in main. Also enhanced temp file handling. |
||
| #7 | 21237 | C. Thomas Tyler | Typo. | ||
| #6 | 20765 | C. Thomas Tyler | Tweaked. | ||
| #5 | 20756 | C. Thomas Tyler | Fixed bug showing correct new version in release notes. | ||
| #4 | 20516 | C. Thomas Tyler | Cosmetic tweak and enhancement to end-user instructions. | ||
| #3 | 20479 | C. Thomas Tyler |
Added release process overview script. Overhauled release notes helper script. Fixed bug that listed a job in the release notes for the current release that was associated with the last changelist of the prior release. Updated more of the manual steps in the SDP release process. |
||
| #2 | 19693 | C. Thomas Tyler |
Minor enhancements to release notes script: * Added job type (Bug/Feature) for each job. * Generates more of the text needed to copy/paste into release notes file. |
||
| #1 | 17316 | C. Thomas Tyler | Added script to help generate release notes for SDP. |