This is an automated email from the ASF dual-hosted git repository.

young pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 3137d5795 feat(workflow): push `apisix:dev` image on commit (#12300)
3137d5795 is described below

commit 3137d5795f00d886805a3461698074705134e21e
Author: YYYoung <isk...@outlook.com>
AuthorDate: Thu Jun 12 10:24:05 2025 +0800

    feat(workflow): push `apisix:dev` image on commit (#12300)
---
 .github/workflows/push-dev-image-on-commit.yml | 68 +++++++++++++++++++++++
 Makefile                                       | 29 ++++++++++
 docker/compose/apisix_conf/master/config.yaml  | 36 +++++++++++++
 docker/compose/docker-compose-master.yaml      | 53 ++++++++++++++++++
 docker/debian-dev/Dockerfile                   | 74 ++++++++++++++++++++++++++
 docker/debian-dev/docker-entrypoint.sh         | 63 ++++++++++++++++++++++
 docker/debian-dev/install-brotli.sh            | 42 +++++++++++++++
 docker/utils/check_standalone_config.sh        | 35 ++++++++++++
 8 files changed, 400 insertions(+)

diff --git a/.github/workflows/push-dev-image-on-commit.yml 
b/.github/workflows/push-dev-image-on-commit.yml
new file mode 100644
index 000000000..432c4ed0a
--- /dev/null
+++ b/.github/workflows/push-dev-image-on-commit.yml
@@ -0,0 +1,68 @@
+name: Build and Push `apisix:dev` to DockerHub on Commit
+
+on:
+  pull_request:
+    paths-ignore:
+      - "docs/**"
+      - "**/*.md"
+  push:
+    paths-ignore:
+      - "docs/**"
+      - "**/*.md"
+  workflow_dispatch:
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    env:
+      APISIX_DOCKER_TAG: master-debian-dev
+
+    steps:
+      - name: Check out the repo
+        uses: actions/checkout@v4
+
+      - name: Build and run
+        run: |
+          make build-on-debian-dev
+          docker compose -f ./docker/compose/docker-compose-master.yaml up -d
+          sleep 30
+          docker logs compose-apisix-1
+
+      - name: Test APISIX
+        run: |
+          curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+          -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
+          {
+            "uri": "/get",
+            "upstream": {
+            "type": "roundrobin",
+            "nodes": { "httpbin.org:80": 1 }
+            }
+          }'
+
+          result_code=$(curl -I -m 10 -o /dev/null -s -w %{http_code} 
http://127.0.0.1:9080/get)
+          if [[ $result_code -ne 200 ]]; then
+            printf "result_code: %s\n" "$result_code"
+            exit 125
+          fi
+
+      - name: Login to Docker Hub
+        if: github.ref == 'refs/heads/master'
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USER }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: Set up QEMU
+        if: github.ref == 'refs/heads/master'
+        uses: docker/setup-qemu-action@v1
+
+      - name: Set up Docker Buildx
+        if: github.ref == 'refs/heads/master'
+        uses: docker/setup-buildx-action@v1
+
+      - name: Push apisix image to Docker Hub
+        if: github.ref == 'refs/heads/master'
+        run: |
+          make push-multiarch-dev-on-debian
diff --git a/Makefile b/Makefile
index 0c556559d..cc046a744 100644
--- a/Makefile
+++ b/Makefile
@@ -49,6 +49,9 @@ ENV_INST_LUADIR        ?= $(ENV_INST_PREFIX)/share/lua/5.1
 ENV_INST_BINDIR        ?= $(ENV_INST_PREFIX)/bin
 ENV_RUNTIME_VER             ?= $(shell $(ENV_NGINX_EXEC) -V 2>&1 | tr ' ' '\n' 
 | grep 'APISIX_RUNTIME_VER' | cut -d '=' -f2)
 
+IMAGE_NAME = apache/apisix
+ENV_APISIX_IMAGE_TAG_NAME  ?= $(IMAGE_NAME):$(VERSION)
+
 -include .requirements
 export
 
@@ -488,3 +491,29 @@ ci-env-stop:
        @$(call func_echo_status, "$@ -> [ Start ]")
        $(ENV_DOCKER_COMPOSE) stop
        @$(call func_echo_success_status, "$@ -> [ Done ]")
+
+### build-on-debian-dev : Build apache/apisix:xx-debian-dev image
+.PHONY: build-on-debian-dev
+build-on-debian-dev:
+       @$(call func_echo_status, "$@ -> [ Start ]")
+       $(ENV_DOCKER) build -t $(ENV_APISIX_IMAGE_TAG_NAME)-debian-dev \
+               --build-arg CODE_PATH=. \
+               --build-arg 
ENTRYPOINT_PATH=./docker/debian-dev/docker-entrypoint.sh \
+               --build-arg 
INSTALL_BROTLI=./docker/debian-dev/install-brotli.sh \
+               --build-arg 
CHECK_STANDALONE_CONFIG=./docker/utils/check_standalone_config.sh \
+               -f ./docker/debian-dev/Dockerfile .
+       @$(call func_echo_success_status, "$@ -> [ Done ]")
+
+### push-multiarch-dev-on-debian : Push apache/apisix:dev image
+.PHONY: push-multiarch-dev-on-debian
+push-multiarch-dev-on-debian:
+       @$(call func_echo_status, "$@ -> [ Start ]")
+       $(ENV_DOCKER) buildx build --network=host --push \
+               -t $(IMAGE_NAME):dev \
+               --platform linux/amd64,linux/arm64 \
+               --build-arg CODE_PATH=. \
+               --build-arg 
ENTRYPOINT_PATH=./docker/debian-dev/docker-entrypoint.sh \
+               --build-arg 
INSTALL_BROTLI=./docker/debian-dev/install-brotli.sh \
+               --build-arg 
CHECK_STANDALONE_CONFIG=./docker/utils/check_standalone_config.sh \
+               -f ./docker/debian-dev/Dockerfile .
+       @$(call func_echo_success_status, "$@ -> [ Done ]")
diff --git a/docker/compose/apisix_conf/master/config.yaml 
b/docker/compose/apisix_conf/master/config.yaml
new file mode 100644
index 000000000..1220d8fb2
--- /dev/null
+++ b/docker/compose/apisix_conf/master/config.yaml
@@ -0,0 +1,36 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+apisix:
+  node_listen: 9080 # APISIX listening port
+  enable_ipv6: false
+
+deployment:
+  admin:
+    allow_admin: # 
https://nginx.org/en/docs/http/ngx_http_access_module.html#allow
+      - 0.0.0.0/0 # We need to restrict ip access rules for security. 
0.0.0.0/0 is for test.
+
+    admin_key:
+      - name: "admin"
+        key: edd1c9f034335f136f87ad84b625c8f1
+        role: admin # admin: manage all configuration data
+
+  etcd:
+    host: # it's possible to define multiple etcd hosts addresses of the same 
etcd cluster.
+      - "http://etcd:2379"; # multiple etcd address
+    prefix: "/apisix" # apisix configurations prefix
+    timeout: 30 # 30 seconds
diff --git a/docker/compose/docker-compose-master.yaml 
b/docker/compose/docker-compose-master.yaml
new file mode 100644
index 000000000..7d3ba7cdb
--- /dev/null
+++ b/docker/compose/docker-compose-master.yaml
@@ -0,0 +1,53 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+version: "3"
+
+services:
+  apisix:
+    image: "apache/apisix:${APISIX_DOCKER_TAG}"
+    restart: always
+    volumes:
+      - ./apisix_conf/master/config.yaml:/usr/local/apisix/conf/config.yaml:ro
+    depends_on:
+      - etcd
+    ports:
+      - "9180:9180/tcp"
+      - "9080:9080/tcp"
+      - "9091:9091/tcp"
+      - "9443:9443/tcp"
+    networks:
+      - apisix
+
+  etcd:
+    image: bitnami/etcd:3.4.9
+    user: root
+    restart: always
+    environment:
+      ETCD_DATA_DIR: /etcd_data
+      ETCD_ENABLE_V2: "true"
+      ALLOW_NONE_AUTHENTICATION: "yes"
+      ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379";
+      ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379";
+    ports:
+      - "2379:2379/tcp"
+    networks:
+      - apisix
+
+networks:
+  apisix:
+    driver: bridge
diff --git a/docker/debian-dev/Dockerfile b/docker/debian-dev/Dockerfile
new file mode 100644
index 000000000..c00041fab
--- /dev/null
+++ b/docker/debian-dev/Dockerfile
@@ -0,0 +1,74 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+FROM debian:bullseye-slim AS build
+
+ARG ENABLE_PROXY=false
+ARG CODE_PATH
+
+ENV DEBIAN_FRONTEND=noninteractive
+ENV ENV_INST_LUADIR=/usr/local/apisix
+
+COPY ${CODE_PATH} /apisix
+
+WORKDIR /apisix
+
+RUN set -x \
+    && apt-get -y update --fix-missing \
+    && apt-get install -y \
+        make \
+        git  \
+        sudo \
+        libyaml-dev \
+    && ls -al \
+    && make deps \
+    && mkdir -p ${ENV_INST_LUADIR} \
+    && cp -r deps ${ENV_INST_LUADIR} \
+    && make install
+
+FROM debian:bullseye-slim
+
+ARG ENTRYPOINT_PATH=./docker-entrypoint.sh
+ARG INSTALL_BROTLI=./install-brotli.sh
+ARG CHECK_STANDALONE_CONFIG=./check_standalone_config.sh
+
+COPY --from=build /usr/local/apisix /usr/local/apisix
+COPY --from=build /usr/local/openresty /usr/local/openresty
+COPY --from=build /usr/bin/apisix /usr/bin/apisix
+COPY --from=build /usr/lib/x86_64-linux-gnu/libyaml* /usr/local/lib/
+
+COPY ${INSTALL_BROTLI} /install-brotli.sh
+RUN chmod +x /install-brotli.sh \
+    && cd / && ./install-brotli.sh && rm -rf /install-brotli.sh
+
+ENV 
PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin
+
+WORKDIR /usr/local/apisix
+
+RUN ln -sf /dev/stdout /usr/local/apisix/logs/access.log \
+    && ln -sf /dev/stderr /usr/local/apisix/logs/error.log
+
+EXPOSE 9080 9443
+
+COPY ${ENTRYPOINT_PATH} /docker-entrypoint.sh
+COPY ${CHECK_STANDALONE_CONFIG} /check_standalone_config.sh
+RUN chmod +x /docker-entrypoint.sh /check_standalone_config.sh
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
+
+CMD ["docker-start"]
+
+STOPSIGNAL SIGQUIT
diff --git a/docker/debian-dev/docker-entrypoint.sh 
b/docker/debian-dev/docker-entrypoint.sh
new file mode 100644
index 000000000..b130a976b
--- /dev/null
+++ b/docker/debian-dev/docker-entrypoint.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -eo pipefail
+
+PREFIX=${APISIX_PREFIX:=/usr/local/apisix}
+
+if [[ "$1" == "docker-start" ]]; then
+    if [ "$APISIX_STAND_ALONE" = "true" ]; then
+      # If the file is not present then initialise the content otherwise 
update relevant keys for standalone mode
+      if [ ! -f "${PREFIX}/conf/config.yaml" ]; then
+          cat > ${PREFIX}/conf/config.yaml << _EOC_
+deployment:
+  role: data_plane
+  role_data_plane:
+    config_provider: yaml
+_EOC_
+      else
+          # Check if the deployment role is set to data_plane and config 
provider is set to yaml for standalone mode
+          source /check_standalone_config.sh
+      fi
+
+        if [ ! -f "${PREFIX}/conf/apisix.yaml" ]; then
+          cat > ${PREFIX}/conf/apisix.yaml << _EOC_
+routes:
+  -
+#END
+_EOC_
+        fi
+        /usr/bin/apisix init
+    else
+        /usr/bin/apisix init
+        /usr/bin/apisix init_etcd
+    fi
+
+    # For versions below 3.5.0 whose conf_server has not been removed.
+    if [ -e "/usr/local/apisix/conf/config_listen.sock" ]; then
+        rm -f "/usr/local/apisix/conf/config_listen.sock"
+    fi
+
+    if [ -e "/usr/local/apisix/logs/worker_events.sock" ]; then
+        rm -f "/usr/local/apisix/logs/worker_events.sock"
+    fi
+
+    exec /usr/local/openresty/bin/openresty -p /usr/local/apisix -g 'daemon 
off;'
+fi
+
+exec "$@"
diff --git a/docker/debian-dev/install-brotli.sh 
b/docker/debian-dev/install-brotli.sh
new file mode 100644
index 000000000..679254e96
--- /dev/null
+++ b/docker/debian-dev/install-brotli.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+install_brotli() {
+    apt-get -qy update
+    apt-get install -y sudo cmake wget unzip
+    local BORTLI_VERSION="1.1.0"
+    wget -q 
https://github.com/google/brotli/archive/refs/tags/v${BORTLI_VERSION}.zip || 
exit 1
+    unzip v${BORTLI_VERSION}.zip && cd ./brotli-${BORTLI_VERSION} && mkdir 
build && cd build || exit 1
+    local CMAKE=$(command -v cmake3 >/dev/null 2>&1 && echo cmake3 || echo 
cmake) || exit 1
+    ${CMAKE} -DCMAKE_BUILD_TYPE=Release 
-DCMAKE_INSTALL_PREFIX=/usr/local/brotli .. || exit 1
+    sudo ${CMAKE} --build . --config Release --target install || exit 1
+    if [ -d "/usr/local/brotli/lib64" ]; then
+        echo /usr/local/brotli/lib64 | sudo tee /etc/ld.so.conf.d/brotli.conf
+    else
+        echo /usr/local/brotli/lib | sudo tee /etc/ld.so.conf.d/brotli.conf
+    fi
+    sudo ldconfig || exit 1
+    ln -sf /usr/local/brotli/bin/brotli /usr/bin/brotli
+    cd ../..
+    rm -rf brotli-${BORTLI_VERSION}
+    rm -rf /v${BORTLI_VERSION}.zip
+    export SUDO_FORCE_REMOVE=yes
+    apt purge -qy cmake sudo wget unzip
+    apt-get remove --purge --auto-remove -y
+}
+install_brotli
diff --git a/docker/utils/check_standalone_config.sh 
b/docker/utils/check_standalone_config.sh
new file mode 100644
index 000000000..22792c54f
--- /dev/null
+++ b/docker/utils/check_standalone_config.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+if ! grep -q 'role: data_plane' "${PREFIX}/conf/config.yaml"; then
+    echo "Error: ${PREFIX}/conf/config.yaml does not contain 'role: 
data_plane'. Deployment role must be set to 'data_plane' for standalone mode."
+    echo "Please refer to the APISIX documentation for deployment modes: 
https://apisix.apache.org/docs/apisix/deployment-modes/";
+    exit 1
+fi
+
+if ! grep -q 'role_data_plane:' "${PREFIX}/conf/config.yaml"; then
+    echo "Error: ${PREFIX}/conf/config.yaml does not contain 
'role_data_plane:'."
+    echo "Please refer to the APISIX documentation for deployment modes: 
https://apisix.apache.org/docs/apisix/deployment-modes/";
+    exit 1
+fi
+
+if ! grep -q 'config_provider: yaml' "${PREFIX}/conf/config.yaml"; then
+    echo "Error: ${PREFIX}/conf/config.yaml does not contain 'config_provider: 
yaml'. Config provider must be set to 'yaml' for standalone mode."
+    echo "Please refer to the APISIX documentation for deployment modes: 
https://apisix.apache.org/docs/apisix/deployment-modes/";
+    exit 1
+fi

Reply via email to