16306: Packaging dev cycle, type=production support in lib/boot.
[arvados.git] / cmd / arvados-dev / docker-build-install.sh
1 #!/bin/bash
2 # Copyright (C) The Arvados Authors. All rights reserved.
3 #
4 # SPDX-License-Identifier: AGPL-3.0
5
6 # Build an arvados-server-easy package, then install and run it on a
7 # base OS image.
8 #
9 # Examples:
10 #
11 #    docker-build-install.sh --force-buildimage --force-installimage     # always build fresh docker images
12 #
13 #    docker-build-install.sh                                             # reuse cached docker images if possible
14
15 set -e -o pipefail
16
17 declare -A opts=()
18 while [[ $# -gt 0 ]]; do
19     arg="$1"
20     shift
21     case "$arg" in
22         --force-buildimage)
23             opts[force-buildimage]=1
24             ;;
25         --force-installimage)
26             opts[force-installimage]=1
27             ;;
28         *)
29             echo >&2 "invalid argument '$arg'"
30             exit 1
31     esac
32 done
33
34 cleanup() {
35     if [[ -n "${buildctr}" ]]; then
36         docker rm "${buildctr}" || true
37     fi
38     if [[ -n "${installctr}" ]]; then
39         docker rm "${installctr}" || true
40     fi
41 }
42 trap cleanup ERR EXIT
43
44 version=$(git describe --tag --dirty)
45 osbase=debian:10
46
47 mkdir -p /tmp/pkg
48
49 buildimage=arvados-buildpackage-${osbase}
50 if [[ "${opts[force-buildimage]}" || -z "$(docker images --format {{.Repository}} "${buildimage}")" ]]; then
51     (
52         echo >&2 building arvados-server...
53         cd cmd/arvados-server
54         go install
55     )
56     echo >&2 building ${buildimage}...
57     buildctr=${buildimage/:/-}
58     docker rm "${buildctr}" || true
59     docker run \
60            --name "${buildctr}" \
61            -v /tmp/pkg:/pkg \
62            -v "${GOPATH:-${HOME}/go}"/bin/arvados-server:/arvados-server:ro \
63            -v "$(pwd)":/arvados:ro \
64            "${osbase}" \
65            /arvados-server install \
66            -type package \
67            -source /arvados \
68            -package-version "${version}"
69     docker commit "${buildctr}" "${buildimage}"
70     docker rm "${buildctr}"
71     buildctr=
72 fi
73
74 pkgfile=/tmp/pkg/arvados-server-easy_${version}_amd64.deb
75 rm -v -f "${pkgfile}"
76
77 (
78     echo >&2 building arvados-dev...
79     cd cmd/arvados-dev
80     go install
81 )
82 echo >&2 building ${pkgfile}...
83 docker run --rm \
84        -v /tmp/pkg:/pkg \
85        -v "${GOPATH:-${HOME}/go}"/bin/arvados-dev:/arvados-dev:ro \
86        -v "$(pwd)":/arvados:ro \
87        "${buildimage}" \
88        /arvados-dev buildpackage \
89        -source /arvados \
90        -package-version "${version}" \
91        -output-directory /pkg
92
93 ls -l ${pkgfile}
94 (
95     echo >&2 dpkg-scanpackages...
96     cd /tmp/pkg
97     dpkg-scanpackages . | gzip > Packages.gz
98 )
99 sourcesfile=/tmp/sources.conf.d-arvados
100 echo >$sourcesfile "deb [trusted=yes] file:///pkg ./"
101
102 installimage="arvados-installpackage-${osbase}"
103 if [[ "${opts[force-installimage]}" || -z "$(docker images --format {{.Repository}} "${installimage}")" ]]; then
104     echo >&2 building ${installimage}...
105     installctr=${installimage/:/-}
106     docker rm "${installctr}" || true
107     docker run -it \
108            --name "${installctr}" \
109            -v /tmp/pkg:/pkg:ro \
110            -v ${sourcesfile}:/etc/apt/sources.list.d/arvados-local.list:ro \
111            "${osbase}" \
112            bash -c 'apt update && DEBIAN_FRONTEND=noninteractive apt install -y arvados-server-easy postgresql'
113     docker commit "${installctr}" "${installimage}"
114     docker rm "${installctr}"
115     installctr=
116 fi
117
118 echo >&2 installing ${pkgfile} in ${installimage}, then starting arvados...
119 docker run -it --rm \
120        -v /tmp/pkg:/pkg:ro \
121        -v ${sourcesfile}:/etc/apt/sources.list.d/arvados-local.list:ro \
122        "${installimage}" \
123        bash -c 'apt update && DEBIAN_FRONTEND=noninteractive apt install --reinstall -y arvados-server-easy postgresql && /etc/init.d/postgresql start && /var/lib/arvados/bin/arvados-server init -cluster-id x1234 && /var/lib/arvados/bin/arvados-server boot'