Remove Ubuntu 18.04 support.

As a consequence:

• Bump minimum supported Python version to 3.7.
• Move Vagrant environment to Debian 10, which has Python 3.7.
• Move CI frontend tests to Debian 10.
• Move production build test to Debian 10.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2021-11-08 13:12:57 -08:00 committed by Tim Abbott
parent d035efd467
commit a58a71ef43
37 changed files with 95 additions and 217 deletions

View File

@ -30,13 +30,13 @@ jobs:
production_build: production_build:
# This job builds a release tarball from the current commit, which # This job builds a release tarball from the current commit, which
# will be used for all of the following install/upgrade tests. # will be used for all of the following install/upgrade tests.
name: Bionic production build name: Debian 10 production build
runs-on: ubuntu-latest runs-on: ubuntu-latest
# Docker images are built from 'tools/ci/Dockerfile'; the comments at # Docker images are built from 'tools/ci/Dockerfile'; the comments at
# the top explain how to build and upload these images. # the top explain how to build and upload these images.
# Bionic ships with Python 3.6. # Debian 10 ships with Python 3.7.3.
container: zulip/ci:bionic container: zulip/ci:buster
steps: steps:
- name: Add required permissions - name: Add required permissions
run: | run: |
@ -83,12 +83,6 @@ jobs:
key: v1-emoji-${{ github.job }}-${{ hashFiles('tools/setup/emoji/emoji_map.json') }}-${{ hashFiles('tools/setup/emoji/build_emoji') }}-${{ hashFiles('tools/setup/emoji/emoji_setup_utils.py') }}-${{ hashFiles('tools/setup/emoji/emoji_names.py') }}-${{ hashFiles('package.json') }} key: v1-emoji-${{ github.job }}-${{ hashFiles('tools/setup/emoji/emoji_map.json') }}-${{ hashFiles('tools/setup/emoji/build_emoji') }}-${{ hashFiles('tools/setup/emoji/emoji_setup_utils.py') }}-${{ hashFiles('tools/setup/emoji/emoji_names.py') }}-${{ hashFiles('package.json') }}
restore-keys: v1-emoji-${{ github.job }} restore-keys: v1-emoji-${{ github.job }}
- name: Do Bionic hack
run: |
# Temporary hack till `sudo service redis-server start` gets fixes in Bionic. See
# https://chat.zulip.org/#narrow/stream/3-backend/topic/Ubuntu.20bionic.20CircleCI
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
- name: Build production tarball - name: Build production tarball
run: ./tools/ci/production-build run: ./tools/ci/production-build
@ -115,27 +109,18 @@ jobs:
include: include:
# Docker images are built from 'tools/ci/Dockerfile'; the comments at # Docker images are built from 'tools/ci/Dockerfile'; the comments at
# the top explain how to build and upload these images. # the top explain how to build and upload these images.
- docker_image: zulip/ci:bionic
name: Bionic production install with custom db name and user
is_bionic: true
os: bionic
extra_args: --test-custom-db
- docker_image: zulip/ci:focal - docker_image: zulip/ci:focal
name: Focal production install name: Focal production install
is_focal: true
os: focal os: focal
extra_args: "" extra_args: ""
- docker_image: zulip/ci:buster - docker_image: zulip/ci:buster
name: Buster production install name: Buster production install with custom db name and user
is_buster: true
os: buster os: buster
extra_args: "" extra_args: --test-custom-db
- docker_image: zulip/ci:bullseye - docker_image: zulip/ci:bullseye
name: Bullseye production install name: Bullseye production install
is_bullseye: true
os: bullseye os: bullseye
extra_args: "" extra_args: ""
@ -181,13 +166,6 @@ jobs:
key: v1-yarn-deps-${{ matrix.os }}-${{ hashFiles('/tmp/package.json') }}-${{ hashFiles('/tmp/yarn.lock') }} key: v1-yarn-deps-${{ matrix.os }}-${{ hashFiles('/tmp/package.json') }}-${{ hashFiles('/tmp/yarn.lock') }}
restore-keys: v1-yarn-deps-${{ matrix.os }} restore-keys: v1-yarn-deps-${{ matrix.os }}
- name: Do Bionic hack
if: ${{ matrix.is_bionic }}
run: |
# Temporary hack till `sudo service redis-server start` gets fixes in Bionic. See
# https://chat.zulip.org/#narrow/stream/3-backend/topic/Ubuntu.20bionic.20CircleCI
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
- name: Install production - name: Install production
run: | run: |
sudo service rabbitmq-server restart sudo service rabbitmq-server restart

View File

@ -18,11 +18,10 @@ jobs:
include: include:
# Base images are built using `tools/ci/Dockerfile.prod.template`. # Base images are built using `tools/ci/Dockerfile.prod.template`.
# The comments at the top explain how to build and upload these images. # The comments at the top explain how to build and upload these images.
# Bionic ships with Python 3.6. # Debian 10 ships with Python 3.7.3.
- docker_image: zulip/ci:bionic - docker_image: zulip/ci:buster
name: Ubuntu 18.04 Bionic (Python 3.6, backend + frontend) name: Debian 10 Buster (Python 3.7, backend + frontend)
os: bionic os: buster
is_bionic: true
include_frontend_tests: true include_frontend_tests: true
# Focal ships with Python 3.8.2. # Focal ships with Python 3.8.2.
- docker_image: zulip/ci:focal - docker_image: zulip/ci:focal
@ -79,13 +78,6 @@ jobs:
key: v1-emoji-${{ matrix.os }}-${{ hashFiles('tools/setup/emoji/emoji_map.json') }}-${{ hashFiles('tools/setup/emoji/build_emoji') }}-${{ hashFiles('tools/setup/emoji/emoji_setup_utils.py') }}-${{ hashFiles('tools/setup/emoji/emoji_names.py') }}-${{ hashFiles('package.json') }} key: v1-emoji-${{ matrix.os }}-${{ hashFiles('tools/setup/emoji/emoji_map.json') }}-${{ hashFiles('tools/setup/emoji/build_emoji') }}-${{ hashFiles('tools/setup/emoji/emoji_setup_utils.py') }}-${{ hashFiles('tools/setup/emoji/emoji_names.py') }}-${{ hashFiles('package.json') }}
restore-keys: v1-emoji-${{ matrix.os }} restore-keys: v1-emoji-${{ matrix.os }}
- name: Do Bionic hack
if: ${{ matrix.is_bionic }}
run: |
# Temporary hack till `sudo service redis-server start` gets fixes in Bionic. See
# https://chat.zulip.org/#narrow/stream/3-backend/topic/Ubuntu.20bionic.20CircleCI
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
- name: Install dependencies - name: Install dependencies
run: | run: |
# This is the main setup job for the test suite # This is the main setup job for the test suite
@ -135,7 +127,7 @@ jobs:
source tools/ci/activate-venv source tools/ci/activate-venv
# Currently our compiled requirements files will differ for different python versions # Currently our compiled requirements files will differ for different python versions
# so we will run test-locked-requirements only for Bionic. # so we will run test-locked-requirements only for Debian 10.
# ./tools/test-locked-requirements # ./tools/test-locked-requirements
# ./tools/test-run-dev # https://github.com/zulip/zulip/pull/14233 # ./tools/test-run-dev # https://github.com/zulip/zulip/pull/14233
# #
@ -195,7 +187,7 @@ jobs:
fi fi
- name: Test locked requirements - name: Test locked requirements
if: ${{ matrix.is_bionic }} if: ${{ matrix.os == 'buster' }}
run: | run: |
. /srv/zulip-py3-venv/bin/activate && \ . /srv/zulip-py3-venv/bin/activate && \
./tools/test-locked-requirements ./tools/test-locked-requirements

19
Vagrantfile vendored
View File

@ -12,7 +12,7 @@ Vagrant.configure("2") do |config|
vm_num_cpus = "2" vm_num_cpus = "2"
vm_memory = "2048" vm_memory = "2048"
ubuntu_mirror = "" debian_mirror = ""
vboxadd_version = nil vboxadd_version = nil
config.vm.synced_folder ".", "/vagrant", disabled: true config.vm.synced_folder ".", "/vagrant", disabled: true
@ -32,7 +32,7 @@ Vagrant.configure("2") do |config|
when "HOST_IP_ADDR"; host_ip_addr = value when "HOST_IP_ADDR"; host_ip_addr = value
when "GUEST_CPUS"; vm_num_cpus = value when "GUEST_CPUS"; vm_num_cpus = value
when "GUEST_MEMORY_MB"; vm_memory = value when "GUEST_MEMORY_MB"; vm_memory = value
when "UBUNTU_MIRROR"; ubuntu_mirror = value when "DEBIAN_MIRROR"; debian_mirror = value
when "VBOXADD_VERSION"; vboxadd_version = value when "VBOXADD_VERSION"; vboxadd_version = value
end end
end end
@ -63,21 +63,21 @@ Vagrant.configure("2") do |config|
config.vm.provider "docker" do |d, override| config.vm.provider "docker" do |d, override|
d.build_dir = File.join(__dir__, "tools", "setup", "dev-vagrant-docker") d.build_dir = File.join(__dir__, "tools", "setup", "dev-vagrant-docker")
d.build_args = ["--build-arg", "VAGRANT_UID=#{Process.uid}"] d.build_args = ["--build-arg", "VAGRANT_UID=#{Process.uid}"]
if !ubuntu_mirror.empty? if !debian_mirror.empty?
d.build_args += ["--build-arg", "UBUNTU_MIRROR=#{ubuntu_mirror}"] d.build_args += ["--build-arg", "DEBIAN_MIRROR=#{debian_mirror}"]
end end
d.has_ssh = true d.has_ssh = true
d.create_args = ["--ulimit", "nofile=1024:65536"] d.create_args = ["--ulimit", "nofile=1024:65536"]
end end
config.vm.provider "virtualbox" do |vb, override| config.vm.provider "virtualbox" do |vb, override|
override.vm.box = "hashicorp/bionic64" override.vm.box = "bento/debian-10"
# It's possible we can get away with just 1.5GB; more testing needed # It's possible we can get away with just 1.5GB; more testing needed
vb.memory = vm_memory vb.memory = vm_memory
vb.cpus = vm_num_cpus vb.cpus = vm_num_cpus
if !vboxadd_version.nil? if !vboxadd_version.nil?
override.vbguest.installer = Class.new(VagrantVbguest::Installers::Ubuntu) do override.vbguest.installer = Class.new(VagrantVbguest::Installers::Debian) do
define_method(:host_version) do |reload = false| define_method(:host_version) do |reload = false|
VagrantVbguest::Version(vboxadd_version) VagrantVbguest::Version(vboxadd_version)
end end
@ -88,15 +88,14 @@ Vagrant.configure("2") do |config|
end end
config.vm.provider "hyperv" do |h, override| config.vm.provider "hyperv" do |h, override|
override.vm.box = "bento/ubuntu-18.04" override.vm.box = "bento/debian-10"
h.memory = vm_memory h.memory = vm_memory
h.maxmemory = vm_memory h.maxmemory = vm_memory
h.cpus = vm_num_cpus h.cpus = vm_num_cpus
end end
config.vm.provider "parallels" do |prl, override| config.vm.provider "parallels" do |prl, override|
override.vm.box = "bento/ubuntu-18.04" override.vm.box = "bento/debian-10"
override.vm.box_version = "202005.21.0"
prl.memory = vm_memory prl.memory = vm_memory
prl.cpus = vm_num_cpus prl.cpus = vm_num_cpus
end end
@ -105,5 +104,5 @@ Vagrant.configure("2") do |config|
# We want provision to be run with the permissions of the vagrant user. # We want provision to be run with the permissions of the vagrant user.
privileged: false, privileged: false,
path: "tools/setup/vagrant-provision", path: "tools/setup/vagrant-provision",
env: { "UBUNTU_MIRROR" => ubuntu_mirror } env: { "DEBIAN_MIRROR" => debian_mirror }
end end

View File

@ -117,7 +117,7 @@ sooner is better.
the job to fail by clicking on the failed job. This will open the job to fail by clicking on the failed job. This will open
up a page in the CI that has more details on why the job failed. up a page in the CI that has more details on why the job failed.
For example [this](https://github.com/zulip/zulip/runs/2092955762) For example [this](https://github.com/zulip/zulip/runs/2092955762)
is the page of the `Ubuntu 18.04 Bionic (Python 3.6, backend + frontend)` job. is the page of the "Debian 10 Buster (Python 3.7, backend + frontend)" job.
See our docs on [continuous integration](../testing/continuous-integration.md) See our docs on [continuous integration](../testing/continuous-integration.md)
to learn more. to learn more.

View File

@ -12,7 +12,7 @@ Contents:
If you'd like to install a Zulip development environment on a computer If you'd like to install a Zulip development environment on a computer
that's running one of: that's running one of:
- Ubuntu 20.04 Focal, 18.04 Bionic - Ubuntu 20.04 Focal
- Debian 10 Buster, 11 Bullseye (beta) - Debian 10 Buster, 11 Bullseye (beta)
- CentOS 7 (beta) - CentOS 7 (beta)
- Fedora 33 and 34 (beta) - Fedora 33 and 34 (beta)

View File

@ -1,12 +1,12 @@
## Vagrant environment setup tutorial ## Vagrant environment setup tutorial
This section guides first-time contributors through installing the This section guides first-time contributors through installing the
Zulip development environment on Windows, macOS, Ubuntu and Debian. Zulip development environment on Windows, macOS, and Linux.
The recommended method for installing the Zulip development environment is to use The recommended method for installing the Zulip development environment is to use
Vagrant with VirtualBox on Windows, and Vagrant with Docker on Vagrant with VirtualBox on Windows, and Vagrant with Docker on
macOS and Ubuntu. This method creates a virtual machine (for Windows) macOS and Linux. This method creates a virtual machine (for Windows)
or a Linux container (for macOS and Ubuntu) inside which the Zulip server and or a Linux container (for macOS and Linux) inside which the Zulip server and
all related services will run. all related services will run.
Contents: Contents:
@ -18,7 +18,7 @@ Contents:
- [Step 3: Start the development environment](#step-3-start-the-development-environment) - [Step 3: Start the development environment](#step-3-start-the-development-environment)
- [Step 4: Developing](#step-4-developing) - [Step 4: Developing](#step-4-developing)
- [Troubleshooting and common errors](#troubleshooting-and-common-errors) - [Troubleshooting and common errors](#troubleshooting-and-common-errors)
- [Specifying an Ubuntu mirror](#specifying-an-ubuntu-mirror) - [Specifying a Debian mirror](#specifying-a-debian-mirror)
- [Specifying a proxy](#specifying-a-proxy) - [Specifying a proxy](#specifying-a-proxy)
- [Customizing CPU and RAM allocation](#customizing-cpu-and-ram-allocation) - [Customizing CPU and RAM allocation](#customizing-cpu-and-ram-allocation)
@ -49,7 +49,7 @@ a proxy to access the internet.)
- **All**: 2GB available RAM, Active broadband internet connection, [GitHub account][set-up-git]. - **All**: 2GB available RAM, Active broadband internet connection, [GitHub account][set-up-git].
- **macOS**: macOS (10.11 El Capitan or newer recommended) - **macOS**: macOS (10.11 El Capitan or newer recommended)
- **Ubuntu LTS**: 20.04 or 18.04 - **Ubuntu LTS**: 20.04
- or **Debian**: 10 "buster" or 11 "bullseye" - or **Debian**: 10 "buster" or 11 "bullseye"
- **Windows**: Windows 64-bit (Win 10 recommended), hardware - **Windows**: Windows 64-bit (Win 10 recommended), hardware
virtualization enabled (VT-x or AMD-V), administrator access. virtualization enabled (VT-x or AMD-V), administrator access.
@ -233,7 +233,7 @@ projects and to instead follow these instructions exactly.)
1. In your browser, visit <https://github.com/zulip/zulip> 1. In your browser, visit <https://github.com/zulip/zulip>
and click the `fork` button. You will need to be logged in to GitHub to and click the `fork` button. You will need to be logged in to GitHub to
do this. do this.
2. Open Terminal (macOS/Ubuntu) or Git BASH (Windows; must 2. Open Terminal (macOS/Linux) or Git BASH (Windows; must
**run as an Administrator**). **run as an Administrator**).
3. In Terminal/Git BASH, 3. In Terminal/Git BASH,
[clone your fork of the Zulip repository](../git/cloning.html#step-1b-clone-to-your-machine) and [clone your fork of the Zulip repository](../git/cloning.html#step-1b-clone-to-your-machine) and
@ -285,8 +285,8 @@ vagrant up --provider=docker
The first time you run this command it will take some time because vagrant The first time you run this command it will take some time because vagrant
does the following: does the following:
- downloads the base Ubuntu 18.04 virtual machine image (for macOS and Windows) - downloads the base Debian 10 virtual machine image (for macOS and Windows)
or container (for Ubuntu) or container (for Linux)
- configures this virtual machine/container for use with Zulip, - configures this virtual machine/container for use with Zulip,
- creates a shared directory mapping your clone of the Zulip code inside the - creates a shared directory mapping your clone of the Zulip code inside the
virtual machine/container at `~/zulip` virtual machine/container at `~/zulip`
@ -324,7 +324,7 @@ $ vagrant ssh
You should see output that starts like this: You should see output that starts like this:
```console ```console
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-54-generic x86_64) Linux debian-10 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64
``` ```
Congrats, you're now inside the Zulip development environment! Congrats, you're now inside the Zulip development environment!
@ -337,7 +337,7 @@ provisioning failed and you should look at the
Next, start the Zulip server: Next, start the Zulip server:
```console ```console
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip (zulip-py3-venv) vagrant@debian-10:/srv/zulip
$ ./tools/run-dev.py $ ./tools/run-dev.py
``` ```
@ -425,7 +425,7 @@ output.
#### Committing and pushing changes with Git #### Committing and pushing changes with Git
When you're ready to commit or push changes via Git, you will do this by When you're ready to commit or push changes via Git, you will do this by
running Git commands in Terminal (macOS/Ubuntu) or Git BASH (Windows) in the running Git commands in Terminal (macOS/Linux) or Git BASH (Windows) in the
directory where you cloned Zulip on your main machine. directory where you cloned Zulip on your main machine.
If you're new to working with Git/GitHub, check out our [Git & GitHub If you're new to working with Git/GitHub, check out our [Git & GitHub
@ -485,7 +485,7 @@ From the window where run-dev.py is running:
2016-05-04 18:33:13,330 INFO 127.0.0.1 GET 200 92ms /register/ (unauth@zulip via ?) 2016-05-04 18:33:13,330 INFO 127.0.0.1 GET 200 92ms /register/ (unauth@zulip via ?)
^C ^C
KeyboardInterrupt KeyboardInterrupt
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip$ exit (zulip-py3-venv) vagrant@debian-10:/srv/zulip$ exit
logout logout
Connection to 127.0.0.1 closed. Connection to 127.0.0.1 closed.
christie@win10 ~/zulip christie@win10 ~/zulip
@ -523,7 +523,7 @@ christie@win10 ~/zulip
$ vagrant up $ vagrant up
$ vagrant ssh $ vagrant ssh
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip (zulip-py3-venv) vagrant@debian-10:/srv/zulip
$ ./tools/run-dev.py $ ./tools/run-dev.py
``` ```
@ -788,8 +788,8 @@ by rebooting the guest via `vagrant halt; vagrant up`.
The `vagrant up` command basically does the following: The `vagrant up` command basically does the following:
- Downloads an Ubuntu image and starts it using a Vagrant provider. - Downloads a Debian image and starts it using a Vagrant provider.
- Uses `vagrant ssh` to connect to that Ubuntu guest, and then runs - Uses `vagrant ssh` to connect to that Debian guest, and then runs
`tools/provision`, which has a lot of subcommands that are `tools/provision`, which has a lot of subcommands that are
executed via Python's `subprocess` module. These errors mean that executed via Python's `subprocess` module. These errors mean that
one of those subcommands failed. one of those subcommands failed.
@ -823,7 +823,7 @@ Finally, if you encounter any issues that weren't caused by your
Internet connection, please report them! We try hard to keep Zulip Internet connection, please report them! We try hard to keep Zulip
development environment provisioning free of bugs. development environment provisioning free of bugs.
##### `pip install` fails during `vagrant up` on Ubuntu ##### `pip install` fails during `vagrant up` on Linux
Likely causes are: Likely causes are:
@ -918,18 +918,18 @@ vagrant reload
vagrant reload --provision vagrant reload --provision
``` ```
### Specifying an Ubuntu mirror ### Specifying a Debian mirror
Bringing up a development environment for the first time involves Bringing up a development environment for the first time involves
downloading many packages from the Ubuntu archive. The Ubuntu cloud downloading many packages from the Debian archive. The Debian cloud
images use the global mirror `http://archive.ubuntu.com/ubuntu/` by images use the global mirror `http://deb.debian.org/debian` by
default, but you may find that you can speed up the download by using default, but you may find that you can speed up the download by using
a local mirror closer to your location. To do this, create a local mirror closer to your location. To do this, create
`~/.zulip-vagrant-config` and add a line like this, replacing the URL `~/.zulip-vagrant-config` and add a line like this, replacing the URL
as appropriate: as appropriate:
```text ```text
UBUNTU_MIRROR http://us.archive.ubuntu.com/ubuntu/ DEBIAN_MIRROR http://ftp.us.debian.org/debian
``` ```
### Specifying a proxy ### Specifying a proxy

View File

@ -62,7 +62,7 @@ branch, or a significant time has passed since you last used it.
### Test an install ### Test an install
The `test-install` tooling takes a distribution release name The `test-install` tooling takes a distribution release name
(e.g. "focal" or "bionic"), the path to an unpacked release directory (e.g. "focal"), the path to an unpacked release directory
or tarball, and then any of the normal options you want to pass down or tarball, and then any of the normal options you want to pass down
into the installer. into the installer.

View File

@ -6,10 +6,9 @@ PostgreSQL 10, 11, 12, and 13 are all supported.
Previous versions of Zulip used whatever version of PostgreSQL was Previous versions of Zulip used whatever version of PostgreSQL was
included with the base operating system (E.g. PostgreSQL 12 on Ubuntu included with the base operating system (E.g. PostgreSQL 12 on Ubuntu
Focal, 10 on Ubuntu Bionic, and 9.6 on Ubuntu Xenial). We recommend 20.04). We recommend that installations currently using older
that installations currently using older PostgreSQL releases [upgrade PostgreSQL releases [upgrade to PostgreSQL 14][upgrade-postgresql], as
to PostgreSQL 14][upgrade-postgresql], as we may drop support for we may drop support for older PostgreSQL in a future release.
older PostgreSQL in a future release.
[upgrade-postgresql]: ../production/upgrade-or-modify.html#upgrading-postgresql [upgrade-postgresql]: ../production/upgrade-or-modify.html#upgrading-postgresql

View File

@ -5,7 +5,6 @@ To run a Zulip server, you will need:
- A dedicated machine or VM - A dedicated machine or VM
- A supported OS: - A supported OS:
- Ubuntu 20.04 Focal - Ubuntu 20.04 Focal
- Ubuntu 18.04 Bionic
- Debian 11 Bullseye - Debian 11 Bullseye
- Debian 10 Buster - Debian 10 Buster
- At least 2GB RAM, and 10GB disk space - At least 2GB RAM, and 10GB disk space
@ -34,7 +33,7 @@ on issues you'll encounter](install-existing-server.md).
#### Operating system #### Operating system
Ubuntu 20.04 Focal, 18.04 Bionic, Debian 11 Bullseye, and Debian 10 Ubuntu 20.04 Focal, Debian 11 Bullseye, and Debian 10
Buster are supported for running Zulip in production. You can also Buster are supported for running Zulip in production. You can also
run Zulip on other platforms that support Docker using run Zulip on other platforms that support Docker using
[docker-zulip][docker-zulip-homepage]. [docker-zulip][docker-zulip-homepage].

View File

@ -257,8 +257,10 @@ instructions for other supported platforms.
### Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal ### Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal
1. Upgrade your server to the latest Zulip release (at least 3.0, 1. Upgrade your server to the latest Zulip `3.x` or `4.x` release (at
which adds support for Ubuntu Focal). least 3.0, which adds support for Ubuntu 20.04). You can only
upgrade to Zulip 5.0 and newer after completing this process, since
newer releases don't support Ubuntu 18.04.
2. As the Zulip user, stop the Zulip server and run the following 2. As the Zulip user, stop the Zulip server and run the following
to back up the system: to back up the system:
@ -354,15 +356,18 @@ instructions for other supported platforms.
be able to navigate to its URL and confirm everything is working be able to navigate to its URL and confirm everything is working
correctly. correctly.
6. [Upgrade to the latest Zulip release](#upgrading-to-a-release), now 6. [Upgrade to the latest `4.x` release](#upgrading-to-a-release).
that your server is running a supported operating system.
7. As root, finish by verifying the contents of the full-text indexes: 7. As root, verify the contents of the full-text indexes:
```bash ```bash
/home/zulip/deployments/current/manage.py audit_fts_indexes /home/zulip/deployments/current/manage.py audit_fts_indexes
``` ```
8. [Upgrade from Bionic to
Focal](#upgrading-from-ubuntu-18-04-bionic-to-20-04-focal), so that
you are running a supported operating system.
### Upgrading from Ubuntu 14.04 Trusty to 16.04 Xenial ### Upgrading from Ubuntu 14.04 Trusty to 16.04 Xenial
1. Upgrade your server to the latest Zulip `2.0.x` release. You can 1. Upgrade your server to the latest Zulip `2.0.x` release. You can
@ -544,7 +549,7 @@ Starting with Zulip 3.0, we use the latest available version of
PostgreSQL at installation time (currently version 14). Upgrades to PostgreSQL at installation time (currently version 14). Upgrades to
the version of PostgreSQL are no longer linked to upgrades of the the version of PostgreSQL are no longer linked to upgrades of the
distribution; that is, you may opt to upgrade to PostgreSQL 14 while distribution; that is, you may opt to upgrade to PostgreSQL 14 while
running Ubuntu 18.04 Bionic. running Ubuntu 20.04.
To upgrade the version of PostgreSQL on the Zulip server: To upgrade the version of PostgreSQL on the Zulip server:

View File

@ -120,8 +120,8 @@ extension, used by our [full-text search](full-text-search.md).
## Python packages ## Python packages
Zulip uses the version of Python itself provided by the host OS for Zulip uses the version of Python itself provided by the host OS for
the Zulip server. We currently support Python 3.6 and newer, with the Zulip server. We currently support Python 3.7 and newer, with
Ubuntu Bionic being the platform requiring 3.6 support. The comments Debian 10 being the platform requiring 3.7 support. The comments
in `.github/workflows/zulip-ci.yml` document the Python versions used in `.github/workflows/zulip-ci.yml` document the Python versions used
by each supported platform. by each supported platform.

View File

@ -33,7 +33,7 @@ preparing a new release.
Transifex and commit them. Transifex and commit them.
- Use `build-release-tarball` to generate a release tarball. - Use `build-release-tarball` to generate a release tarball.
- Test the new tarball extensively, both new install and upgrade from last - Test the new tarball extensively, both new install and upgrade from last
release, on both Bionic and Focal. release, on Ubuntu 20.04.
- Repeat until release is ready. - Repeat until release is ready.
- Send around the Paper blog post draft for review. - Send around the Paper blog post draft for review.
- Move the blog post draft to Ghost. (For a draft in Dropbox Paper, - Move the blog post draft to Ghost. (For a draft in Dropbox Paper,

View File

@ -34,17 +34,11 @@ define zulip::external_dep(
require => Zulip::Sha256_Tarball_To[$title], require => Zulip::Sha256_Tarball_To[$title],
} }
unless $::operatingsystem == 'Ubuntu' and $::operatingsystemrelease == '18.04' { tidy { "/srv/zulip-${title}-*":
# Puppet 5.5.0 and below make this always-noisy, as they spout out path => '/srv/',
# a notify line about tidying the managed directory above. Skip recurse => 1,
# on Bionic, which has that old version; they'll get tidied upon rmdirs => true,
# upgrade to 20.04. matches => "zulip-${title}-*",
tidy { "/srv/zulip-${title}-*": require => File[$dir],
path => '/srv/',
recurse => 1,
rmdirs => true,
matches => "zulip-${title}-*",
require => File[$dir],
}
} }
} }

View File

@ -29,17 +29,11 @@ class zulip::smokescreen {
ensure => file, ensure => file,
require => Exec['compile smokescreen'], require => Exec['compile smokescreen'],
} }
unless $::operatingsystem == 'Ubuntu' and $::operatingsystemrelease == '18.04' { tidy { '/usr/local/bin/smokescreen-*':
# Puppet 5.5.0 and below make this always-noisy, as they spout out path => '/usr/local/bin',
# a notify line about tidying the managed file above. Skip recurse => 1,
# on Bionic, which has that old version; they'll get tidied upon matches => 'smokescreen-*',
# upgrade to 20.04. require => Exec['compile smokescreen'],
tidy { '/usr/local/bin/smokescreen-*':
path => '/usr/local/bin',
recurse => 1,
matches => 'smokescreen-*',
require => Exec['compile smokescreen'],
}
} }
$listen_address = zulipconf('http_proxy', 'listen_address', '127.0.0.1') $listen_address = zulipconf('http_proxy', 'listen_address', '127.0.0.1')

View File

@ -8,9 +8,6 @@ Django[argon2]==3.2.*
# needed for Literal, TypedDict # needed for Literal, TypedDict
typing-extensions typing-extensions
# Backport of @dataclass
dataclasses;python_version<"3.7"
# Needed for rendering backend templates # Needed for rendering backend templates
Jinja2 Jinja2

View File

@ -355,18 +355,6 @@ cssutils==2.3.0 \
--hash=sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46 \ --hash=sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46 \
--hash=sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00 --hash=sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00
# via premailer # via premailer
dataclasses==0.8 ; python_version < "3.7" \
--hash=sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf \
--hash=sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97
# via
# -r requirements/common.in
# argon2-cffi
# black
# dataclasses-json
# libcst
# pyre-check
# testslide
# werkzeug
dataclasses-json==0.5.6 \ dataclasses-json==0.5.6 \
--hash=sha256:1d7f3a284a49d350ddbabde0e7d0c5ffa34a144aaf1bcb5b9f2c87673ff0c76e \ --hash=sha256:1d7f3a284a49d350ddbabde0e7d0c5ffa34a144aaf1bcb5b9f2c87673ff0c76e \
--hash=sha256:1f60be3405dee30b86ffbf6a436db8ba5efaeeb676bfda358e516a97aa7dfce4 --hash=sha256:1f60be3405dee30b86ffbf6a436db8ba5efaeeb676bfda358e516a97aa7dfce4

View File

@ -217,13 +217,6 @@ cssutils==2.3.0 \
--hash=sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46 \ --hash=sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46 \
--hash=sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00 --hash=sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00
# via premailer # via premailer
dataclasses==0.8 ; python_version < "3.7" \
--hash=sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf \
--hash=sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97
# via
# -r requirements/common.in
# argon2-cffi
# werkzeug
decorator==5.1.0 \ decorator==5.1.0 \
--hash=sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374 \ --hash=sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374 \
--hash=sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7 --hash=sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7

View File

@ -212,7 +212,7 @@ if [ -f /etc/os-release ]; then
fi fi
case "$os_id$os_version_id" in case "$os_id$os_version_id" in
debian10 | debian11 | ubuntu18.04 | ubuntu20.04) ;; debian10 | debian11 | ubuntu20.04) ;;
*) *)
set +x set +x
cat <<EOF cat <<EOF
@ -222,7 +222,6 @@ Unsupported OS release: $os_id $os_version_id
Zulip in production is supported only on: Zulip in production is supported only on:
- Debian 10 "buster" - Debian 10 "buster"
- Debian 11 "bullseye" - Debian 11 "bullseye"
- Ubuntu 18.04 LTS "bionic"
- Ubuntu 20.04 LTS "focal" - Ubuntu 20.04 LTS "focal"
For more information, see: For more information, see:

View File

@ -61,6 +61,7 @@ def error_desupported_os(vendor: str, os_version: str) -> "NoReturn":
UNSUPPORTED_DISTROS = [ UNSUPPORTED_DISTROS = [
("ubuntu", "14.04"), ("ubuntu", "14.04"),
("ubuntu", "16.04"), ("ubuntu", "16.04"),
("ubuntu", "18.04"),
("debian", "9"), ("debian", "9"),
] ]
distro_info = parse_os_release() distro_info = parse_os_release()
@ -127,7 +128,6 @@ if os.path.exists("/etc/init.d/postgresql"):
if not postgresql_version: if not postgresql_version:
default_postgresql_version = { default_postgresql_version = {
("debian", "10"): "11", ("debian", "10"): "11",
("ubuntu", "18.04"): "10",
("ubuntu", "20.04"): "12", ("ubuntu", "20.04"): "12",
("centos", "7"): "11", ("centos", "7"): "11",
} }

View File

@ -1,2 +0,0 @@
deb http://www.ksplice.com/apt bionic ksplice
deb-src http://www.ksplice.com/apt bionic ksplice

View File

@ -1 +0,0 @@
deb https://deb.releases.teleport.dev/ stable main

View File

@ -1,5 +0,0 @@
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
deb-src http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
deb http://ppa.launchpad.net/groonga/ppa/ubuntu bionic main
deb-src http://ppa.launchpad.net/groonga/ppa/ubuntu bionic main

View File

@ -1,5 +0,0 @@
deb http://apt.postgresql.org/pub/repos/apt/ cosmic-pgdg main
deb-src http://apt.postgresql.org/pub/repos/apt/ cosmic-pgdg main
deb http://ppa.launchpad.net/groonga/ppa/ubuntu cosmic main
deb-src http://ppa.launchpad.net/groonga/ppa/ubuntu cosmic main

View File

@ -1,5 +0,0 @@
deb http://apt.postgresql.org/pub/repos/apt/ disco-pgdg main
deb-src http://apt.postgresql.org/pub/repos/apt/ disco-pgdg main
deb http://ppa.launchpad.net/groonga/ppa/ubuntu disco main
deb-src http://ppa.launchpad.net/groonga/ppa/ubuntu disco main

View File

@ -1,5 +0,0 @@
deb http://apt.postgresql.org/pub/repos/apt/ eoan-pgdg main
deb-src http://apt.postgresql.org/pub/repos/apt/ eoan-pgdg main
deb http://ppa.launchpad.net/groonga/ppa/ubuntu eoan main
deb-src http://ppa.launchpad.net/groonga/ppa/ubuntu eoan main

View File

@ -258,7 +258,7 @@ After running the above command, you should see something similar to:
Using `manage.py` from within the Zulip development environment: Using `manage.py` from within the Zulip development environment:
```console ```console
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip$ (zulip-py3-venv) vagrant@debian-10:/srv/zulip$
./manage.py send_webhook_fixture_message \ ./manage.py send_webhook_fixture_message \
--fixture=zerver/webhooks/helloworld/fixtures/hello.json \ --fixture=zerver/webhooks/helloworld/fixtures/hello.json \
'--url=http://localhost:9991/api/v1/external/helloworld?api_key=<api_key>' '--url=http://localhost:9991/api/v1/external/helloworld?api_key=<api_key>'
@ -384,7 +384,7 @@ Once you have written some tests, you can run just these new tests from within
the Zulip development environment with this command: the Zulip development environment with this command:
```console ```console
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip$ (zulip-py3-venv) vagrant@debian-10:/srv/zulip$
./tools/test-backend zerver/webhooks/helloworld ./tools/test-backend zerver/webhooks/helloworld
``` ```
@ -433,7 +433,7 @@ stream name:
To trigger a notification using this webhook, use To trigger a notification using this webhook, use
`send_webhook_fixture_message` from the Zulip command line: `send_webhook_fixture_message` from the Zulip command line:
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip$ (zulip-py3-venv) vagrant@debian-10:/srv/zulip$
./manage.py send_webhook_fixture_message \ ./manage.py send_webhook_fixture_message \
--fixture=zerver/tests/fixtures/helloworld/hello.json \ --fixture=zerver/tests/fixtures/helloworld/hello.json \
'--url=http://localhost:9991/api/v1/external/helloworld?api_key=&lt;api_key&gt;' '--url=http://localhost:9991/api/v1/external/helloworld?api_key=&lt;api_key&gt;'

View File

@ -1,12 +1,12 @@
# Dockerfile for a generic Ubuntu image with just the basics we need # Dockerfile for a generic Debian/Ubuntu image with just the basics we
# to make it suitable for CI. In particular: # need to make it suitable for CI. In particular:
# * a non-root user to run as (a pain to try to do in setup, # * a non-root user to run as (a pain to try to do in setup,
# because by then we've already cloned the repo); # because by then we've already cloned the repo);
# * Git and other basic utilities. # * Git and other basic utilities.
# To rebuild from this file for a given release, say Ubuntu 18.04 bionic: # To rebuild from this file for a given release, say Ubuntu 20.04 focal:
# docker build . --build-arg=BASE_IMAGE=ubuntu:18.04 --pull --tag=zulip/ci:bionic # docker build . --build-arg=BASE_IMAGE=ubuntu:20.04 --pull --tag=zulip/ci:focal
# docker push zulip/ci:bionic # docker push zulip/ci:focal
# #
# tools/ci/build-docker-images will rebuild all images, but not push them. # tools/ci/build-docker-images will rebuild all images, but not push them.
@ -18,16 +18,6 @@ RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
# Set the locale. # Set the locale.
ENV LC_ALL C.UTF-8 ENV LC_ALL C.UTF-8
# Upgrade git if it is less than v2.18 because GitHub Actions'
# checkout installs source code using Rest API as an optimization
# if the version is less than v2.18, which causes failure in provision
# and tests because of the lack of git being initialized.
RUN if (. /etc/os-release && [ "$ID $VERSION_ID" = 'ubuntu 18.04' ]); then \
apt-get update && \
apt-get -y install software-properties-common && \
add-apt-repository -y ppa:git-core/ppa; \
fi
# Extra packages used by Zulip. # Extra packages used by Zulip.
RUN apt-get update \ RUN apt-get update \
&& apt-get -y install --no-install-recommends \ && apt-get -y install --no-install-recommends \

View File

@ -9,11 +9,6 @@ FROM $BASE_IMAGE
# Remove already existing rabbitmq mnesia directory files # Remove already existing rabbitmq mnesia directory files
RUN sudo rm -rf /var/lib/rabbitmq/mnesia/* RUN sudo rm -rf /var/lib/rabbitmq/mnesia/*
# The bionic hack used in production suite
RUN if (. /etc/os-release && [ "$ID $VERSION_ID" = 'ubuntu 18.04' ]); then \
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf; \
fi
# Download the release tarball, start rabbitmq server and install the server # Download the release tarball, start rabbitmq server and install the server
ARG VERSION ARG VERSION
RUN cd $(mktemp -d) \ RUN cd $(mktemp -d) \

View File

@ -1,9 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eux set -eux
cd "$(dirname "${BASH_SOURCE[0]}")" cd "$(dirname "${BASH_SOURCE[0]}")"
docker build . --build-arg=BASE_IMAGE=ubuntu:18.04 --pull --tag=zulip/ci:bionic
docker build . --build-arg=BASE_IMAGE=ubuntu:20.04 --pull --tag=zulip/ci:focal docker build . --build-arg=BASE_IMAGE=ubuntu:20.04 --pull --tag=zulip/ci:focal
docker build . --build-arg=BASE_IMAGE=debian:10 --pull --tag=zulip/ci:buster docker build . --build-arg=BASE_IMAGE=debian:10 --pull --tag=zulip/ci:buster
docker build . --build-arg=BASE_IMAGE=debian:bullseye --pull --tag=zulip/ci:bullseye docker build . --build-arg=BASE_IMAGE=debian:11 --pull --tag=zulip/ci:bullseye
docker build . -f Dockerfile.prod --build-arg=BASE_IMAGE=zulip/ci:buster --build-arg=VERSION=3.4 --tag=zulip/ci:buster-3.4 docker build . -f Dockerfile.prod --build-arg=BASE_IMAGE=zulip/ci:buster --build-arg=VERSION=3.4 --tag=zulip/ci:buster-3.4
docker build . -f Dockerfile.prod --build-arg=BASE_IMAGE=zulip/ci:bullseye --build-arg=VERSION=4.7 --tag=zulip/ci:bullseye-4.7 docker build . -f Dockerfile.prod --build-arg=BASE_IMAGE=zulip/ci:bullseye --build-arg=VERSION=4.7 --tag=zulip/ci:bullseye-4.7

View File

@ -3,3 +3,4 @@
Consider using the “h1” element as a top-level heading only \(all “h1” elements are treated as top-level headings by many screen readers and other tools\)\. Consider using the “h1” element as a top-level heading only \(all “h1” elements are treated as top-level headings by many screen readers and other tools\)\.
Document uses the Unicode Private Use Area\(s\), which should not be used in publicly exchanged documents\. \(Charmod C073\) Document uses the Unicode Private Use Area\(s\), which should not be used in publicly exchanged documents\. \(Charmod C073\)
Section lacks heading\. Consider using “h2”-“h6” elements to add identifying headings to all sections\. Section lacks heading\. Consider using “h2”-“h6” elements to add identifying headings to all sections\.
Document uses the Unicode Private Use Area\(s\), which should not be used in publicly exchanged documents\. \(Charmod C073\)

View File

@ -83,8 +83,6 @@ if vendor == "debian" and os_version == "10": # buster
POSTGRESQL_VERSION = "11" POSTGRESQL_VERSION = "11"
elif vendor == "debian" and os_version == "11": # bullseye elif vendor == "debian" and os_version == "11": # bullseye
POSTGRESQL_VERSION = "13" POSTGRESQL_VERSION = "13"
elif vendor == "ubuntu" and os_version == "18.04": # bionic
POSTGRESQL_VERSION = "10"
elif vendor == "ubuntu" and os_version == "20.04": # focal elif vendor == "ubuntu" and os_version == "20.04": # focal
POSTGRESQL_VERSION = "12" POSTGRESQL_VERSION = "12"
elif vendor == "ubuntu" and os_version == "21.10": # impish elif vendor == "ubuntu" and os_version == "21.10": # impish

View File

@ -19,7 +19,7 @@ fi
os="$(. /etc/os-release && echo "$ID $VERSION_ID")" os="$(. /etc/os-release && echo "$ID $VERSION_ID")"
case "$os" in case "$os" in
'ubuntu 14.04' | 'ubuntu 16.04') 'ubuntu 14.04' | 'ubuntu 16.04' | 'ubuntu 18.04')
echo "Error: $os is no longer a supported platform for Zulip." >&2 echo "Error: $os is no longer a supported platform for Zulip." >&2
if [ -e /home/vagrant ]; then if [ -e /home/vagrant ]; then
# shellcheck disable=SC2016 # shellcheck disable=SC2016
@ -32,8 +32,8 @@ esac
python_version="$(python3 --version)" python_version="$(python3 --version)"
case "$python_version" in case "$python_version" in
Python\ 3.[0-5].*) Python\ 3.[0-6].*)
echo 'Error: Zulip requires an OS with Python 3.6 or later.' >&2 echo 'Error: Zulip requires an OS with Python 3.7 or later.' >&2
exit 1 exit 1
;; ;;
esac esac

View File

@ -1,18 +1,12 @@
FROM ubuntu:18.04 FROM debian:10
ARG UBUNTU_MIRROR ARG DEBIAN_MIRROR
# Basic packages and dependencies of docker-systemctl-replacement # Basic packages and dependencies of docker-systemctl-replacement
RUN echo locales locales/default_environment_locale select C.UTF-8 | debconf-set-selections \ RUN echo locales locales/default_environment_locale select C.UTF-8 | debconf-set-selections \
&& echo locales locales/locales_to_be_generated select "C.UTF-8 UTF-8" | debconf-set-selections \ && echo locales locales/locales_to_be_generated select "C.UTF-8 UTF-8" | debconf-set-selections \
&& { [ ! "$UBUNTU_MIRROR" ] || sed -i "s|http://\(\w*\.\)*archive\.ubuntu\.com/ubuntu/\? |$UBUNTU_MIRROR |" /etc/apt/sources.list; } \ && { [ ! "$DEBIAN_MIRROR" ] || sed -i "s|http://\(\w*\.\)*\.debian\.org/debian |$DEBIAN_MIRROR |" /etc/apt/sources.list; } \
# This restores man pages and other documentation that have been && apt-get update \
# stripped from the default Ubuntu cloud image and installs
# ubuntu-minimal and ubuntu-standard.
#
# This makes sense to do because we're using this image as a
# development environment, not a minimal production system.
&& printf 'y\n\n' | unminimize \
&& apt-get install --no-install-recommends -y \ && apt-get install --no-install-recommends -y \
ca-certificates \ ca-certificates \
curl \ curl \
@ -39,7 +33,7 @@ RUN \
&& mkdir -p /run/sshd \ && mkdir -p /run/sshd \
# docker-systemctl-replacement doesnt work with template units yet: # docker-systemctl-replacement doesnt work with template units yet:
# https://github.com/gdraheim/docker-systemctl-replacement/issues/62 # https://github.com/gdraheim/docker-systemctl-replacement/issues/62
&& ln -ns /lib/systemd/system/postgresql@.service /etc/systemd/system/multi-user.target.wants/postgresql@10-main.service \ && ln -ns /lib/systemd/system/postgresql@.service /etc/systemd/system/multi-user.target.wants/postgresql@11-main.service \
# redis fails to start with the default configuration if IPv6 is disabled: # redis fails to start with the default configuration if IPv6 is disabled:
# https://github.com/antirez/redis/pull/5598 # https://github.com/antirez/redis/pull/5598
&& dpkg-divert --add --rename /etc/default/redis-server \ && dpkg-divert --add --rename /etc/default/redis-server \

View File

@ -10,9 +10,6 @@ RELEASE="$1"
ARCH=amd64 # TODO: maybe i686 too ARCH=amd64 # TODO: maybe i686 too
case "$RELEASE" in case "$RELEASE" in
bionic)
extra_packages=(python-pip)
;;
focal) focal)
extra_packages=(python3-pip) extra_packages=(python3-pip)
;; ;;

View File

@ -48,4 +48,4 @@ API_FEATURE_LEVEL = 113
# historical commits sharing the same major version, in which case a # historical commits sharing the same major version, in which case a
# minor version bump suffices. # minor version bump suffices.
PROVISION_VERSION = "169.2" PROVISION_VERSION = "169.3"

View File

@ -1,8 +1,7 @@
import inspect import inspect
import os import os
import sys
from collections import abc from collections import abc
from typing import Any, Callable, Dict, List, Mapping, Optional, Sequence, Set, Tuple, Union from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Union
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import yaml import yaml
@ -328,15 +327,6 @@ so maybe we shouldn't mark it as intentionally undocumented in the URLs.
needs to be mapped to list.""" needs to be mapped to list."""
origin = getattr(t, "__origin__", None) origin = getattr(t, "__origin__", None)
if sys.version_info < (3, 7): # nocoverage
if origin == List:
origin = list
elif origin == Dict:
origin = dict
elif origin == Mapping:
origin = abc.Mapping
elif origin == Sequence:
origin = abc.Sequence
if not origin: if not origin:
# Then it's most likely one of the fundamental data types # Then it's most likely one of the fundamental data types

View File

@ -17,7 +17,7 @@ integration](/api/incoming-webhooks-walkthrough).
`send_webhook_fixture_message` from a [Zulip development `send_webhook_fixture_message` from a [Zulip development
environment](https://zulip.readthedocs.io/en/latest/development/overview.html): environment](https://zulip.readthedocs.io/en/latest/development/overview.html):
(zulip-py3-venv) vagrant@ubuntu-bionic:/srv/zulip$ (zulip-py3-venv) vagrant@debian-10:/srv/zulip$
./manage.py send_webhook_fixture_message \ ./manage.py send_webhook_fixture_message \
> --fixture=zerver/tests/fixtures/helloworld/hello.json \ > --fixture=zerver/tests/fixtures/helloworld/hello.json \
> '--url=http://localhost:9991/api/v1/external/helloworld?api_key=&lt;api_key&gt;' > '--url=http://localhost:9991/api/v1/external/helloworld?api_key=&lt;api_key&gt;'