summaryrefslogtreecommitdiff
path: root/Earthfile
blob: 7349e035496af48eb3095784ebec75a971ea87ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
VERSION --new-platform 0.6

FROM --platform=linux/amd64 alpine:3.15.5
ARG version=develop

WORKDIR /build

build-all:
  BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 --platform=darwin/arm64 +build

package-all:
  BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 --platform=darwin/arm64 +package

docker-all:
  BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 +docker

crosscompiler:
  # This image is missing a few platforms, so we'll add them locally
  FROM --platform=linux/amd64 bdwyertech/go-crosscompile
  RUN apk add --update --no-cache tar gzip upx >> /dev/null
  RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/armv7l-linux-musleabihf-cross.tgz" | tar zxf - -C /usr/ --strip-components=1
  RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/i686-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1
  RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/x86_64-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1

code:
  FROM --platform=linux/amd64 +crosscompiler
  COPY . /build

build:
  ARG EARTHLY_GIT_HASH # provided by Earthly
  ARG TARGETPLATFORM   # provided by Earthly
  ARG TARGETOS         # provided by Earthly
  ARG TARGETARCH       # provided by Earthly
  ARG GOOS=$TARGETOS
  ARG GOARCH=$TARGETARCH

  FROM --platform=linux/amd64 +code

  RUN echo "Finding CC configuration for $TARGETPLATFORM"
  IF [ "$TARGETPLATFORM" = "linux/amd64" ]
    ARG NAME=linux-64bit
    ARG CC=x86_64-linux-musl-gcc
    ARG CXX=x86_64-linux-musl-g++
  ELSE IF [ "$TARGETPLATFORM" = "linux/386" ]
    ARG NAME=linux-32bit
    ARG CC=i686-linux-musl-gcc
    ARG CXX=i686-linux-musl-g++
  ELSE IF [ "$TARGETPLATFORM" = "linux/arm64" ]
    ARG NAME=linux-arm64
    ARG CC=aarch64-linux-musl-gcc
    ARG CXX=aarch64-linux-musl-g++
  ELSE IF [ "$TARGETPLATFORM" = "linux/arm/v7" ]
    ARG NAME=linux-arm7
    ARG CC=armv7l-linux-musleabihf-gcc
    ARG CXX=armv7l-linux-musleabihf-g++
    ARG GOARM=7
  ELSE IF [ "$TARGETPLATFORM" = "darwin/amd64" ]
    ARG NAME=macOS-64bit
    ARG CC=o64-clang
    ARG CXX=o64-clang++
  ELSE IF [ "$TARGETPLATFORM" = "darwin/arm64" ]
    ARG NAME=macOS-arm64
    ARG CC=o64-clang
    ARG CXX=o64-clang++
  ELSE
    RUN echo "Failed to find CC configuration for $TARGETPLATFORM"
    ARG --required CC
    ARG --required CXX
  END

  ENV CGO_ENABLED=1
  ENV GOOS=$GOOS
  ENV GOARCH=$GOARCH
  ENV GOARM=$GOARM
  ENV CC=$CC
  ENV CXX=$CXX

  WORKDIR /build
  # MacOSX disallows static executables, so we omit the static flag on this platform
  RUN go build -a -installsuffix cgo -ldflags "$([ "$GOOS"z != darwinz ] && echo "-linkmode external -extldflags -static ") -s -w -X github.com/owncast/owncast/config.GitCommit=$EARTHLY_GIT_HASH -X github.com/owncast/owncast/config.VersionNumber=$version -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -tags sqlite_omit_load_extension -o owncast main.go

	# Decrease the size of the shipped binary. But only for non-Apple platforms.
  # See https://github.com/upx/upx/issues/612
  IF [ "$GOOS" != "darwin" ]
	  RUN upx --best --lzma owncast
	  # Test the binary
	  RUN upx -t owncast
  END

  SAVE ARTIFACT owncast owncast

package:
  RUN apk add --update --no-cache zip >> /dev/null

  ARG TARGETPLATFORM   # provided by Earthly
  IF [ "$TARGETPLATFORM" = "linux/amd64" ]
    ARG NAME=linux-64bit
  ELSE IF [ "$TARGETPLATFORM" = "linux/386" ]
    ARG NAME=linux-32bit
  ELSE IF [ "$TARGETPLATFORM" = "linux/arm64" ]
    ARG NAME=linux-arm64
  ELSE IF [ "$TARGETPLATFORM" = "linux/arm/v7" ]
    ARG NAME=linux-arm7
  ELSE IF [ "$TARGETPLATFORM" = "darwin/amd64" ]
    ARG NAME=macOS-64bit
  ELSE IF [ "$TARGETPLATFORM" = "darwin/arm64" ]
    ARG NAME=macOS-arm64
  ELSE
    ARG NAME=custom
  END

  COPY (+build/owncast --platform $TARGETPLATFORM) /build/dist/owncast
  ENV ZIPNAME owncast-$version-$NAME.zip
  RUN cd /build/dist && zip -r -q -8 /build/dist/owncast.zip .
  SAVE ARTIFACT --keep-ts /build/dist/owncast.zip owncast.zip AS LOCAL dist/$ZIPNAME

docker:
	# Multiple image names can be tagged at once. They should all be passed
	# in as space separated strings using the full account/repo:tag format.
	# https://github.com/earthly/earthly/blob/aea38448fa9c0064b1b70d61be717ae740689fb9/docs/earthfile/earthfile.md#assigning-multiple-image-names
  ARG TARGETPLATFORM
  FROM --platform=$TARGETPLATFORM alpine:3.15.5
  RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates unzip && update-ca-certificates
  RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast
  WORKDIR /app
  COPY --platform=$TARGETPLATFORM +package/owncast.zip /app
  RUN unzip -x owncast.zip && mkdir data

	# temporarily disable until we figure out how to move forward
  # RUN chown -R owncast:owncast /app
  # USER owncast

  ENTRYPOINT ["/app/owncast"]
  EXPOSE 8080 1935

  ARG images=ghcr.io/owncast/owncast:testing
	RUN echo "Saving images: ${images}"

	# Tag this image with the list of names
	# passed along.
	FOR --no-cache i IN ${images}
		SAVE IMAGE --push "${i}"
	END

dockerfile:
  FROM DOCKERFILE -f Dockerfile .

unit-tests:
  FROM --platform=linux/amd64 bdwyertech/go-crosscompile
  COPY . /build
	WORKDIR /build
	RUN go test ./...

api-tests:
	FROM --platform=linux/amd64 bdwyertech/go-crosscompile
	RUN apk add npm font-noto && fc-cache -f
  COPY . /build
	WORKDIR /build/test/automated/api
	RUN npm install
	RUN ./run.sh

hls-tests:
	FROM --platform=linux/amd64 bdwyertech/go-crosscompile
	RUN apk add npm font-noto && fc-cache -f
  COPY . /build
	WORKDIR /build/test/automated/hls
	RUN npm install
	RUN ./run.sh