Browse Source

Add cross compilation via Docker

theenglishway (time) 4 năm trước cách đây
mục cha
commit
77dfcf2b28
3 tập tin đã thay đổi với 72 bổ sung10 xóa
  1. 5 10
      priv/build/build.sh
  2. 36 0
      priv/build/cross_build.sh
  3. 31 0
      priv/build/debian_10/Dockerfile

+ 5 - 10
priv/build/build.sh

@@ -8,16 +8,11 @@ MIX_ENV=${MIX_ENV-prod}
 export MIX_ENV=$MIX_ENV
 
 # Run an explicit clean beforehand
-mix clean --only $MIX_ENV
-
-# Fetch deps and compile
-mix deps.get --only $MIX_ENV
-
-# Compile
-mix compile --force
-
-# Prepare the release
-mix release --overwrite
+mix do local.hex --force, \
+       clean --only $MIX_ENV, \
+       deps.get --only $MIX_ENV, \
+       compile --force, \
+       release --overwrite
 
 # Build static assets
 npm --prefix ./assets ci --progress=false --no-audit --loglevel=error

+ 36 - 0
priv/build/cross_build.sh

@@ -0,0 +1,36 @@
+#!/bin/bash
+set -euo pipefail
+set -x
+
+get_app() {
+  mix run -e "Mix.Project.config[:app] |> IO.puts" | tail -1
+}
+
+get_version() {
+  mix run -e "Mix.Project.config[:version] |> IO.puts" | tail -1
+}
+
+APP_NAME=`get_app`
+APP_VERSION=`get_version`
+OS_VERSION=${OS_VERSION?not set}
+MIX_ENV=${MIX_ENV-prod}
+
+ROOT_DIR=`pwd`
+SOURCE_DIR=$ROOT_DIR
+BUILD_DIR=$ROOT_DIR/priv/build/
+
+DOCKER_DIR=$BUILD_DIR/$OS_VERSION
+DOCKER_IMAGE_VERSION=`echo $APP_VERSION | sed "s#+#-#"`
+DOCKER_IMAGE_TAG=$APP_NAME-$OS_VERSION:$DOCKER_IMAGE_VERSION
+
+
+build_image() {
+  docker build -t $DOCKER_IMAGE_TAG $DOCKER_DIR
+}
+
+build_binary() {
+  docker run -e SOURCE_DIR=/app -e MIX_ENV=$MIX_ENV -v $ROOT_DIR:/app $DOCKER_IMAGE_TAG /app/priv/build/build.sh
+}
+
+build_image
+build_binary

+ 31 - 0
priv/build/debian_10/Dockerfile

@@ -0,0 +1,31 @@
+FROM debian:10.8-slim AS builder
+
+ENV TERM=xterm
+ENV DEBIAN_FRONTEND noninteractive
+
+RUN apt-get update && apt-get install -y locales git wget vim gnupg gnupg1 gnupg2
+
+## Set LOCALE to UTF8
+RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \
+    locale-gen en_US.UTF-8 && \
+    dpkg-reconfigure locales && \
+    /usr/sbin/update-locale LANG=en_US.UTF-8
+
+ENV LC_ALL en_US.UTF-8
+
+RUN \
+  wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && \
+  dpkg -i erlang-solutions_2.0_all.deb && \
+  rm erlang-solutions_2.0_all.deb && \
+  apt-get update -y && \
+  apt-get install -y elixir
+
+RUN apt-get install -y curl build-essential && \
+    curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
+    apt-get install -y nodejs
+
+WORKDIR /app
+ENV HOME /tmp/home
+
+USER 1000:1000
+CMD ["/bin/bash"]