Statistics
| Branch: | Tag: | Revision:

root / devtools / fabfile.py @ 4319c408

History | View | Annotate | Download (9 kB)

1 5832c79d Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
2 5832c79d Kostas Papadimitriou
#
3 5832c79d Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 5832c79d Kostas Papadimitriou
# without modification, are permitted provided that the following
5 5832c79d Kostas Papadimitriou
# conditions are met:
6 5832c79d Kostas Papadimitriou
#
7 5832c79d Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 5832c79d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 5832c79d Kostas Papadimitriou
#      disclaimer.
10 5832c79d Kostas Papadimitriou
#
11 5832c79d Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 5832c79d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 5832c79d Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 5832c79d Kostas Papadimitriou
#      provided with the distribution.
15 5832c79d Kostas Papadimitriou
#
16 5832c79d Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5832c79d Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5832c79d Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5832c79d Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5832c79d Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5832c79d Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5832c79d Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5832c79d Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5832c79d Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5832c79d Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5832c79d Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5832c79d Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 5832c79d Kostas Papadimitriou
#
29 5832c79d Kostas Papadimitriou
# The views and conclusions contained in the software and
30 5832c79d Kostas Papadimitriou
# documentation are those of the authors and should not be
31 5832c79d Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 5832c79d Kostas Papadimitriou
# or implied, of GRNET S.A.
33 5832c79d Kostas Papadimitriou
#
34 5832c79d Kostas Papadimitriou
35 5832c79d Kostas Papadimitriou
import os
36 5832c79d Kostas Papadimitriou
import sys
37 5832c79d Kostas Papadimitriou
38 f3d68c6f Kostas Papadimitriou
from contextlib import contextmanager
39 5832c79d Kostas Papadimitriou
from fabric.api import *
40 5832c79d Kostas Papadimitriou
from fabric.colors import *
41 5832c79d Kostas Papadimitriou
42 5832c79d Kostas Papadimitriou
env.project_root = "./"
43 5832c79d Kostas Papadimitriou
env.develop = False
44 5832c79d Kostas Papadimitriou
env.autoremove = True
45 34a6b2c9 Vangelis Koukis
46 8bf93821 Kostas Papadimitriou
env.packages = ['snf-common', 'snf-cyclades-app', 'snf-cyclades-gtools',
47 34a6b2c9 Vangelis Koukis
                'snf-webproject', 'snf-pithos-backend', 'snf-pithos-app',
48 34a6b2c9 Vangelis Koukis
                'snf-pithos-tools', 'snf-astakos-app']
49 34a6b2c9 Vangelis Koukis
50 5832c79d Kostas Papadimitriou
env.capture = False
51 5832c79d Kostas Papadimitriou
env.colors = True
52 fec363b3 Kostas Papadimitriou
env.pypi_root = 'pypi'
53 fec363b3 Kostas Papadimitriou
env.roledefs = {
54 fec363b3 Kostas Papadimitriou
    'docs': ['docs.dev.grnet.gr'],
55 fec363b3 Kostas Papadimitriou
    'pypi': ['docs.dev.grnet.gr']
56 fec363b3 Kostas Papadimitriou
}
57 5832c79d Kostas Papadimitriou
58 c1129823 Kostas Papadimitriou
59 77bdcdd0 Vangelis Koukis
# colored logging
60 5832c79d Kostas Papadimitriou
notice = lambda x: sys.stdout.write(yellow(x) + "\n")
61 5832c79d Kostas Papadimitriou
info = lambda x: sys.stdout.write(green(x) + "\n")
62 5832c79d Kostas Papadimitriou
error = lambda x: sys.stdout.write(red(x) + "\n")
63 5832c79d Kostas Papadimitriou
64 096f0cc3 Vangelis Koukis
65 5832c79d Kostas Papadimitriou
def dev():
66 5832c79d Kostas Papadimitriou
    env.develop = True
67 5832c79d Kostas Papadimitriou
68 e4740989 Vangelis Koukis
69 5832c79d Kostas Papadimitriou
# wrap local to respect global capturing setting from env.capture
70 5832c79d Kostas Papadimitriou
oldlocal = local
71 717adf72 Sofia Papagiannaki
72 717adf72 Sofia Papagiannaki
73 f3d68c6f Kostas Papadimitriou
def local(cmd, capture="default"):
74 f3d68c6f Kostas Papadimitriou
    if capture != "default":
75 f3d68c6f Kostas Papadimitriou
        capture = capture
76 f3d68c6f Kostas Papadimitriou
    else:
77 f3d68c6f Kostas Papadimitriou
        capture = env.capture
78 f3d68c6f Kostas Papadimitriou
    return oldlocal(cmd, capture=capture)
79 5832c79d Kostas Papadimitriou
80 5832c79d Kostas Papadimitriou
81 5832c79d Kostas Papadimitriou
def package_root(p):
82 5832c79d Kostas Papadimitriou
    return os.path.join(env.project_root, p)
83 5832c79d Kostas Papadimitriou
84 5832c79d Kostas Papadimitriou
85 5832c79d Kostas Papadimitriou
def remove_pkg(p):
86 5832c79d Kostas Papadimitriou
    notice("uninstalling package: %s" % p)
87 5832c79d Kostas Papadimitriou
    with lcd(package_root(p)):
88 5832c79d Kostas Papadimitriou
        with settings(warn_only=True):
89 5832c79d Kostas Papadimitriou
            local("pip uninstall %s -y" % p, env.capture)
90 5832c79d Kostas Papadimitriou
91 5832c79d Kostas Papadimitriou
92 5832c79d Kostas Papadimitriou
def build_pkg(p):
93 717adf72 Sofia Papagiannaki
    info("building package: %s" % p)
94 5832c79d Kostas Papadimitriou
    with lcd(package_root(p)):
95 aec8f58c Kostas Papadimitriou
        local("if [ -d dist ]; then rm -r dist; fi;")
96 aec8f58c Kostas Papadimitriou
        local("if [ -d build ]; then rm -r build; fi;")
97 fec363b3 Kostas Papadimitriou
        local("python setup.py egg_info -d sdist")
98 5832c79d Kostas Papadimitriou
99 5832c79d Kostas Papadimitriou
100 5832c79d Kostas Papadimitriou
def install_pkg(p):
101 5832c79d Kostas Papadimitriou
    info("installing package: %s" % p)
102 5832c79d Kostas Papadimitriou
    with lcd(package_root(p)):
103 5832c79d Kostas Papadimitriou
        if env.develop:
104 5832c79d Kostas Papadimitriou
            local("python setup.py develop")
105 5832c79d Kostas Papadimitriou
        else:
106 5832c79d Kostas Papadimitriou
            local("python setup.py install")
107 5832c79d Kostas Papadimitriou
108 5832c79d Kostas Papadimitriou
109 a0757a1c Kostas Papadimitriou
def install(*packages):
110 a0757a1c Kostas Papadimitriou
    for p in packages:
111 a0757a1c Kostas Papadimitriou
        install_pkg("snf-%s" % p)
112 a0757a1c Kostas Papadimitriou
113 a0757a1c Kostas Papadimitriou
114 5832c79d Kostas Papadimitriou
def buildall():
115 5832c79d Kostas Papadimitriou
    for p in env.packages:
116 5832c79d Kostas Papadimitriou
        build_pkg(p)
117 5832c79d Kostas Papadimitriou
    collectdists()
118 5832c79d Kostas Papadimitriou
119 5832c79d Kostas Papadimitriou
120 a0757a1c Kostas Papadimitriou
def installall():
121 a0757a1c Kostas Papadimitriou
    for p in env.packages:
122 a0757a1c Kostas Papadimitriou
        install_pkg(p)
123 a0757a1c Kostas Papadimitriou
124 77bdcdd0 Vangelis Koukis
125 5832c79d Kostas Papadimitriou
def collectdists():
126 5832c79d Kostas Papadimitriou
    if os.path.exists("./packages"):
127 5832c79d Kostas Papadimitriou
        notice("removing 'packages' directory")
128 717adf72 Sofia Papagiannaki
        local("rm -r packages")
129 5832c79d Kostas Papadimitriou
130 717adf72 Sofia Papagiannaki
    local("mkdir packages")
131 5832c79d Kostas Papadimitriou
    for p in env.packages:
132 717adf72 Sofia Papagiannaki
        local("cp %s/dist/*.tar.gz ./packages/" % package_root(p))
133 5832c79d Kostas Papadimitriou
134 77bdcdd0 Vangelis Koukis
135 5832c79d Kostas Papadimitriou
def removeall():
136 5832c79d Kostas Papadimitriou
    for p in env.packages:
137 5832c79d Kostas Papadimitriou
        remove_pkg(p)
138 5832c79d Kostas Papadimitriou
139 5832c79d Kostas Papadimitriou
140 5832c79d Kostas Papadimitriou
def remove(*packages):
141 5832c79d Kostas Papadimitriou
    for p in packages:
142 5832c79d Kostas Papadimitriou
        remove_pkg("snf-%s" % p)
143 5832c79d Kostas Papadimitriou
144 5832c79d Kostas Papadimitriou
145 f3d68c6f Kostas Papadimitriou
#
146 f3d68c6f Kostas Papadimitriou
# GIT helpers
147 f3d68c6f Kostas Papadimitriou
#
148 f3d68c6f Kostas Papadimitriou
149 f3d68c6f Kostas Papadimitriou
150 f3d68c6f Kostas Papadimitriou
def git(params, locl=True):
151 f3d68c6f Kostas Papadimitriou
    cmd = local if locl else run
152 f3d68c6f Kostas Papadimitriou
    return cmd("git %s" % params, capture=True)
153 f3d68c6f Kostas Papadimitriou
154 f3d68c6f Kostas Papadimitriou
155 f3d68c6f Kostas Papadimitriou
def branch():
156 f3d68c6f Kostas Papadimitriou
    return git("symbolic-ref HEAD").split("/")[-1]
157 f3d68c6f Kostas Papadimitriou
158 f3d68c6f Kostas Papadimitriou
159 f3d68c6f Kostas Papadimitriou
@contextmanager
160 f3d68c6f Kostas Papadimitriou
def co(c):
161 717adf72 Sofia Papagiannaki
    current_branch = branch()
162 f3d68c6f Kostas Papadimitriou
    git("checkout %s" % c)
163 98df1105 Vangelis Koukis
    # Use a try block to make sure we checkout the original branch.
164 98df1105 Vangelis Koukis
    try:
165 98df1105 Vangelis Koukis
        yield
166 98df1105 Vangelis Koukis
    finally:
167 096f0cc3 Vangelis Koukis
        try:
168 096f0cc3 Vangelis Koukis
            git("checkout %s" % current_branch)
169 096f0cc3 Vangelis Koukis
        except Exception:
170 096f0cc3 Vangelis Koukis
            error("Could not checkout %s, you're still left at %s" % c)
171 f3d68c6f Kostas Papadimitriou
172 f3d68c6f Kostas Papadimitriou
#
173 f3d68c6f Kostas Papadimitriou
# Debian packaging helpers
174 f3d68c6f Kostas Papadimitriou
#
175 f3d68c6f Kostas Papadimitriou
176 34a6b2c9 Vangelis Koukis
env.debian_branch = 'debian'
177 34a6b2c9 Vangelis Koukis
env.deb_packages = ['snf-common', 'snf-cyclades-app', 'snf-cyclades-gtools',
178 34a6b2c9 Vangelis Koukis
                    'snf-webproject', 'snf-pithos-backend', 'snf-pithos-tools',
179 34a6b2c9 Vangelis Koukis
                    'snf-pithos-app', 'snf-astakos-app']
180 34a6b2c9 Vangelis Koukis
env.signdebs = True
181 096f0cc3 Vangelis Koukis
env.debrelease = False  # Increase release number in Debian changelogs
182 e4740989 Vangelis Koukis
183 c1129823 Kostas Papadimitriou
def _last_commit(f):
184 c1129823 Kostas Papadimitriou
    return local("git rev-list --all --date-order --max-count=1 %s" % f,
185 717adf72 Sofia Papagiannaki
                 capture=True).strip()
186 c1129823 Kostas Papadimitriou
187 77bdcdd0 Vangelis Koukis
188 c1129823 Kostas Papadimitriou
def _diff_from_master(c,f):
189 c1129823 Kostas Papadimitriou
    return local("git log --oneline %s..master %s" \
190 c1129823 Kostas Papadimitriou
                 " | wc -l" % (c, f), capture=True)
191 c1129823 Kostas Papadimitriou
192 77bdcdd0 Vangelis Koukis
193 c1129823 Kostas Papadimitriou
def dch(p):
194 c1129823 Kostas Papadimitriou
    with co(env.debian_branch):
195 c1129823 Kostas Papadimitriou
        local("git merge master")
196 858e0ab9 Kostas Papadimitriou
        local("git merge %s" % env.upstream)
197 c1129823 Kostas Papadimitriou
        with lcd(package_root(p)):
198 096f0cc3 Vangelis Koukis
            local("if [ ! -d .git ]; then mkdir .git; fi")
199 096f0cc3 Vangelis Koukis
200 096f0cc3 Vangelis Koukis
            # FIXME:
201 096f0cc3 Vangelis Koukis
            # Checking for new changes in packages
202 096f0cc3 Vangelis Koukis
            # has been removed temporarily.
203 096f0cc3 Vangelis Koukis
            # Always create a new Debian changelog entry.
204 096f0cc3 Vangelis Koukis
            ## Check for new changes in package dir
205 096f0cc3 Vangelis Koukis
            #diff = _diff_from_master(_last_commit("debian/changelog"), ".")
206 096f0cc3 Vangelis Koukis
            #vercmd  = "git describe --tags --abbrev=0"\
207 096f0cc3 Vangelis Koukis
            #          " | sed -rn '\''s/^v(.*)/\\1/p'\''"
208 096f0cc3 Vangelis Koukis
            #version = local(vercmd, capture=True)
209 096f0cc3 Vangelis Koukis
            #if int(diff) > 0:
210 096f0cc3 Vangelis Koukis
            if True:
211 096f0cc3 Vangelis Koukis
                # Run git-dch in snapshot mode.
212 096f0cc3 Vangelis Koukis
                # TODO: Support a --release mode in fabfile
213 7e2a283b Vangelis Koukis
                if not env.debrelease:
214 7e2a283b Vangelis Koukis
                    notice(("Producing snapshot changelog entry, "
215 7e2a283b Vangelis Koukis
                            "use 'debrelease' to produce release entries."))
216 096f0cc3 Vangelis Koukis
                local(("git-dch --debian-branch=%s --auto %s" %
217 096f0cc3 Vangelis Koukis
                       (env.debian_branch,
218 096f0cc3 Vangelis Koukis
                        "--release" if env.debrelease else "--snapshot")))
219 096f0cc3 Vangelis Koukis
                local(("git commit debian/changelog"
220 096f0cc3 Vangelis Koukis
                       " -m 'Updated %s changelog'" % p))
221 096f0cc3 Vangelis Koukis
                notice(("Make sure to tag Debian release in %s" %
222 096f0cc3 Vangelis Koukis
                        env.debian_branch))
223 8dc7096e Kostas Papadimitriou
224 096f0cc3 Vangelis Koukis
            local("rmdir .git")
225 096f0cc3 Vangelis Koukis
226 096f0cc3 Vangelis Koukis
227 7e2a283b Vangelis Koukis
def dchall():
228 7e2a283b Vangelis Koukis
    for p in env.deb_packages:
229 7e2a283b Vangelis Koukis
        info("updating debian changelog for package: %s" % p)
230 7e2a283b Vangelis Koukis
        dch(p)
231 7e2a283b Vangelis Koukis
232 7e2a283b Vangelis Koukis
233 096f0cc3 Vangelis Koukis
def debrelease():
234 096f0cc3 Vangelis Koukis
    env.debrelease = True
235 c1129823 Kostas Papadimitriou
236 c1129823 Kostas Papadimitriou
237 8e7dc2ce Vangelis Koukis
def signdebs():
238 8e7dc2ce Vangelis Koukis
    env.signdebs = True
239 e4740989 Vangelis Koukis
240 f3d68c6f Kostas Papadimitriou
241 a6efa23d Kostas Papadimitriou
# Commands which automatically add and reset the version files which are not tracked by
242 a6efa23d Kostas Papadimitriou
# git. Those version files are created from each setup.py using the synnefo-common
243 a6efa23d Kostas Papadimitriou
# update_version, so we execute `python setup.py clean` to ensure that file gets
244 a6efa23d Kostas Papadimitriou
# created and git add will not fail. The reset of those files after each build
245 a6efa23d Kostas Papadimitriou
# certifies that succeded git checkouts will not fail due to existing local
246 a6efa23d Kostas Papadimitriou
# changes.
247 a6efa23d Kostas Papadimitriou
add_versions_cmd = "find . -regextype posix-egrep -regex \".*version.py$|.*\/synnefo\/versions\/.*py$\" -exec git add -f {} \;"
248 a6efa23d Kostas Papadimitriou
reset_versions_cmd = "find . -regextype posix-egrep -regex \".*version.py$|.*\/synnefo\/versions\/.*py$\" -exec git reset {} \;"
249 a6efa23d Kostas Papadimitriou
250 77bdcdd0 Vangelis Koukis
251 f3d68c6f Kostas Papadimitriou
def builddeb(p, master="master", branch="debian-0.8"):
252 e4740989 Vangelis Koukis
    with co(branch):
253 3b61a062 Vangelis Koukis
        info("Building debian package for %s" % p)
254 e4740989 Vangelis Koukis
        with lcd(package_root(p)):
255 e4740989 Vangelis Koukis
            local("git merge master")
256 e4740989 Vangelis Koukis
            local("if [ ! -d .git ]; then mkdir .git; fi")
257 c6b41340 Kostas Papadimitriou
            local("python setup.py clean")
258 a6efa23d Kostas Papadimitriou
            local(add_versions_cmd)
259 e4740989 Vangelis Koukis
            local(("git-buildpackage --git-upstream-branch=%s --git-debian-branch=%s"
260 e4740989 Vangelis Koukis
                   " --git-export=INDEX --git-ignore-new %s") %
261 717adf72 Sofia Papagiannaki
                  (master, branch, "" if env.signdebs else "-us -uc"))
262 f3d68c6f Kostas Papadimitriou
            local("rm -rf .git")
263 a6efa23d Kostas Papadimitriou
            local(reset_versions_cmd)
264 3b61a062 Vangelis Koukis
        info("Done building debian package for %s" % p)
265 f3d68c6f Kostas Papadimitriou
266 f3d68c6f Kostas Papadimitriou
267 f3d68c6f Kostas Papadimitriou
def builddeball(b="debian-0.8"):
268 f3d68c6f Kostas Papadimitriou
    for p in env.deb_packages:
269 555db578 Vangelis Koukis
        builddeb(p=p, branch=b)
270 f3d68c6f Kostas Papadimitriou
271 5832c79d Kostas Papadimitriou
272 fec363b3 Kostas Papadimitriou
@roles('pypi')
273 fec363b3 Kostas Papadimitriou
def uploadtars():
274 fec363b3 Kostas Papadimitriou
    put("packages/*.tar.gz", 'www/pypi/')
275 fec363b3 Kostas Papadimitriou
276 dc0671c0 Kostas Papadimitriou
277 dc0671c0 Kostas Papadimitriou
def cleandocs():
278 dc0671c0 Kostas Papadimitriou
    """
279 dc0671c0 Kostas Papadimitriou
    Remove _build directories for each doc project
280 dc0671c0 Kostas Papadimitriou
    """
281 dc0671c0 Kostas Papadimitriou
282 70f13b0f Vangelis Koukis
    # docs contains conf.py in root directory
283 70f13b0f Vangelis Koukis
    if os.path.exists("docs/docs/_build"):
284 70f13b0f Vangelis Koukis
        local("rm -r docs/docs/_build")
285 dc0671c0 Kostas Papadimitriou
286 dc0671c0 Kostas Papadimitriou
    for p in env.packages:
287 dc0671c0 Kostas Papadimitriou
        buildpth = os.path.join(package_root(p), 'docs', '_build')
288 dc0671c0 Kostas Papadimitriou
        if os.path.exists(buildpth):
289 dc0671c0 Kostas Papadimitriou
            local('rm -r %s' % buildpth)
290 dc0671c0 Kostas Papadimitriou
291 dc0671c0 Kostas Papadimitriou
292 dc0671c0 Kostas Papadimitriou
def builddocs():
293 dc0671c0 Kostas Papadimitriou
    """
294 dc0671c0 Kostas Papadimitriou
    Run sphinx builder for each project separately
295 dc0671c0 Kostas Papadimitriou
    """
296 dc0671c0 Kostas Papadimitriou
    builddocs_cmd = "sphinx-build -b html -d _build/doctrees   . _build/html"
297 dc0671c0 Kostas Papadimitriou
298 70f13b0f Vangelis Koukis
    # docs contains conf.py in root directory
299 70f13b0f Vangelis Koukis
    with lcd("docs"):
300 dc0671c0 Kostas Papadimitriou
        local(builddocs_cmd)
301 dc0671c0 Kostas Papadimitriou
302 dc0671c0 Kostas Papadimitriou
    for p in env.packages:
303 dc0671c0 Kostas Papadimitriou
        info("Building %s docs" % p)
304 dc0671c0 Kostas Papadimitriou
        docspth = os.path.join(package_root(p), 'docs')
305 dc0671c0 Kostas Papadimitriou
        if os.path.exists(docspth):
306 dc0671c0 Kostas Papadimitriou
            with lcd(docspth):
307 bf45cb4a Sofia Papagiannaki
                local(builddocs_cmd)