========= Upgrading ========= Generally batou tries to be *very* friendly when upgrading from version to version so you don't have to unnecessarily change your deployments. We try to introduce new features without breaking existing semantics. Upgrading to the separated appenv bootstrap file ================================================ `appenv` is a small, separate utility that batou uses to bootstrap and update itself, introduced in batou 2. Initially we placed this file directly as `./batou` but this turned out to be hard to deal with due to its "meta argument parser". New versions of batou will automatically bootstrap this into two separate files: `./appenv` and a symlink `batou -> appenv`. To upgrade your project to this schema, follow those steps: .. code-block:: console $ curl -sL https://raw.githubusercontent.com/flyingcircusio/batou/main/appenv.py -o appenv $ chmod +x appenv $ rm batou $ ln -sf appenv batou You can now use the appenv meta commands by calling the appenv utility itself: .. code-block:: console $ ./appenv --help usage: appenv [-h] {update-lockfile,init,reset,python,run} ... positional arguments: {update-lockfile,init,reset,python,run} update-lockfile Update the lock file. init Create a new appenv project. reset Reset the environment. python Spawn the embedded Python interpreter REPL run Run a script from the bin/ directory of the virtual env. optional arguments: -h, --help show this help message and exit batou 1.x to batou 2.x ====================== This upgrade mainly consists of a switch from Python 2 to Python 3 but it also does include a few details about how things are handled. Major changes ------------- * batou requires at least Python 3.5, anything newer is fine, too. * File changes now show (expected) diffs. * You can deploy to multiple hosts at once using the `-j` option or the `jobs` option in the environment configuration. * Secrets can now also override `data-` sections for hosts. * You can now use `assert` instead of `raise UpdateNeeded` in the `verify` methods. * The embedded supervisor has been updated. Updating your deployment ------------------------ The following steps assume that you have cloned and checked out your deployment and it is your current working directory. .. code-block:: console $ curl -sL https://raw.githubusercontent.com/flyingcircusio/batou/main/bootstrap | sh The generated lockfile `requirements.lock` might not pick up all versions of all packages correctly (for example packages taken directly from source control will fail) so you might want to doublecheck those and massage the lockfile in case that this fails with something like: .. code-block:: console ERROR: No matching distribution found for batou-ext==0.1.dev0 (from -r .batou/16f85f2d/requirements.lock (line 3)) .. note:: `batou_ext` will be updated automatically to a proper Python 3 version and syntax. At this point you can now update your projects' component code to Python 3: .. code-block:: console $ 2to3 -w components After this you need to run batou in your development environment to see whether any further changes may be needed. Things you may have to change in your deployment ------------------------------------------------ * Add `sensitive_data=True` to files that may contain sensitive data and whose content you do not want to see in any logs. This suppresses diff generation. * The default hash function has been changed to `sha512` and thus existing hashes relying on the default being md5 will fail. Updating to a newer batou 2.x version ===================================== After having switched from batou 1.x to 2.x you might update to the latest ``batou`` release once in a while. This requires the following steps: * Edit ``requirements.txt`` and enter the desired version: ``batou==2.x``. - If you want to use an unreleased version use a git URL like this: ``-e git+https://github.com/flyingcircusio/batou.git#egg=batou`` instead of the ``batou==2.x`` requirement. * Run ``./appenv update-lockfile`` to update ``requirements.lock``. * Commit the changes and run ``batou`` so it can update itself to the new version. Updating from 2.2 to 2.3 ======================== To define ``Attribute``\s more explicitly the default value has to be passed in one of two ways. * ``default`` allows to pass a final python value or use a `ConfigString` value to trigger the conversion of the ``Attribute`` on a default value. This can be used for more concise code (e.g. ``Address``) or for documentation of the format for ``environment.cfg``. This way ``expand`` and ``map`` of the string will also be done.