]> arthur.barton.de Git - Autobuilder.git/blob - bin/autobuilder
Implement KEEP_ARCHIVES & ARCHIVE_PATTERN job settings
[Autobuilder.git] / bin / autobuilder
1 #!/bin/sh
2 #
3 # 2012-01-22, alex@barton.de
4 #
5
6 MYNAME=$(basename "$0")
7
8 # options
9 FORCE=""
10 QUIETCMD=">/dev/null"
11
12 export LC_ALL=C
13
14 while [ $# -gt 0 ]; do
15         case "$1" in
16           "-f"|"--force")
17                 FORCE=1
18                 ;;
19           "-v"|"--verbose")
20                 QUIETCMD=
21                 ;;
22           *)
23                 echo "Usage: $MYNAME [--force|-f]" >&2
24                 exit 1
25         esac
26         shift
27 done
28
29 # defaults
30 AUTOBUILDER_D_DIR="/usr/local/etc/autobuilder/autobuild.d"
31 CACHE_DIR="/usr/local/var/cache/autobuilder"
32 MSG_PREFIX=" * "
33 ERR_PREFIX=" ! "
34
35 msg() {
36         echo "$MSG_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*"
37 }
38
39 err() {
40         echo "$ERR_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*" >&2
41 }
42
43 prepare_git() {
44         cd "$BASE_DIR" || return 1
45         if [ ! -d ".git" ]; then
46                 git clone "$REPOSITORY" .
47         else
48                 git pull --ff-only | grep "Already up-to-date." >/dev/null
49                 [ $? -eq 0 ] && return 9
50                 echo
51                 git shortlog ORIG_HEAD..
52         fi
53 }
54
55 build() {
56         msg "Building \"$NAME\" ..."
57         cd "$BASE_DIR" || return 1
58         date >"$BASE_DIR/.$MYNAME.dirty" || return 1
59
60         if [ -x "./autogen.sh" ]; then
61                 eval "make $MAKE_ARGS_MAINTAINERCLEAN $QUIETCMD 2>&1"
62                 eval "./autogen.sh $QUIETCMD"
63         fi
64         if [ -x "./configure" ]; then
65                 eval "./configure $QUIETCMD"
66         fi
67         eval "make $MAKE_ARGS_BUILD $QUIETCMD"
68         return $?
69 }
70
71 check() {
72         msg "Checking \"$NAME\" ..."
73         cd "$BASE_DIR" || return 1
74
75         eval "make $MAKE_ARGS_CHECK $QUIETCMD"
76 }
77
78 archive() {
79         msg "Archiving \"$NAME\" ..."
80         cd "$BASE_DIR" || return 1
81
82         eval "make $MAKE_ARGS_DIST $QUIETCMD"
83 }
84
85 publish() {
86         msg "Publishing \"$NAME\" ..."
87         cd "$BASE_DIR" || return 1
88
89         archive=$(ls -1rt -- *.tar.gz | tail -n 1)
90         if [ -z "$archive" ]; then
91                 err "No distribution archive found!?"
92                 return 1
93         fi
94
95         mv "$archive" "$DEST_DIR"/ || return 1
96         chmod a+rX "$DEST_DIR/$(basename "$archive")"
97         rm -f "$archive" "$BASE_DIR/.$MYNAME.dirty"
98
99         msg "New \"$NAME\" archive: \"$(basename "$archive")\""
100
101         clean_up
102 }
103
104 clean_up() {
105         [ -n "$KEEP_ARCHIVES" ] || return 0
106         [ -n "$ARCHIVE_PATTERN" ] || return 0
107
108         msg "Removing outdated archives, keeping $KEEP_ARCHIVES ..."
109         cd "$DEST_DIR" || return 1
110
111         eval "ls -1t $ARCHIVE_PATTERN | sed -n '$((KEEP_ARCHIVES + 1)),9999p' | xargs -r rm"
112 }
113
114 # read in configuration
115 [ -r /etc/autobuilder/autobuilder.conf ] \
116         && . /etc/autobuilder/autobuilder.conf
117 [ -r /usr/local/etc/autobuilder/autobuilder.conf ] \
118         && . /usr/local/etc/autobuilder/autobuilder.conf
119
120 # read in and process projects in autobuild.d directory
121 for file in "$AUTOBUILDER_D_DIR"/*; do
122         file_name="$(basename "$file")"
123
124         # defaults
125         NAME=""
126         REPOSITORY=""
127         DEST_DIR=""
128         MAKE_ARGS_MAINTAINERCLEAN="maintainer-clean"
129         MAKE_ARGS_BUILD=""
130         MAKE_ARGS_CHECK="check"
131         MAKE_ARGS_DIST="dist"
132
133         if [ ! -r "$file" ]; then
134                 err "Can't read \"$file\"! Skipping."
135                 continue
136         fi
137
138         . "$file"
139
140         if [ -z "$NAME" ]; then
141                 err "$file_name: NAME no set! Skipping."
142                 continue
143         fi
144
145         if [ -z "$DEST_DIR" ]; then
146                 err "$file_name: DEST_DIR no set! Skipping."
147                 continue
148         fi
149
150         case "$TYPE" in
151           "git")
152                 ;;
153           *)
154                 err "$file_name: TYPE not set or unknown: \"$TYPE\"! Skipping."
155                 continue
156         esac
157
158         BASE_DIR="${CACHE_DIR}/${file_name}"
159         if [ ! -d "$BASE_DIR" ]; then
160                 msg "Creating base directory \"$BASE_DIR\" ..."
161                 mkdir -p "$BASE_DIR"
162                 if [ $? -ne 0 ]; then
163                         err "Failed to create directory \"$BASE_DIR\!"
164                         continue
165                 fi
166         fi
167
168         case "$TYPE" in
169           "git")
170                 prepare_git
171                 if [ $? -eq 9 ] \
172                  && [ -z "$FORCE" ] \
173                  && [ ! -e "$BASE_DIR/.$MYNAME.dirty" ]; then
174                         continue
175                 fi
176                 ;;
177         esac
178
179         build
180         if [ $? -ne 0 ]; then
181                 err "Building of \"$NAME\" FAILED!"
182                 continue
183         fi
184
185         if [ -n "$MAKE_ARGS_CHECK" ]; then
186                 check
187                 if [ $? -ne 0 ]; then
188                         err "Checking of \"$NAME\" FAILED!"
189                         continue
190                 fi
191         fi
192
193         archive
194         if [ $? -ne 0 ]; then
195                 err "Archiving of \"$NAME\" FAILED!"
196                 continue
197         fi
198
199         publish
200         if [ $? -ne 0 ]; then
201                 err "Can't publish \"$NAME\"!"
202                 continue
203         fi
204
205 done
206
207 # -eof-