16306: Merge branch 'master'
[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         --os)
29             opts[os]="$1"
30             shift
31             ;;
32         *)
33             echo >&2 "invalid argument '$arg'"
34             exit 2
35             ;;
36     esac
37 done
38
39 cleanup() {
40     if [[ -n "${buildctr}" ]]; then
41         docker rm "${buildctr}" || true
42     fi
43     if [[ -n "${installctr}" ]]; then
44         docker rm "${installctr}" || true
45     fi
46 }
47 trap cleanup ERR EXIT
48
49 version=$(git describe --tag --dirty)
50 osbase=${opts[os]:-debian:10}
51
52 mkdir -p /tmp/pkg
53
54 buildimage=arvados-buildpackage-${osbase}
55 if [[ "${opts[force-buildimage]}" || -z "$(docker images --format {{.Repository}} "${buildimage}")" ]]; then
56     (
57         echo >&2 building arvados-server...
58         cd cmd/arvados-server
59         go install
60     )
61     echo >&2 building ${buildimage}...
62     buildctr=${buildimage/:/-}
63     docker rm "${buildctr}" || true
64     docker run \
65            --name "${buildctr}" \
66            -v /tmp/pkg:/pkg \
67            -v "${GOPATH:-${HOME}/go}"/bin/arvados-server:/arvados-server:ro \
68            -v "$(pwd)":/arvados:ro \
69            "${osbase}" \
70            /arvados-server install \
71            -type package \
72            -source /arvados \
73            -package-version "${version}"
74     docker commit "${buildctr}" "${buildimage}"
75     docker rm "${buildctr}"
76     buildctr=
77 fi
78
79 pkgfile=/tmp/pkg/arvados-server-easy_${version}_amd64.deb
80 rm -v -f "${pkgfile}"
81
82 (
83     echo >&2 building arvados-dev...
84     cd cmd/arvados-dev
85     go install
86 )
87 echo >&2 building ${pkgfile}...
88 docker run --rm \
89        -v /tmp/pkg:/pkg \
90        -v "${GOPATH:-${HOME}/go}"/bin/arvados-dev:/arvados-dev:ro \
91        -v "$(pwd)":/arvados:ro \
92        "${buildimage}" \
93        /arvados-dev buildpackage \
94        -source /arvados \
95        -package-version "${version}" \
96        -output-directory /pkg
97
98 ls -l ${pkgfile}
99 (
100     echo >&2 dpkg-scanpackages...
101     cd /tmp/pkg
102     dpkg-scanpackages . | gzip > Packages.gz
103 )
104 sourcesfile=/tmp/sources.conf.d-arvados
105 echo >$sourcesfile "deb [trusted=yes] file:///pkg ./"
106
107 installimage="arvados-installpackage-${osbase}"
108 if [[ "${opts[force-installimage]}" || -z "$(docker images --format {{.Repository}} "${installimage}")" ]]; then
109     echo >&2 building ${installimage}...
110     installctr=${installimage/:/-}
111     docker rm "${installctr}" || true
112     docker run -it \
113            --name "${installctr}" \
114            -v /tmp/pkg:/pkg:ro \
115            -v ${sourcesfile}:/etc/apt/sources.list.d/arvados-local.list:ro \
116            "${osbase}" \
117            bash -c 'apt update && DEBIAN_FRONTEND=noninteractive apt install -y arvados-server-easy postgresql'
118     docker commit "${installctr}" "${installimage}"
119     docker rm "${installctr}"
120     installctr=
121 fi
122
123 echo >&2 installing ${pkgfile} in ${installimage}, then starting arvados...
124 docker run -it --rm \
125        -v /tmp/pkg:/pkg:ro \
126        -v ${sourcesfile}:/etc/apt/sources.list.d/arvados-local.list:ro \
127        "${installimage}" \
128        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 -listen-host 0.0.0.0'