]> git.arvados.org - arvados.git/blob - tools/ansible/install-dev-tools.yml
20311: Include CWL schemas in Python packages
[arvados.git] / tools / ansible / install-dev-tools.yml
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4 #
5 # install-dev-tools.yml - Install Arvados development tooling
6 #
7 ### Introduction
8 #
9 # This playbook installs and configures software necessary for Arvados
10 # development. It uses host groups from your inventory to select which
11 # dependencies are managed.
12 #
13 # The most inclusive group is `arvados_test_all`. Hosts in this group will
14 # have everything they need to clone the Arvados source and run
15 # `build/run-tests.sh`.
16 #
17 # Another useful group is `arvados_build_one_target`. Hosts in this group
18 # will have enough software to build Arvados istribution packages. It's
19 # meant to run inside Docker containers for different target distributions.
20 #
21 ### Example Inventory
22 #
23 # arvados_test_all:
24 #   hosts:
25 #     dev.arvados.example:
26 #   vars:
27 #     # See files/default-test-config.yml for an example.
28 #     # You can change the Arvados database configuration and this playbook
29 #     # will set up PostgreSQL to match.
30 #     arvados_config_file: /home/example/path/arvados/config.yml
31 #
32 ### Run the playbook
33 #
34 # $ ansible-playbook -Ki YOUR-INVENTORY.yml install-dev-tools.yml
35 #
36 ### Advanced groups
37 #
38 # This documentation is aimed at Arvados developers building tooling with
39 # this playbook.
40 #
41 # The pattern of group names is `arvados_build_COMPONENT` and
42 # `arvados_test_COMPONENT`. The `build` group installs everything you need
43 # to "build" the component from source. (Exactly what that means varies by
44 # language.) `arvados_test_COMPONENT` adds everything you need to run that
45 # component's tests. Any host in an `arvados_test` group is automatically
46 # added to its corresponding `arvados_build` group.
47 #
48 # See the `core_components` variable below for the list of components. In
49 # general, it is the name of a language we have multiple components in; or
50 # the name of a component that can be tested independently in `run-tests.sh`.
51
52 - name: Bootstrap nodes
53   hosts: all
54   gather_facts: no
55   vars:
56     # The `arvados_build_one_target` group will be expanded to the
57     # `arvados_build_NAME` group for every name in this list.
58     # This corresponds to the components we build distribution packages for.
59     core_components:
60       - cwl
61       - go
62       - python
63       - ruby
64       - workbench
65     # `arvados_test_all` works similarly with additional components.
66     test_components:
67       # `arvados_build_all_targets` installs Docker+Ansible to build and run
68       # package build/test Docker images.
69       # `arvados_test_all_targets` installs additional tools necessary to
70       # orchestrate the package test Docker containers.
71       - all_targets
72       - doc
73       - java
74       - R
75
76   tasks:
77     - ansible.builtin.include_role:
78         name: distro_bootstrap
79
80     # If the host is in no `arvados` groups, add it to `arvados_test_all`.
81     - name: Build default group arvados_test_all
82       when: "hostvars[item]['group_names']|map('regex_search', '^arvados_')|select|first is undefined"
83       ansible.builtin.add_host:
84         host: "{{ item }}"
85         groups:
86           - arvados_test_all
87       loop: "{{ ansible_play_hosts }}"
88
89     - name: Expand arvados_build_one_target group
90       ansible.builtin.add_host:
91         host: "{{ item }}"
92         groups: "{{ core_components|map('replace', '', 'arvados_build_', 1) }}"
93       loop: "{{ groups.arvados_build_one_target|default([]) }}"
94
95     - name: Expand arvados_test_all group
96       ansible.builtin.add_host:
97         host: "{{ item }}"
98         groups: "{{ (core_components + test_components)|map('replace', '', 'arvados_test_', 1) }}"
99       loop: "{{ groups.arvados_test_all|default([]) }}"
100
101     - name: Add test hosts to build groups
102       ansible.builtin.add_host:
103         host: "{{ item }}"
104         groups: "{{ hostvars[item]['group_names']|map('regex_replace', '^arvados_test_', 'arvados_build_', 1)|list }}"
105       loop: "{{ ansible_play_hosts }}"
106
107 ### Core dependencies
108
109 - hosts: arvados_build_*
110   tasks:
111     - ansible.builtin.include_role:
112         name: distro_packages
113       vars:
114         task_name: Install common build tools
115         package_names:
116           - ca-certificates
117           - curl
118           - diffutils
119           - findutils
120           - git
121           - jq
122
123     - name: Set up Arvados development user
124       become: yes
125       ansible.builtin.user:
126         name: "{{ arvados_dev_user|default(ansible_user_id) }}"
127       register: dev_user
128
129 # All of these test suites will spin up an entire development cluster, which
130 # requires:
131 #  * building and running arvados-server
132 #  * building Ruby gems and running the API server in test mode
133 #  * installing the Python SDK to run `run_test_server.py`
134 # So we take this as one big group, and this is the play where we set up all
135 # the prerequisites to do that.
136 - hosts: arvados_test_cwl:arvados_test_go:arvados_test_python:arvados_test_ruby
137   tasks:
138     # Most arvados ansible roles don't currently have dnf tasks, support RHEL
139     # configuration paths, etc.
140     - name: Check distribution support
141       when: "ansible_pkg_mgr != 'apt'"
142       ansible.builtin.fail:
143         msg: Install test prerequisites is currently only supported on Debian and Ubuntu
144
145     - name: Add host to prerequisite build groups
146       ansible.builtin.add_host:
147         host: "{{ item }}"
148         groups:
149           - arvados_build_go
150           - arvados_build_python
151           - arvados_build_ruby
152       loop: "{{ ansible_play_hosts }}"
153
154     - name: Load Arvados configuration file
155       delegate_to: localhost
156       ansible.builtin.include_vars:
157         name: arvados_config
158         file: "{{ arvados_config_file }}"
159
160     - name: Load Arvados cluster configuration
161       ansible.builtin.set_fact:
162         arvados_cluster: "{{ arvados_config.Clusters.zzzzz }}"
163       failed_when: arvados_cluster is undefined
164
165     - name: Install shared test dependencies
166       become: yes
167       ansible.builtin.apt:
168         name:
169           - locales
170           - nginx
171           - openssl
172           # Direct dependencies of run-tests.sh
173           - bsdextrautils
174           - net-tools
175
176     # Tests assume the underlying database uses en_US.UTF-8.
177     # It must be generated before starting the PostgreSQL server.
178     - name: Configure en_US.UTF-8 locale
179       become: yes
180       ansible.builtin.lineinfile:
181         path: /etc/locale.gen
182         regexp: "^[# ]*en_US.UTF-8 +UTF-8 *$"
183         line: en_US.UTF-8 UTF-8
184       register: locale_gen
185
186     - name: Run locale-gen
187       when: locale_gen.changed
188       become: yes
189       ansible.builtin.command:
190         cmd: locale-gen
191
192     - ansible.builtin.include_role:
193         name: arvados_postgresql
194       vars:
195         arvados_postgresql_config: {}
196         arvados_postgresql_hba_sources:
197           - "127.0.0.0/24"
198           - "::1/128"
199
200     - ansible.builtin.include_role:
201         name: arvados_database
202       vars:
203         arvados_database_login_host: ""
204         # Let the test user drop and recreate the database wholesale
205         arvados_database_role_attr_flags: CREATEDB
206
207     - name: Set up .config/arvados
208       become: yes
209       become_user: "{{ dev_user.name }}"
210       ansible.builtin.file:
211         path: "{{ (dev_user.home, item)|path_join }}"
212         state: directory
213       loop:
214         - .config
215         - .config/arvados
216
217     - name: Write arvados/config.yml for testing
218       become: yes
219       become_user: "{{ dev_user.name }}"
220       ansible.builtin.copy:
221         src: "{{ arvados_config_file }}"
222         dest: "{{ (dev_user.home, '.config/arvados/config.yml')|path_join }}"
223         mode: 0600
224
225     - name: Add Arvados test configuration to profile.d
226       become: yes
227       ansible.builtin.copy:
228         content: |
229           if [ -z "${CONFIGSRC:-}" ] && [ -e ~/.config/arvados/config.yml ]; then
230             export CONFIGSRC="$HOME/.config/arvados"
231           fi
232         dest: /etc/profile.d/arvados-test.sh
233
234 ### Core language build dependencies
235
236 - hosts: arvados_build_go
237   tasks:
238     - ansible.builtin.include_role:
239         name: arvados_go
240
241     - ansible.builtin.include_role:
242         name: distro_packages
243       vars:
244         task_name: Install Go build dependencies
245         package_names:
246           - libpam-dev
247
248 - hosts: arvados_build_python
249   tasks:
250     - ansible.builtin.include_role:
251         name: distro_packages
252       vars:
253         task_name: Install Python build requirements
254         package_names:
255           - g++
256           - libcurl4-openssl-dev
257           - libfuse-dev
258           - libssl-dev
259           - make
260           - pkgconf
261           - python3-dev
262           - python3-venv
263
264 - hosts: arvados_build_ruby
265   tasks:
266     - ansible.builtin.include_role:
267         name: distro_dnf
268       vars:
269         arvados_dnf_modules:
270           - ruby
271
272     - ansible.builtin.include_role:
273         name: distro_packages
274       vars:
275         task_name: Install Ruby build requirements
276         package_names:
277           - bison
278           - g++
279           - libcurl4-openssl-dev
280           - libpq-dev
281           - libssl-dev
282           - libyaml-dev
283           - make
284           - pkgconf
285           - postgresql-client
286           - procps
287           - ruby
288           - ruby-dev
289           - shared-mime-info
290           - zlib1g-dev
291
292     - name: Install bundler gem
293       become: yes
294       community.general.gem:
295         name: bundler
296         user_install: no
297         version: "~> 2.4.22"
298
299 ### Distribution package dependencies
300 # These are ordered here because they depend on the core language
301 # dependencies above, but some of the language test suites later expand the
302 # Docker installation.
303
304 - hosts: arvados_build_one_target
305   tasks:
306     - name: Get Ruby version
307       ansible.builtin.command:
308         argv:
309           - ruby
310           - "-e"
311           - print RUBY_VERSION
312       register: ruby_version
313
314     # This is a dependency of fpm that dropped support for Ruby 2.7
315     # in its 3.0 release.
316     - name: Install dotenv gem
317       when: "ruby_version.stdout is version('3.0.0', operator='<')"
318       become: yes
319       community.general.gem:
320         name: dotenv
321         user_install: no
322         version: "~> 2.8"
323
324     - name: Install fpm gem
325       become: yes
326       community.general.gem:
327         name: fpm
328         user_install: no
329         version: "~> 1.16"
330
331     - name: Install rpm-build
332       when: "ansible_pkg_mgr == 'dnf'"
333       become: yes
334       ansible.builtin.dnf:
335         name:
336           - rpm-build
337
338 - hosts: arvados_build_all_targets
339   tasks:
340     - ansible.builtin.include_role:
341         name: arvados_ansible
342       vars:
343         arvados_ansible_galaxy_user: "{{ dev_user.name }}"
344
345     - ansible.builtin.include_role:
346         name: arvados_docker
347
348     - name: Add development user to docker group
349       become: yes
350       ansible.builtin.user:
351         name: "{{ dev_user.name }}"
352         groups:
353           - docker
354         append: yes
355
356 - hosts: arvados_test_all_targets
357   tasks:
358     - name: Install package test dependencies
359       become: yes
360       ansible.builtin.apt:
361         name:
362           - apt-utils
363           - createrepo-c
364           - dpkg-dev
365
366 ### Core language test dependencies
367
368 - hosts: arvados_test_cwl:arvados_test_go
369   tasks:
370     - ansible.builtin.include_role:
371         name: arvados_compute
372       vars:
373         arvados_compute_packages: []
374         arvados_compute_docker: true
375         arvados_compute_singularity: "{{ 'arvados_test_go' in group_names }}"
376
377     - name: Add development user to docker group
378       become: yes
379       ansible.builtin.user:
380         name: "{{ dev_user.name }}"
381         groups:
382           - docker
383         append: yes
384
385 - hosts: arvados_test_go
386   tasks:
387     - name: Install Go test dependencies
388       become: yes
389       ansible.builtin.apt:
390         name:
391           # lib/controller
392           - rsync
393           # services/keep-web
394           - cadaver
395           - mime-support
396
397 ### Individual component dependencies
398
399 - hosts: arvados_build_doc
400   tasks:
401     - name: Install doc build requirements
402       become: yes
403       ansible.builtin.apt:
404         name:
405           - python3-venv
406           - ruby
407
408 - hosts: arvados_test_doc
409   tasks:
410     - name: Install doc test requirements
411       become: yes
412       ansible.builtin.apt:
413         name:
414           - linkchecker
415
416 - hosts: arvados_build_java
417   tasks:
418     - name: Install Java build requirements
419       become: yes
420       ansible.builtin.apt:
421         name:
422           - default-jdk-headless
423           - gradle
424
425 - hosts: arvados_build_R
426   tasks:
427     - name: Install R build requirements
428       become: yes
429       ansible.builtin.apt:
430         name:
431           - g++
432           - libfontconfig1-dev
433           - libfreetype6-dev
434           - libfribidi-dev
435           - libharfbuzz-dev
436           - libjpeg-dev
437           - libpng-dev
438           - libtiff5-dev
439           - libxml2-dev
440           - make
441           - r-base
442
443 - hosts: arvados_test_R
444   tasks:
445     - name: Install R test requirements
446       become: yes
447       ansible.builtin.apt:
448         name:
449           - r-cran-testthat
450
451 - hosts: arvados_build_workbench
452   tasks:
453     - ansible.builtin.include_role:
454         name: arvados_nodejs
455
456 - hosts: arvados_test_workbench
457   tasks:
458     - name: Install Workbench test requirements
459       become: yes
460       ansible.builtin.apt:
461         name:
462           # <https://docs.cypress.io/app/get-started/install-cypress#Linux-Prerequisites>
463           - firefox-esr
464           - libasound2
465           - libgbm-dev
466           - libgtk-3-0
467           - libgtk2.0-0
468           - libnotify-dev
469           - libnss3
470           - libxss1
471           - libxtst6
472           - xauth
473           - xvfb
474
475     - name: Check fs.inotify.max_user_watches sysctl value
476       ansible.builtin.command:
477         cmd: /sbin/sysctl --values fs.inotify.max_user_watches
478       register: max_user_watches_value
479
480     - name: Increase fs.inotify.max_user_watches
481       vars:
482         max_user_watches_wanted: 524288
483       when: "max_user_watches_value.stdout|int < max_user_watches_wanted"
484       become: yes
485       ansible.builtin.command:
486         argv:
487           - sysctl
488           - "fs.inotify.max_user_watches={{ max_user_watches_wanted }}"
489       register: max_user_watches_set
490
491     - name: Set fs.inotify.max_user_watches permanently
492       when: max_user_watches_set.changed
493       become: yes
494       ansible.builtin.copy:
495         content: |
496           ### This file is managed by Ansible
497           # React sets many inotify watchers and needs the limit increased.
498           {{ max_user_watches_set.stdout }}
499         dest: /etc/sysctl.d/arvados-workbench.conf
500         owner: root
501         group: root
502         mode: 0644