root / snf-deploy / autopkg.sh @ 30761818
History | View | Annotate | Download (5.8 kB)
1 | 0ac84a9a | Dimitris Aragiorgis | #!/bin/bash |
---|---|---|---|
2 | 0ac84a9a | Dimitris Aragiorgis | |
3 | 0ac84a9a | Dimitris Aragiorgis | usage(){ |
4 | 0ac84a9a | Dimitris Aragiorgis | |
5 | 0ac84a9a | Dimitris Aragiorgis | echo " |
6 | 0ac84a9a | Dimitris Aragiorgis | Usage: $0: [options] |
7 | 0ac84a9a | Dimitris Aragiorgis | -h, --help Prints this help message |
8 | 0ac84a9a | Dimitris Aragiorgis | --debian [branch] Local debian branch to use (default debian) |
9 | 0ac84a9a | Dimitris Aragiorgis | --upstream [branch] Local upstream branch to use (default master) |
10 | 0ac84a9a | Dimitris Aragiorgis | --remote [repo] Remote repo to use (default origin) |
11 | 0ac84a9a | Dimitris Aragiorgis | --packages [dir] Where to store the created packages (default ~/packages) |
12 | 0ac84a9a | Dimitris Aragiorgis | --validate Fetch remote repo branches and |
13 | 0ac84a9a | Dimitris Aragiorgis | check if local are up-to-date (default false) |
14 | 0ac84a9a | Dimitris Aragiorgis | --push Whether to push upstream (default false) |
15 | 0ac84a9a | Dimitris Aragiorgis | " |
16 | 0ac84a9a | Dimitris Aragiorgis | exit 1 |
17 | 0ac84a9a | Dimitris Aragiorgis | } |
18 | 0ac84a9a | Dimitris Aragiorgis | |
19 | 0ac84a9a | Dimitris Aragiorgis | parse_git_branch() |
20 | 0ac84a9a | Dimitris Aragiorgis | { |
21 | 0ac84a9a | Dimitris Aragiorgis | git branch 2> /dev/null | grep '^*' | sed 's/^*\ //g' |
22 | 0ac84a9a | Dimitris Aragiorgis | } |
23 | 0ac84a9a | Dimitris Aragiorgis | |
24 | 0ac84a9a | Dimitris Aragiorgis | die() |
25 | 0ac84a9a | Dimitris Aragiorgis | { |
26 | 0ac84a9a | Dimitris Aragiorgis | echo -e $* 1>&2 |
27 | 0ac84a9a | Dimitris Aragiorgis | echo Aborting. |
28 | 0ac84a9a | Dimitris Aragiorgis | exit 1 |
29 | 0ac84a9a | Dimitris Aragiorgis | } |
30 | 0ac84a9a | Dimitris Aragiorgis | |
31 | 0ac84a9a | Dimitris Aragiorgis | cleanup() |
32 | 0ac84a9a | Dimitris Aragiorgis | { |
33 | 0ac84a9a | Dimitris Aragiorgis | trap - EXIT |
34 | 0ac84a9a | Dimitris Aragiorgis | |
35 | 0ac84a9a | Dimitris Aragiorgis | echo -n Cleaning up... |
36 | 0ac84a9a | Dimitris Aragiorgis | if [ ${#CLEANUP[*]} -gt 0 ]; then |
37 | 0ac84a9a | Dimitris Aragiorgis | LAST_ELEMENT=$((${#CLEANUP[*]}-1)) |
38 | 0ac84a9a | Dimitris Aragiorgis | REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0) |
39 | 0ac84a9a | Dimitris Aragiorgis | for i in $REVERSE_INDEXES; do |
40 | 0ac84a9a | Dimitris Aragiorgis | local cmd=${CLEANUP[$i]} |
41 | 0ac84a9a | Dimitris Aragiorgis | $cmd |
42 | 0ac84a9a | Dimitris Aragiorgis | done |
43 | 0ac84a9a | Dimitris Aragiorgis | fi |
44 | 0ac84a9a | Dimitris Aragiorgis | echo "done" |
45 | 0ac84a9a | Dimitris Aragiorgis | } |
46 | 0ac84a9a | Dimitris Aragiorgis | |
47 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup() { |
48 | 0ac84a9a | Dimitris Aragiorgis | local cmd="" |
49 | 0ac84a9a | Dimitris Aragiorgis | for arg; do cmd+=$(printf "%q " "$arg"); done |
50 | 0ac84a9a | Dimitris Aragiorgis | CLEANUP+=("$cmd") |
51 | 0ac84a9a | Dimitris Aragiorgis | } |
52 | 0ac84a9a | Dimitris Aragiorgis | |
53 | 0ac84a9a | Dimitris Aragiorgis | |
54 | 0ac84a9a | Dimitris Aragiorgis | add_checkpoint() |
55 | 0ac84a9a | Dimitris Aragiorgis | { |
56 | 0ac84a9a | Dimitris Aragiorgis | commit=$(git reflog | head -n1 | cut -f 1 -d " ") |
57 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup git reset --hard $commit |
58 | 0ac84a9a | Dimitris Aragiorgis | LASTCHECKPOINT=$commit |
59 | 0ac84a9a | Dimitris Aragiorgis | } |
60 | 0ac84a9a | Dimitris Aragiorgis | |
61 | 0ac84a9a | Dimitris Aragiorgis | CLEANUP=( ) |
62 | 0ac84a9a | Dimitris Aragiorgis | |
63 | 0ac84a9a | Dimitris Aragiorgis | |
64 | 0ac84a9a | Dimitris Aragiorgis | TEMP=$(getopt -o h --long help,validate,push,packages:,upstream:,debian:,remote: -n 'autopkg.sh' -- "$@") |
65 | 0ac84a9a | Dimitris Aragiorgis | |
66 | 0ac84a9a | Dimitris Aragiorgis | if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi |
67 | 0ac84a9a | Dimitris Aragiorgis | |
68 | 0ac84a9a | Dimitris Aragiorgis | eval set -- "$TEMP" |
69 | 0ac84a9a | Dimitris Aragiorgis | |
70 | 0ac84a9a | Dimitris Aragiorgis | while true ; do |
71 | 0ac84a9a | Dimitris Aragiorgis | case "$1" in |
72 | 0ac84a9a | Dimitris Aragiorgis | -h|--help) usage ;; |
73 | 0ac84a9a | Dimitris Aragiorgis | --upstream) LOCALUPSTREAM=$2 ; shift 2 ;; |
74 | 0ac84a9a | Dimitris Aragiorgis | --debian) LOCALDEBIAN=$2 ; shift 2 ;; |
75 | 0ac84a9a | Dimitris Aragiorgis | --remote) REMOTE=$2 ; shift 2 ;; |
76 | 0ac84a9a | Dimitris Aragiorgis | --packages) PKGAREA=$2 ; shift 2 ;; |
77 | 0ac84a9a | Dimitris Aragiorgis | --validate) VALIDATE=true ; shift ;; |
78 | 0ac84a9a | Dimitris Aragiorgis | --push) PUSH=true ; shift ;; |
79 | 0ac84a9a | Dimitris Aragiorgis | --) shift ; break ;; |
80 | 0ac84a9a | Dimitris Aragiorgis | *) echo "Internal error!" ; usage ;; |
81 | 0ac84a9a | Dimitris Aragiorgis | esac |
82 | 0ac84a9a | Dimitris Aragiorgis | done |
83 | 0ac84a9a | Dimitris Aragiorgis | |
84 | 0ac84a9a | Dimitris Aragiorgis | # The root of the git repository, no matter where we're called from |
85 | 0ac84a9a | Dimitris Aragiorgis | TOPLEVEL="$(git rev-parse --show-toplevel)" |
86 | 0ac84a9a | Dimitris Aragiorgis | |
87 | 0ac84a9a | Dimitris Aragiorgis | : ${LOCALUPSTREAM:=$(parse_git_branch)} |
88 | 0ac84a9a | Dimitris Aragiorgis | : ${LOCALDEBIAN:=debian} |
89 | 0ac84a9a | Dimitris Aragiorgis | : ${REMOTE:=origin} |
90 | 0ac84a9a | Dimitris Aragiorgis | : ${VALIDATE:=false} |
91 | 0ac84a9a | Dimitris Aragiorgis | : ${PUSH:=false} |
92 | 0ac84a9a | Dimitris Aragiorgis | |
93 | 0ac84a9a | Dimitris Aragiorgis | : ${PKGAREA:=~/packages} |
94 | 0ac84a9a | Dimitris Aragiorgis | : ${BACKUPAREA:=~/backup} |
95 | 0ac84a9a | Dimitris Aragiorgis | |
96 | 0ac84a9a | Dimitris Aragiorgis | cd "$TOPLEVEL" |
97 | 0ac84a9a | Dimitris Aragiorgis | |
98 | 0ac84a9a | Dimitris Aragiorgis | # Prerequisites: Test all important directories exist |
99 | 0ac84a9a | Dimitris Aragiorgis | test -d "$PKGAREA" || die "Package area directory $PKGAREA missing" |
100 | 0ac84a9a | Dimitris Aragiorgis | test -d "$BACKUPAREA" || die "Backup area directory $BACKUPAREA missing" |
101 | 0ac84a9a | Dimitris Aragiorgis | |
102 | 0ac84a9a | Dimitris Aragiorgis | # Prerequisite: Test the dialog utility is available |
103 | 0ac84a9a | Dimitris Aragiorgis | dialog --help &>/dev/null || die "Could not run the 'dialog' utility" |
104 | 0ac84a9a | Dimitris Aragiorgis | |
105 | 0ac84a9a | Dimitris Aragiorgis | BUILDAREA=$(mktemp -d --tmpdir=/tmp build-area.XXX) |
106 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup rm -r $BUILDAREA |
107 | 0ac84a9a | Dimitris Aragiorgis | |
108 | 0ac84a9a | Dimitris Aragiorgis | echo "############################################################################" |
109 | 0ac84a9a | Dimitris Aragiorgis | echo "Will build packages under $BUILDAREA" |
110 | 0ac84a9a | Dimitris Aragiorgis | echo "Local upstream branch: $LOCALUPSTREAM" |
111 | 0ac84a9a | Dimitris Aragiorgis | echo "Local debian branch: $LOCALDEBIAN" |
112 | 0ac84a9a | Dimitris Aragiorgis | $VALIDATE && echo "Will fetch $REMOTE and check if $LOCALUPSTREAM and $LOCALDEBIAN are up-to-date" |
113 | 0ac84a9a | Dimitris Aragiorgis | echo "############################################################################" |
114 | 0ac84a9a | Dimitris Aragiorgis | echo "Press Enter to continue..." |
115 | 0ac84a9a | Dimitris Aragiorgis | read |
116 | 0ac84a9a | Dimitris Aragiorgis | |
117 | 0ac84a9a | Dimitris Aragiorgis | MODIFIED=$(git status --short | grep -v "??") |
118 | 0ac84a9a | Dimitris Aragiorgis | test -z "$MODIFIED" || die "error: Repository is dirty. Commit your local changes:\n $MODIFIED" |
119 | 0ac84a9a | Dimitris Aragiorgis | |
120 | 0ac84a9a | Dimitris Aragiorgis | set -e |
121 | 0ac84a9a | Dimitris Aragiorgis | trap cleanup EXIT |
122 | 0ac84a9a | Dimitris Aragiorgis | |
123 | 0ac84a9a | Dimitris Aragiorgis | add_checkpoint |
124 | 0ac84a9a | Dimitris Aragiorgis | |
125 | 0ac84a9a | Dimitris Aragiorgis | # Create a temporary debian branch to do everything |
126 | 0ac84a9a | Dimitris Aragiorgis | TMPDEBIAN=$(mktemp -u debian.XXX) |
127 | 0ac84a9a | Dimitris Aragiorgis | git branch --track $TMPDEBIAN $LOCALDEBIAN |
128 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup git branch -D $TMPDEBIAN |
129 | 0ac84a9a | Dimitris Aragiorgis | |
130 | 0ac84a9a | Dimitris Aragiorgis | git checkout $TMPDEBIAN |
131 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup git checkout $LOCALUPSTREAM |
132 | 0ac84a9a | Dimitris Aragiorgis | |
133 | 0ac84a9a | Dimitris Aragiorgis | # Whether we are in snapshot or release mode |
134 | 0ac84a9a | Dimitris Aragiorgis | snap=false |
135 | 0ac84a9a | Dimitris Aragiorgis | mrgextra=-m |
136 | 0ac84a9a | Dimitris Aragiorgis | dchextra=-R |
137 | 0ac84a9a | Dimitris Aragiorgis | mrgmsg="Merge branch '$LOCALUPSTREAM' into $LOCALDEBIAN" |
138 | 0ac84a9a | Dimitris Aragiorgis | dialog --yesno "Create Snapshot?" 5 20 && snap=true && dchextra=-S && mrgextra= && mrgmsg= |
139 | 0ac84a9a | Dimitris Aragiorgis | |
140 | 0ac84a9a | Dimitris Aragiorgis | # merge local branch into tmp branch with a nice commit message, |
141 | 0ac84a9a | Dimitris Aragiorgis | # so it can be pushed as is to upstream debian |
142 | 0ac84a9a | Dimitris Aragiorgis | export GIT_MERGE_AUTOEDIT=no |
143 | 0ac84a9a | Dimitris Aragiorgis | git merge $mrgextra ${mrgextra:+"$mrgmsg"} $LOCALUPSTREAM |
144 | 0ac84a9a | Dimitris Aragiorgis | |
145 | 0ac84a9a | Dimitris Aragiorgis | # auto edit Debian changelog depending on Snapshot or Release mode |
146 | 0ac84a9a | Dimitris Aragiorgis | export EDITOR=/usr/bin/vim |
147 | 0ac84a9a | Dimitris Aragiorgis | git-dch --debian-branch=$TMPDEBIAN --git-author --ignore-regex=".*" --multimaint-merge --since=HEAD $dchextra |
148 | 0ac84a9a | Dimitris Aragiorgis | git add debian/changelog |
149 | 0ac84a9a | Dimitris Aragiorgis | |
150 | 0ac84a9a | Dimitris Aragiorgis | # get version from the changelog |
151 | 0ac84a9a | Dimitris Aragiorgis | # we add a git tag here, so setup.py sdist works as expected |
152 | 0ac84a9a | Dimitris Aragiorgis | # FIXME: This is a workaround for the way Synnefo packages determine |
153 | 0ac84a9a | Dimitris Aragiorgis | # the versions for their Python packages |
154 | 0ac84a9a | Dimitris Aragiorgis | version=$(IFS="()" ; read x v x < debian/changelog ; echo $v) |
155 | 0ac84a9a | Dimitris Aragiorgis | if ! $snap; then |
156 | 0ac84a9a | Dimitris Aragiorgis | git commit -s -a -m "Bump new upstream version" |
157 | 0ac84a9a | Dimitris Aragiorgis | TAGFILE=$(mktemp -t tag.XXX) |
158 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup rm $TAGFILE |
159 | 0ac84a9a | Dimitris Aragiorgis | dialog --inputbox "New Debian Tag: " 5 30 "debian/$version" 2>$TAGFILE |
160 | 0ac84a9a | Dimitris Aragiorgis | git tag $(<$TAGFILE) |
161 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup git tag -d $(<$TAGFILE) |
162 | 0ac84a9a | Dimitris Aragiorgis | fi |
163 | 0ac84a9a | Dimitris Aragiorgis | |
164 | 0ac84a9a | Dimitris Aragiorgis | add_cleanup git reset --hard HEAD |
165 | 0ac84a9a | Dimitris Aragiorgis | # Build all packages |
166 | 0ac84a9a | Dimitris Aragiorgis | git-buildpackage --git-export-dir="$BUILDAREA" \ |
167 | 0ac84a9a | Dimitris Aragiorgis | --git-upstream-branch=$LOCALUPSTREAM \ |
168 | 0ac84a9a | Dimitris Aragiorgis | --git-debian-branch=$TMPDEBIAN \ |
169 | 0ac84a9a | Dimitris Aragiorgis | --git-export=INDEX \ |
170 | 0ac84a9a | Dimitris Aragiorgis | --git-ignore-new -sa |
171 | 0ac84a9a | Dimitris Aragiorgis | |
172 | 0ac84a9a | Dimitris Aragiorgis | # do some dirty backup |
173 | 0ac84a9a | Dimitris Aragiorgis | # pkgarea might be needed by auto-deploy tool |
174 | 0ac84a9a | Dimitris Aragiorgis | rm -f "$PKGAREA"/* || true |
175 | 0ac84a9a | Dimitris Aragiorgis | cp -v "$BUILDAREA"/* "$PKGAREA"/ || true |
176 | 0ac84a9a | Dimitris Aragiorgis | cp -v "$BUILDAREA"/* "$BACKUPAREA"/ || true |
177 | 0ac84a9a | Dimitris Aragiorgis | |
178 | 0ac84a9a | Dimitris Aragiorgis | |
179 | 0ac84a9a | Dimitris Aragiorgis | |
180 | 0ac84a9a | Dimitris Aragiorgis | function check_remote(){ |
181 | 0ac84a9a | Dimitris Aragiorgis | |
182 | 0ac84a9a | Dimitris Aragiorgis | git fetch $1 2>/dev/null || die "Could not fetch $1" |
183 | 0ac84a9a | Dimitris Aragiorgis | git fetch $1 $2 2>/dev/null|| die "Could not fetch $1/$2" |
184 | 0ac84a9a | Dimitris Aragiorgis | |
185 | 0ac84a9a | Dimitris Aragiorgis | commits_behind=$(git rev-list $2..$1/$2 | wc -l) |
186 | 0ac84a9a | Dimitris Aragiorgis | if [ $commits_behind -ne 0 ]; then |
187 | 0ac84a9a | Dimitris Aragiorgis | die "Your local branch is outdated. Please run:\ngit pull --rebase $1/$2" |
188 | 0ac84a9a | Dimitris Aragiorgis | fi |
189 | 0ac84a9a | Dimitris Aragiorgis | |
190 | 0ac84a9a | Dimitris Aragiorgis | |
191 | 0ac84a9a | Dimitris Aragiorgis | } |
192 | 0ac84a9a | Dimitris Aragiorgis | |
193 | 0ac84a9a | Dimitris Aragiorgis | if $VALIDATE; then |
194 | 0ac84a9a | Dimitris Aragiorgis | check_remote $REMOTE $LOCALUPSTREAM |
195 | 0ac84a9a | Dimitris Aragiorgis | check_remote $REMOTE $LOCALDEBIAN |
196 | 0ac84a9a | Dimitris Aragiorgis | fi |
197 | 0ac84a9a | Dimitris Aragiorgis | |
198 | 0ac84a9a | Dimitris Aragiorgis | |
199 | 0ac84a9a | Dimitris Aragiorgis | # trap - EXIT |
200 | 0ac84a9a | Dimitris Aragiorgis | # here we can push the commits to the remote debian branch as they are |
201 | 0ac84a9a | Dimitris Aragiorgis | echo |
202 | 0ac84a9a | Dimitris Aragiorgis | echo "#################################################" |
203 | 0ac84a9a | Dimitris Aragiorgis | echo "## SUCCESS ##" |
204 | 0ac84a9a | Dimitris Aragiorgis | echo "#################################################" |
205 | 0ac84a9a | Dimitris Aragiorgis | if $PUSH; then |
206 | 0ac84a9a | Dimitris Aragiorgis | git push --tags $REMOTE $TMPDEBIAN:$LOCALDEBIAN |
207 | 0ac84a9a | Dimitris Aragiorgis | git push $REMOTE $LOCALUPSTREAM:$LOCALUPSTREAM |
208 | 0ac84a9a | Dimitris Aragiorgis | fi |
209 | 0ac84a9a | Dimitris Aragiorgis | |
210 | 0ac84a9a | Dimitris Aragiorgis | exit 0 |