diff --git a/.ci/docker-compose-file/scripts/run-emqx.sh b/.ci/docker-compose-file/scripts/run-emqx.sh index 35119a378..bf01f5a67 100755 --- a/.ci/docker-compose-file/scripts/run-emqx.sh +++ b/.ci/docker-compose-file/scripts/run-emqx.sh @@ -19,17 +19,27 @@ fi } >> .ci/docker-compose-file/conf.cluster.env is_node_up() { - local node - node="$1" - docker exec -i "$node" \ - bash -c "emqx eval \"['emqx@node1.emqx.io','emqx@node2.emqx.io'] = maps:get(running_nodes, ekka_cluster:info()).\"" > /dev/null 2>&1 + local node="$1" + if [ "${IS_ELIXIR:-no}" = "yes" ] + then + docker exec -i "$node" \ + bash -c "emqx eval \"[:\\\"emqx@node1.emqx.io\\\", :\\\"emqx@node2.emqx.io\\\"] = :ekka_cluster.info()[:running_nodes]\"" + else + docker exec -i "$node" \ + bash -c "emqx eval \"['emqx@node1.emqx.io','emqx@node2.emqx.io'] = maps:get(running_nodes, ekka_cluster:info()).\"" > /dev/null 2>&1 + fi } is_node_listening() { - local node - node="$1" - docker exec -i "$node" \ - emqx eval "ok = case gen_tcp:connect(\"localhost\", 1883, []) of {ok, P} -> gen_tcp:close(P), ok; _ -> exit(1) end." > /dev/null 2>&1 + local node="$1" + if [ "${IS_ELIXIR:-no}" = "yes" ] + then + docker exec -i "$node" \ + emqx eval ":ok = case :gen_tcp.connect('localhost', 1883, []), do: ({:ok, port} -> (:gen_tcp.close(port); :ok); _ -> :error)" > /dev/null 2>&1 + else + docker exec -i "$node" \ + emqx eval "ok = case gen_tcp:connect(\"localhost\", 1883, []) of {ok, P} -> gen_tcp:close(P), ok; _ -> exit(1) end." > /dev/null 2>&1 + fi } is_cluster_up() { diff --git a/.github/workflows/run_fvt_tests.yaml b/.github/workflows/run_fvt_tests.yaml index 882f4dd4b..a9eb20a87 100644 --- a/.github/workflows/run_fvt_tests.yaml +++ b/.github/workflows/run_fvt_tests.yaml @@ -14,7 +14,8 @@ jobs: prepare: runs-on: ubuntu-20.04 # prepare source with any OTP version, no need for a matrix - container: ghcr.io/emqx/emqx-builder/5.0-3:24.1.5-3-alpine3.14 + # FIXME: use tagged version once merged + container: ghcr.io/emqx/emqx-builder/elixir:24.1.5-3-1.13.1-alpine3.14 steps: - uses: actions/checkout@v2 @@ -41,6 +42,7 @@ jobs: - emqx - emqx-edge - emqx-enterprise + - emqx-elixir cluster_db_backend: - mnesia - rlog @@ -82,7 +84,8 @@ jobs: - name: make docker image working-directory: source env: - EMQX_BUILDER: ghcr.io/emqx/emqx-builder/5.0-3:${{ matrix.otp }}-${{ matrix.os }} + # FIXME: use tagged version once merged + EMQX_BUILDER: ghcr.io/emqx/emqx-builder/elixir:${{ matrix.otp }}-1.13.1-${{ matrix.os }} run: | make ${{ matrix.profile }}-docker - name: run emqx @@ -91,6 +94,10 @@ jobs: run: | set -x IMAGE=emqx/${{ matrix.profile }}:$(./pkg-vsn.sh ${{ matrix.profile }}) + if [[ "${{ matrix.profile }}" = *-elixir ]] + then + export IS_ELIXIR=yes + fi ./.ci/docker-compose-file/scripts/run-emqx.sh $IMAGE ${{ matrix.cluster_db_backend }} - name: make paho tests run: | @@ -152,7 +159,8 @@ jobs: - name: make docker image working-directory: source env: - EMQX_BUILDER: ghcr.io/emqx/emqx-builder/5.0-3:${{ matrix.otp }}-${{ matrix.os }} + # FIXME: use tagged version once merged + EMQX_BUILDER: ghcr.io/emqx/emqx-builder/elixir:${{ matrix.otp }}-1.13.1-${{ matrix.os }} run: | make ${{ matrix.profile }}-docker echo "TARGET=emqx/${{ matrix.profile }}" >> $GITHUB_ENV diff --git a/Makefile b/Makefile index 1b34ee07d..e2a8dd4c2 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ REBAR_VERSION = 3.16.1-emqx-1 REBAR = $(CURDIR)/rebar3 BUILD = $(CURDIR)/build SCRIPTS = $(CURDIR)/scripts -export EMQX_DEFAULT_BUILDER = ghcr.io/emqx/emqx-builder/4.4-2:23.3.4.9-3-alpine3.14 +# FIXME: use tagged version once merged +export EMQX_DEFAULT_BUILDER = ghcr.io/emqx/emqx-builder/elixir:24.1.5-3-1.13.1-alpine3.14 export EMQX_DEFAULT_RUNNER = alpine:3.14 export OTP_VSN ?= $(shell $(CURDIR)/scripts/get-otp-vsn.sh) export ELIXIR_VSN ?= $(shell $(CURDIR)/scripts/get-elixir-vsn.sh) @@ -197,13 +198,13 @@ quickrun: ./_build/$(PROFILE)/rel/emqx/bin/emqx console ## docker target is to create docker instructions -.PHONY: $(REL_PROFILES:%=%-docker) +.PHONY: $(REL_PROFILES:%=%-docker) $(REL_PROFILES:%=%-elixir-docker) define gen-docker-target $1-docker: $(COMMON_DEPS) @$(BUILD) $1 docker endef -ALL_TGZS = $(REL_PROFILES) -$(foreach zt,$(ALL_TGZS),$(eval $(call gen-docker-target,$(zt)))) +ALL_DOCKERS = $(REL_PROFILES) $(REL_PROFILES:%=%-elixir) +$(foreach zt,$(ALL_DOCKERS),$(eval $(call gen-docker-target,$(zt)))) ## emqx-docker-testing ## emqx-enterprise-docker-testing diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index a075fcf5d..0ac6bfca4 100644 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -1,4 +1,5 @@ -ARG BUILD_FROM=ghcr.io/emqx/emqx-builder/5.0-3:24.1.5-3-alpine3.14 +# FIXME: use tagged version once merged +ARG BUILD_FROM=ghcr.io/emqx/emqx-builder/elixir:24.1.5-3-1.13.1-alpine3.14 ARG RUN_FROM=alpine:3.14 FROM ${BUILD_FROM} AS builder @@ -22,17 +23,23 @@ COPY . /emqx ARG EMQX_NAME=emqx -RUN cd /emqx \ - && rm -rf _build/$EMQX_NAME/lib \ - && make $EMQX_NAME +RUN if [[ "$EMQX_NAME" = *-elixir ]]; then \ + export EMQX_LIB_PATH="_build/prod/lib"; \ + export EMQX_REL_PATH="/emqx/_build/prod/rel/emqx"; \ + else \ + export EMQX_LIB_PATH="_build/$EMQX_NAME/lib"; \ + export EMQX_REL_PATH="/emqx/_build/$EMQX_NAME/rel/emqx"; \ + fi \ + && cd /emqx \ + && rm -rf $EMQX_LIB_PATH \ + && make $EMQX_NAME \ + && mkdir -p /emqx-rel \ + && mv $EMQX_REL_PATH /emqx-rel FROM $RUN_FROM -## define ARG again after 'FROM $RUN_FROM' -ARG EMQX_NAME=emqx - COPY deploy/docker/docker-entrypoint.sh /usr/bin/ -COPY --from=builder /emqx/_build/$EMQX_NAME/rel/emqx /opt/emqx +COPY --from=builder /emqx-rel/emqx /opt/emqx RUN ln -s /opt/emqx/bin/* /usr/local/bin/ RUN apk add --no-cache curl ncurses-libs openssl sudo libstdc++ bash diff --git a/mix.exs b/mix.exs index 1c6a8d98c..4e10129cf 100644 --- a/mix.exs +++ b/mix.exs @@ -243,11 +243,21 @@ defmodule EMQXUmbrella.MixProject do bin = Path.join(release.path, "bin") etc = Path.join(release.path, "etc") + log = Path.join(release.path, "log") Mix.Generator.create_directory(bin) Mix.Generator.create_directory(etc) + Mix.Generator.create_directory(log) Mix.Generator.create_directory(Path.join(etc, "certs")) + Enum.each( + ["mnesia", "configs", "patches", "scripts"], + fn dir -> + path = Path.join([release.path, "data", dir]) + Mix.Generator.create_directory(path) + end + ) + Mix.Generator.copy_file( "apps/emqx_authz/etc/acl.conf", Path.join(etc, "acl.conf"), @@ -418,14 +428,6 @@ defmodule EMQXUmbrella.MixProject do # add those to the `:overlays` key before running `:tar`. # See: https://hexdocs.pm/mix/1.13.1/Mix.Release.html#__struct__/0 defp prepare_tar_overlays(release) do - Enum.each( - ["mnesia", "configs", "patches", "scripts"], - fn dir -> - path = Path.join([release.path, "data", dir]) - File.mkdir_p!(path) - end - ) - Map.update!(release, :overlays, &["etc", "data" | &1]) end