From bf9e9f8362cbe223af203d77a316ad0ace0c9a46 Mon Sep 17 00:00:00 2001 From: Vacant Date: Wed, 3 Jan 2024 18:26:38 +0800 Subject: [PATCH] feat: Install apisix and apisix-runtime from source code (#10729) --- .github/workflows/source-install.yml | 118 +++++++++++++++++++++++++++ .requirements | 2 +- Makefile | 32 ++++++-- ci/centos7-ci.sh | 5 +- ci/linux-install-openresty.sh | 1 + ci/redhat-ci.sh | 7 +- docs/en/latest/building-apisix.md | 12 +-- docs/zh/latest/building-apisix.md | 13 +-- utils/install-dependencies.sh | 79 +++++++++++++----- 9 files changed, 211 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/source-install.yml diff --git a/.github/workflows/source-install.yml b/.github/workflows/source-install.yml new file mode 100644 index 000000000000..d2051aee87a7 --- /dev/null +++ b/.github/workflows/source-install.yml @@ -0,0 +1,118 @@ +name: Source Code Install + +on: + push: + branches: [master, 'release/**'] + paths-ignore: + - 'docs/**' + - '**/*.md' + pull_request: + branches: [master, 'release/**'] + paths-ignore: + - 'docs/**' + - '**/*.md' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + install-on-multi-platform: + strategy: + fail-fast: false + matrix: + platform: + - ubuntu-20.04 + os_platform: + - centos7 + - ubuntu + - redhat + services: + etcd: + image: bitnami/etcd:3.5.4 + ports: + - 2379:2379 + - 2380:2380 + env: + ALLOW_NONE_AUTHENTICATION: yes + ETCD_ADVERTISE_CLIENT_URLS: http://0.0.0.0:2379 + httpbin: + image: kennethreitz/httpbin + ports: + - 8088:80 + + runs-on: ${{ matrix.platform }} + timeout-minutes: 30 + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Cache deps + uses: actions/cache@v3 + env: + cache-name: cache-deps + with: + path: deps + key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_platform }}-${{ hashFiles('apisix-master-0.rockspec') }} + + - name: Install and start apisix on ${{ matrix.os_platform }} + env: + INSTALL_PLATFORM: ${{ matrix.os_platform }} + run: | + if [[ $INSTALL_PLATFORM == "ubuntu" ]]; then + sudo apt-get update + sudo apt-get install -y git sudo make + make deps + sudo make install + apisix start + elif [[ $INSTALL_PLATFORM == "redhat" ]]; then + docker run -itd -v ${{ github.workspace }}:/apisix --name ubi8 --net="host" --dns 8.8.8.8 --dns-search apache.org registry.access.redhat.com/ubi8/ubi:8.6 /bin/bash + docker exec ubi8 bash -c "yum install -y git sudo make" + docker exec ubi8 bash -c "cd apisix && make deps" + docker exec ubi8 bash -c "cd apisix && make install" + docker exec ubi8 bash -c "cd apisix && apisix start" + elif [[ $INSTALL_PLATFORM == "centos7" ]]; then + docker run -itd -v ${{ github.workspace }}:/apisix --name centos7Instance --net="host" --dns 8.8.8.8 --dns-search apache.org docker.io/centos:7 /bin/bash + docker exec centos7Instance bash -c "yum install -y git sudo make" + docker exec centos7Instance bash -c "cd apisix && make deps" + docker exec centos7Instance bash -c "cd apisix && make install" + docker exec centos7Instance bash -c "cd apisix && apisix start" + fi + sleep 6 + + - 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": { + "127.0.0.1:8088": 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" + echo "===============access.log===============" + cat logs/access.log + echo "===============error.log===============" + cat logs/error.log + exit 125 + fi + + - name: Check error log + run: | + if grep -q '\[error\]' logs/error.log; then + echo "=====found error log=====" + cat /usr/local/apisix/logs/error.log + exit 125 + fi diff --git a/.requirements b/.requirements index 978772db5eed..b5d22118a3c4 100644 --- a/.requirements +++ b/.requirements @@ -17,4 +17,4 @@ APISIX_PACKAGE_NAME=apisix -APISIX_RUNTIME=1.1.0 +APISIX_RUNTIME=1.1.1 diff --git a/Makefile b/Makefile index e297f90140e3..7f285b91e9e6 100644 --- a/Makefile +++ b/Makefile @@ -40,13 +40,17 @@ ENV_DOCKER ?= docker ENV_DOCKER_COMPOSE ?= docker-compose --project-directory $(CURDIR) -p $(project_name) -f $(project_compose_ci) ENV_NGINX ?= $(ENV_NGINX_EXEC) -p $(CURDIR) -c $(CURDIR)/conf/nginx.conf ENV_NGINX_EXEC := $(shell command -v openresty 2>/dev/null || command -v nginx 2>/dev/null) -ENV_OPENSSL_PREFIX ?= $(addprefix $(ENV_NGINX_PREFIX), openssl3) +ENV_OPENSSL_PREFIX ?= /usr/local/openresty/openssl3 ENV_LUAROCKS ?= luarocks ## These variables can be injected by luarocks ENV_INST_PREFIX ?= /usr ENV_INST_LUADIR ?= $(ENV_INST_PREFIX)/share/lua/5.1 ENV_INST_BINDIR ?= $(ENV_INST_PREFIX)/bin ENV_HOMEBREW_PREFIX ?= /usr/local +ENV_RUNTIME_VER ?= $(shell $(ENV_NGINX_EXEC) -V 2>&1 | tr ' ' '\n' | grep 'APISIX_RUNTIME_VER' | cut -d '=' -f2) + +-include .requirements +export ifneq ($(shell whoami), root) ENV_LUAROCKS_FLAG_LOCAL := --local @@ -56,10 +60,8 @@ ifdef ENV_LUAROCKS_SERVER ENV_LUAROCKS_SERVER_OPT := --server $(ENV_LUAROCKS_SERVER) endif -# Execute only in the presence of ENV_NGINX_EXEC to avoid unexpected error output -ifneq ($(ENV_NGINX_EXEC), ) +ifneq ($(shell test -d $(ENV_OPENSSL_PREFIX) && echo -n yes), yes) ENV_NGINX_PREFIX := $(shell $(ENV_NGINX_EXEC) -V 2>&1 | grep -Eo 'prefix=(.*)/nginx\s+' | grep -Eo '/.*/') - # OpenResty 1.17.8 or higher version uses openssl3 as the openssl dirname. ifeq ($(shell test -d $(addprefix $(ENV_NGINX_PREFIX), openssl3) && echo -n yes), yes) ENV_OPENSSL_PREFIX := $(addprefix $(ENV_NGINX_PREFIX), openssl3) endif @@ -126,12 +128,12 @@ endef .PHONY: runtime runtime: ifeq ($(ENV_NGINX_EXEC), ) -ifeq ("$(wildcard /usr/local/openresty-debug/bin/openresty)", "") +ifeq ("$(wildcard /usr/local/openresty/bin/openresty)", "") @$(call func_echo_warn_status, "WARNING: OpenResty not found. You have to install OpenResty and add the binary file to PATH before install Apache APISIX.") exit 1 else - $(eval ENV_NGINX_EXEC := /usr/local/openresty-debug/bin/openresty) - @$(call func_echo_status, "Use openresty-debug as default runtime") + $(eval ENV_NGINX_EXEC := /usr/local/openresty/bin/openresty) + @$(call func_echo_status, "Use openresty as default runtime") endif endif @@ -153,7 +155,7 @@ help: ### deps : Installing dependencies .PHONY: deps -deps: runtime +deps: install-runtime $(eval ENV_LUAROCKS_VER := $(shell $(ENV_LUAROCKS) --version | grep -E -o "luarocks [0-9]+.")) @if [ '$(ENV_LUAROCKS_VER)' = 'luarocks 3.' ]; then \ mkdir -p ~/.luarocks; \ @@ -169,7 +171,7 @@ deps: runtime ### undeps : Uninstalling dependencies .PHONY: undeps -undeps: +undeps: uninstall-runtime @$(call func_echo_status, "$@ -> [ Start ]") $(ENV_LUAROCKS) purge --tree=deps @$(call func_echo_success_status, "$@ -> [ Done ]") @@ -253,6 +255,18 @@ reload: runtime $(ENV_APISIX) reload @$(call func_echo_success_status, "$@ -> [ Done ]") +.PHONY: install-runtime +install-runtime: +ifneq ($(ENV_RUNTIME_VER), $(APISIX_RUNTIME)) + ./utils/install-dependencies.sh + @sudo $(ENV_INSTALL) /usr/local/openresty/bin/openresty $(ENV_INST_BINDIR)/openresty +endif + +.PHONY: uninstall-runtime +uninstall-runtime: + ./utils/install-dependencies.sh uninstall + rm -rf /usr/local/openresty + rm -f $(ENV_INST_BINDIR)/openresty ### install : Install the apisix (only for luarocks) .PHONY: install diff --git a/ci/centos7-ci.sh b/ci/centos7-ci.sh index f9961f758a87..344552e9f4ef 100755 --- a/ci/centos7-ci.sh +++ b/ci/centos7-ci.sh @@ -25,7 +25,6 @@ install_dependencies() { # install build & runtime deps yum install -y wget tar gcc gcc-c++ automake autoconf libtool make unzip patch \ git sudo openldap-devel which ca-certificates \ - openresty-pcre-devel openresty-zlib-devel \ epel-release \ cpanminus perl \ openssl-devel @@ -43,9 +42,9 @@ install_dependencies() { # install openresty to make apisix's rpm test work yum install -y yum-utils && yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo - export luajit_xcflags="-DLUAJIT_ASSERT -DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT -O0" - export debug_args=--with-debug + yum install -y openresty-pcre-devel openresty-zlib-devel + export runtime_version=${APISIX_RUNTIME} wget "https://raw.githubusercontent.com/api7/apisix-build-tools/apisix-runtime/${APISIX_RUNTIME}/build-apisix-runtime.sh" chmod +x build-apisix-runtime.sh ./build-apisix-runtime.sh latest diff --git a/ci/linux-install-openresty.sh b/ci/linux-install-openresty.sh index bcb74a9598b1..8d24334173e9 100755 --- a/ci/linux-install-openresty.sh +++ b/ci/linux-install-openresty.sh @@ -51,6 +51,7 @@ if [ "$OPENRESTY_VERSION" == "source" ]; then fi fi +export runtime_version=${APISIX_RUNTIME} wget "https://raw.githubusercontent.com/api7/apisix-build-tools/apisix-runtime/${APISIX_RUNTIME}/build-apisix-runtime.sh" chmod +x build-apisix-runtime.sh ./build-apisix-runtime.sh latest diff --git a/ci/redhat-ci.sh b/ci/redhat-ci.sh index 97a0fe45be24..c10e047d4a48 100755 --- a/ci/redhat-ci.sh +++ b/ci/redhat-ci.sh @@ -36,12 +36,9 @@ install_dependencies() { # install apisix-runtime to make apisix's rpm test work yum install -y yum-utils && yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo - rpm --import https://repos.apiseven.com/KEYS - yum -y install https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm - - export luajit_xcflags="-DLUAJIT_ASSERT -DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT -O0" - export debug_args=--with-debug + yum install -y openresty-pcre-devel openresty-zlib-devel + export runtime_version=${APISIX_RUNTIME} wget "https://raw.githubusercontent.com/api7/apisix-build-tools/apisix-runtime/${APISIX_RUNTIME}/build-apisix-runtime.sh" chmod +x build-apisix-runtime.sh ./build-apisix-runtime.sh latest diff --git a/docs/en/latest/building-apisix.md b/docs/en/latest/building-apisix.md index ba9c9c6d2e16..a2bf1604aa78 100644 --- a/docs/en/latest/building-apisix.md +++ b/docs/en/latest/building-apisix.md @@ -45,19 +45,13 @@ To build and package APISIX for a specific platform, see [apisix-build-tools](ht ## Building APISIX from source -Install dependencies using the script provided by APISIX: - -```shell -curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash - -``` - -Save the APISIX version to an environment variable to be used next: +First of all, we need to specify the version `APISIX_VERSION` to be installed: ```shell APISIX_VERSION='3.7.0' ``` -Clone the APISIX source code of this version into a new directory `apisix-APISIX_VERSION`: +Then, you can run the following command to clone the APISIX source code from Github: ```shell git clone --depth 1 --branch ${APISIX_VERSION} https://github.com/apache/apisix.git apisix-${APISIX_VERSION} @@ -73,7 +67,7 @@ make deps make install ``` -This will install the runtime-dependent Lua libraries and the `apisix` CLI tool. +This will install the runtime-dependent Lua libraries and `apisix-runtime` the `apisix` CLI tool. :::note diff --git a/docs/zh/latest/building-apisix.md b/docs/zh/latest/building-apisix.md index 40e48113eda1..0d39b6870de3 100644 --- a/docs/zh/latest/building-apisix.md +++ b/docs/zh/latest/building-apisix.md @@ -44,20 +44,13 @@ import TabItem from '@theme/TabItem'; ## 源码安装 APISIX -首先,你可以通过以下命令安装依赖项: - -```shell -curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash - -``` - -然后,创建一个目录并设置环境变量 `APISIX_VERSION`: +首先,我们需要指定需要安装的版本`APISIX_VERSION`: ```shell APISIX_VERSION='3.7.0' -mkdir apisix-${APISIX_VERSION} ``` -现在,你可以运行以下命令,从 Github 克隆 APISIX 源码: +然后,你可以运行以下命令,从 Github 克隆 APISIX 源码: ```shell git clone --depth 1 --branch ${APISIX_VERSION} https://github.com/apache/apisix.git apisix-${APISIX_VERSION} @@ -75,7 +68,7 @@ make deps make install ``` -该命令将安装 APISIX 运行时依赖的 Lua 库和 `apisix` 命令。 +该命令将安装 APISIX 运行时依赖的 Lua 库以及 `apisix-runtime` 和 `apisix` 命令。 :::note diff --git a/utils/install-dependencies.sh b/utils/install-dependencies.sh index 530f19a54025..bdf545984114 100755 --- a/utils/install-dependencies.sh +++ b/utils/install-dependencies.sh @@ -45,31 +45,25 @@ function install_dependencies_with_aur() { # Install dependencies on centos and fedora function install_dependencies_with_yum() { sudo yum install -y yum-utils - - local common_dep="curl wget git gcc openresty-openssl111-devel unzip pcre pcre-devel openldap-devel" - if [ "${1}" == "centos" ]; then - # add APISIX source - local apisix_pkg=apache-apisix-repo-1.0-1.noarch - rpm -q --quiet ${apisix_pkg} || sudo yum install -y https://repos.apiseven.com/packages/centos/${apisix_pkg}.rpm - - # install apisix-runtime and some compilation tools - # shellcheck disable=SC2086 - sudo yum install -y apisix-runtime $common_dep - else - # add OpenResty source - sudo yum-config-manager --add-repo "https://openresty.org/package/${1}/openresty.repo" - - # install OpenResty and some compilation tools - # shellcheck disable=SC2086 - sudo yum install -y openresty $common_dep + sudo yum-config-manager --add-repo "https://openresty.org/package/${1}/openresty.repo" + if [[ "${1}" == "centos" ]]; then + sudo yum -y install centos-release-scl + sudo yum -y install devtoolset-9 patch wget + set +eu + source scl_source enable devtoolset-9 + set -eu fi + sudo yum install -y \ + gcc gcc-c++ curl wget unzip xz gnupg perl-ExtUtils-Embed cpanminus patch \ + perl perl-devel pcre pcre-devel openldap-devel \ + openresty-zlib-devel openresty-pcre-devel } # Install dependencies on ubuntu and debian function install_dependencies_with_apt() { # add OpenResty source sudo apt-get update - sudo apt-get -y install software-properties-common wget lsb-release + sudo apt-get -y install software-properties-common wget lsb-release gnupg patch wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add - arch=$(uname -m | tr '[:upper:]' '[:lower:]') arch_path="" @@ -83,8 +77,8 @@ function install_dependencies_with_apt() { fi sudo apt-get update - # install OpenResty and some compilation tools - sudo apt-get install -y git openresty curl openresty-openssl111-dev make gcc libpcre3 libpcre3-dev libldap2-dev unzip + # install some compilation tools + sudo apt-get install -y curl make gcc g++ cpanminus libpcre3 libpcre3-dev libldap2-dev unzip openresty-zlib-dev openresty-pcre-dev } # Install dependencies on mac osx @@ -97,6 +91,8 @@ function install_dependencies_on_mac_osx() { function multi_distro_installation() { if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then install_dependencies_with_yum "centos" + elif grep -Eqi -e "Red Hat" -e "rhel" /etc/*-release; then + install_dependencies_with_yum "rhel" elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then install_dependencies_with_yum "fedora" elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then @@ -107,12 +103,46 @@ function multi_distro_installation() { install_dependencies_with_aur else echo "Non-supported operating system version" + exit 1 + fi + install_apisix_runtime +} + +function multi_distro_uninstallation() { + if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then + sudo yum autoremove -y openresty-zlib-devel openresty-pcre-devel + elif grep -Eqi -e "Red Hat" -e "rhel" /etc/*-release; then + sudo yum autoremove -y openresty-zlib-devel openresty-pcre-devel + elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then + sudo yum autoremove -y openresty-zlib-devel openresty-pcre-devel + elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then + sudo apt-get autoremove -y openresty-zlib-dev openresty-pcre-dev + elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then + sudo apt-get autoremove -y openresty-zlib-dev openresty-pcre-dev + else + echo "Non-supported operating system version" + exit 1 fi } +function install_apisix_runtime() { + export runtime_version=${APISIX_RUNTIME:?} + wget "https://raw.githubusercontent.com/api7/apisix-build-tools/apisix-runtime/${APISIX_RUNTIME}/build-apisix-runtime.sh" + chmod +x build-apisix-runtime.sh + ./build-apisix-runtime.sh latest + rm build-apisix-runtime.sh +} + # Install LuaRocks function install_luarocks() { - curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash - + if [ -f "./utils/linux-install-luarocks.sh" ]; then + ./utils/linux-install-luarocks.sh + elif [ -f "./linux-install-luarocks.sh" ]; then + ./linux-install-luarocks.sh + else + echo "Installing luarocks from remote master branch" + curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash - + fi } # Entry @@ -135,6 +165,13 @@ function main() { "install_luarocks") install_luarocks ;; + "uninstall") + if [[ "${OS_NAME}" == "linux" ]]; then + multi_distro_uninstallation + else + echo "Non-supported distribution" + fi + ;; *) echo "Unsupported method: ${case_opt}" ;;