mirror of
https://github.com/alibaba/higress.git
synced 2026-06-09 20:57:32 +08:00
Implement Rust Wasm Plugin Build & Publish Action (#1483)
This commit is contained in:
@@ -3,9 +3,16 @@ name: Build and Push Wasm Plugin Image
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- "wasm-go-*-v*.*.*" # 匹配 wasm-go-{pluginName}-vX.Y.Z 格式的标签
|
- "wasm-*-*-v*.*.*" # 匹配 wasm-{go|rust}-{pluginName}-vX.Y.Z 格式的标签
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
|
plugin_type:
|
||||||
|
description: 'Type of the plugin'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- go
|
||||||
|
- rust
|
||||||
plugin_name:
|
plugin_name:
|
||||||
description: 'Name of the plugin'
|
description: 'Name of the plugin'
|
||||||
required: true
|
required: true
|
||||||
@@ -23,32 +30,40 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
IMAGE_REGISTRY_SERVICE: ${{ vars.IMAGE_REGISTRY || 'higress-registry.cn-hangzhou.cr.aliyuncs.com' }}
|
IMAGE_REGISTRY_SERVICE: ${{ vars.IMAGE_REGISTRY || 'higress-registry.cn-hangzhou.cr.aliyuncs.com' }}
|
||||||
IMAGE_REPOSITORY: ${{ vars.PLUGIN_IMAGE_REPOSITORY || 'plugins' }}
|
IMAGE_REPOSITORY: ${{ vars.PLUGIN_IMAGE_REPOSITORY || 'plugins' }}
|
||||||
|
RUST_VERSION: 1.82
|
||||||
GO_VERSION: 1.19
|
GO_VERSION: 1.19
|
||||||
TINYGO_VERSION: 0.28.1
|
TINYGO_VERSION: 0.28.1
|
||||||
ORAS_VERSION: 1.0.0
|
ORAS_VERSION: 1.0.0
|
||||||
steps:
|
steps:
|
||||||
- name: Set plugin_name and version from inputs or ref_name
|
- name: Set plugin_type, plugin_name and version from inputs or ref_name
|
||||||
id: set_vars
|
id: set_vars
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||||
|
plugin_type="${{ github.event.inputs.plugin_type }}"
|
||||||
plugin_name="${{ github.event.inputs.plugin_name }}"
|
plugin_name="${{ github.event.inputs.plugin_name }}"
|
||||||
version="${{ github.event.inputs.version }}"
|
version="${{ github.event.inputs.version }}"
|
||||||
|
builder_image="higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/wasm-rust-builder:rust${{ env.RUST_VERSION }}-oras${{ env.ORAS_VERSION }}"
|
||||||
else
|
else
|
||||||
ref_name=${{ github.ref_name }}
|
ref_name=${{ github.ref_name }}
|
||||||
|
plugin_type=${ref_name#*-} # 删除插件类型前面的字段(wasm-)
|
||||||
|
plugin_type=${plugin_type%-*} # 删除插件类型后面的字段(-{plugin_name}-vX.Y.Z)
|
||||||
plugin_name=${ref_name#*-*-} # 删除插件名前面的字段(wasm-go-)
|
plugin_name=${ref_name#*-*-} # 删除插件名前面的字段(wasm-go-)
|
||||||
plugin_name=${plugin_name%-*} # 删除插件名后面的字段(-vX.Y.Z)
|
plugin_name=${plugin_name%-*} # 删除插件名后面的字段(-vX.Y.Z)
|
||||||
version=$(echo "$ref_name" | awk -F'v' '{print $2}')
|
version=$(echo "$ref_name" | awk -F'v' '{print $2}')
|
||||||
|
builder_image="higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/wasm-go-builder:go${{ env.GO_VERSION }}-tinygo${{ env.TINYGO_VERSION }}-oras${{ env.ORAS_VERSION }}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "PLUGIN_TYPE=$plugin_type" >> $GITHUB_ENV
|
||||||
echo "PLUGIN_NAME=$plugin_name" >> $GITHUB_ENV
|
echo "PLUGIN_NAME=$plugin_name" >> $GITHUB_ENV
|
||||||
echo "VERSION=$version" >> $GITHUB_ENV
|
echo "VERSION=$version" >> $GITHUB_ENV
|
||||||
|
echo "BUILDER_IMAGE=$builder_image" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: File Check
|
- name: File Check
|
||||||
run: |
|
run: |
|
||||||
workspace=${{ github.workspace }}/plugins/wasm-go/extensions/${PLUGIN_NAME}
|
workspace=${{ github.workspace }}/plugins/wasm-${PLUGIN_TYPE}/extensions/${PLUGIN_NAME}
|
||||||
push_command="./plugin.tar.gz:application/vnd.oci.image.layer.v1.tar+gzip"
|
push_command="./plugin.tar.gz:application/vnd.oci.image.layer.v1.tar+gzip"
|
||||||
|
|
||||||
# 查找spec.yaml
|
# 查找spec.yaml
|
||||||
@@ -75,10 +90,10 @@ jobs:
|
|||||||
|
|
||||||
echo "PUSH_COMMAND=\"$push_command\"" >> $GITHUB_ENV
|
echo "PUSH_COMMAND=\"$push_command\"" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Run a wasm-go-builder
|
- name: Run a wasm-builder
|
||||||
env:
|
env:
|
||||||
PLUGIN_NAME: ${{ env.PLUGIN_NAME }}
|
PLUGIN_NAME: ${{ env.PLUGIN_NAME }}
|
||||||
BUILDER_IMAGE: higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/wasm-go-builder:go${{ env.GO_VERSION }}-tinygo${{ env.TINYGO_VERSION }}-oras${{ env.ORAS_VERSION }}
|
BUILDER_IMAGE: ${{ env.BUILDER_IMAGE }}
|
||||||
run: |
|
run: |
|
||||||
docker run -itd --name builder -v ${{ github.workspace }}:/workspace -e PLUGIN_NAME=${{ env.PLUGIN_NAME }} --rm ${{ env.BUILDER_IMAGE }} /bin/bash
|
docker run -itd --name builder -v ${{ github.workspace }}:/workspace -e PLUGIN_NAME=${{ env.PLUGIN_NAME }} --rm ${{ env.BUILDER_IMAGE }} /bin/bash
|
||||||
|
|
||||||
@@ -93,7 +108,7 @@ jobs:
|
|||||||
echo "TargetImage=${target_image}"
|
echo "TargetImage=${target_image}"
|
||||||
echo "TargetImageLatest=${target_image_latest}"
|
echo "TargetImageLatest=${target_image_latest}"
|
||||||
|
|
||||||
cd ${{ github.workspace }}/plugins/wasm-go/extensions/${PLUGIN_NAME}
|
cd ${{ github.workspace }}/plugins/wasm-${PLUGIN_TYPE}/extensions/${PLUGIN_NAME}
|
||||||
if [ -f ./.buildrc ]; then
|
if [ -f ./.buildrc ]; then
|
||||||
echo 'Found .buildrc file, sourcing it...'
|
echo 'Found .buildrc file, sourcing it...'
|
||||||
. ./.buildrc
|
. ./.buildrc
|
||||||
@@ -101,7 +116,7 @@ jobs:
|
|||||||
echo '.buildrc file not found'
|
echo '.buildrc file not found'
|
||||||
fi
|
fi
|
||||||
echo "EXTRA_TAGS=${EXTRA_TAGS}"
|
echo "EXTRA_TAGS=${EXTRA_TAGS}"
|
||||||
|
if [ "${PLUGIN_TYPE}" == "go" ]; then
|
||||||
command="
|
command="
|
||||||
set -e
|
set -e
|
||||||
cd /workspace/plugins/wasm-go/extensions/${PLUGIN_NAME}
|
cd /workspace/plugins/wasm-go/extensions/${PLUGIN_NAME}
|
||||||
@@ -112,4 +127,21 @@ jobs:
|
|||||||
oras push ${target_image} ${push_command}
|
oras push ${target_image} ${push_command}
|
||||||
oras push ${target_image_latest} ${push_command}
|
oras push ${target_image_latest} ${push_command}
|
||||||
"
|
"
|
||||||
|
elif [ "${PLUGIN_TYPE}" == "rust" ]; then
|
||||||
|
command="
|
||||||
|
set -e
|
||||||
|
cd /workspace/plugins/wasm-rust/extensions/${PLUGIN_NAME}
|
||||||
|
cargo build --target wasm32-wasi --release
|
||||||
|
cp target/wasm32-wasi/release/*.wasm plugin.wasm
|
||||||
|
tar czvf plugin.tar.gz plugin.wasm
|
||||||
|
echo ${{ secrets.REGISTRY_PASSWORD }} | oras login -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin ${{ env.IMAGE_REGISTRY_SERVICE }}
|
||||||
|
oras push ${target_image} ${push_command}
|
||||||
|
oras push ${target_image_latest} ${push_command}
|
||||||
|
"
|
||||||
|
else
|
||||||
|
|
||||||
|
command="
|
||||||
|
echo "unkown type ${PLUGIN_TYPE}"
|
||||||
|
"
|
||||||
|
fi
|
||||||
docker exec builder bash -c "$command"
|
docker exec builder bash -c "$command"
|
||||||
|
|||||||
38
plugins/wasm-rust/DockerfileBuilder
Normal file
38
plugins/wasm-rust/DockerfileBuilder
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
ARG RUST_VERSION
|
||||||
|
ARG ORAS_VERSION
|
||||||
|
ARG HIGRESS_VERSION
|
||||||
|
|
||||||
|
ARG BASE_IMAGE=rust:${RUST_VERSION:-1.82}
|
||||||
|
FROM $BASE_IMAGE
|
||||||
|
|
||||||
|
LABEL rust_version=$RUST_VERSION oras_version=$ORAS_VERSION
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y wget gcc gcc-multilib llvm clang \
|
||||||
|
&& rustup target add wasm32-wasi \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \
|
||||||
|
rust_version=${RUST_VERSION:-1.82}; \
|
||||||
|
oras_version=${ORAS_VERSION:-1.0.0}; \
|
||||||
|
higress_version=${HIGRESS_VERSION:-1.0.0-rc}; \
|
||||||
|
echo "arch: '$arch'"; \
|
||||||
|
echo "rust rust_version: '$rust_version'"; \
|
||||||
|
echo "oras_version: '$oras_version'"; \
|
||||||
|
echo "higress_version: '$higress_version'"; \
|
||||||
|
case "$arch" in \
|
||||||
|
'amd64') \
|
||||||
|
oras_url="https://github.com/oras-project/oras/releases/download/v$oras_version/oras_${oras_version}_linux_amd64.tar.gz"; \
|
||||||
|
;; \
|
||||||
|
'arm64') \
|
||||||
|
oras_url="https://github.com/oras-project/oras/releases/download/v$oras_version/oras_${oras_version}_linux_arm64.tar.gz"; \
|
||||||
|
;; \
|
||||||
|
*) echo >&2 "error: unsupported architecture '$arch' "; exit 1 ;; \
|
||||||
|
esac; \
|
||||||
|
echo "oras_url: '$oras_url'"; \
|
||||||
|
wget -O oras.tgz "$oras_url" --progress=dot:giga; \
|
||||||
|
tar -C /usr/local/bin -xzf oras.tgz && rm -rf oras.tgz; \
|
||||||
|
echo "done";
|
||||||
|
|
||||||
|
ENV PATH=$PATH:/usr/local/bin
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
PLUGIN_NAME ?= say-hello
|
PLUGIN_NAME ?= say-hello
|
||||||
|
BUILDER_REGISTRY ?= higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/
|
||||||
REGISTRY ?= higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/
|
REGISTRY ?= higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/
|
||||||
|
RUST_VERSION ?= 1.82
|
||||||
|
ORAS_VERSION ?= 1.0.0
|
||||||
|
HIGRESS_VERSION ?= 1.0.0-rc
|
||||||
|
BUILDER ?= ${BUILDER_REGISTRY}wasm-rust-builder:rust${RUST_VERSION}-oras${ORAS_VERSION}
|
||||||
BUILD_TIME := $(shell date "+%Y%m%d-%H%M%S")
|
BUILD_TIME := $(shell date "+%Y%m%d-%H%M%S")
|
||||||
COMMIT_ID := $(shell git rev-parse --short HEAD 2>/dev/null)
|
COMMIT_ID := $(shell git rev-parse --short HEAD 2>/dev/null)
|
||||||
IMAGE_TAG = $(if $(strip $(PLUGIN_VERSION)),${PLUGIN_VERSION},${BUILD_TIME}-${COMMIT_ID})
|
IMAGE_TAG = $(if $(strip $(PLUGIN_VERSION)),${PLUGIN_VERSION},${BUILD_TIME}-${COMMIT_ID})
|
||||||
@@ -21,3 +26,16 @@ lint-base:
|
|||||||
lint:
|
lint:
|
||||||
cargo fmt --all --check --manifest-path extensions/${PLUGIN_NAME}/Cargo.toml
|
cargo fmt --all --check --manifest-path extensions/${PLUGIN_NAME}/Cargo.toml
|
||||||
cargo clippy --workspace --all-features --all-targets --manifest-path extensions/${PLUGIN_NAME}/Cargo.toml
|
cargo clippy --workspace --all-features --all-targets --manifest-path extensions/${PLUGIN_NAME}/Cargo.toml
|
||||||
|
|
||||||
|
builder:
|
||||||
|
docker buildx build --no-cache \
|
||||||
|
--platform linux/amd64,linux/arm64 \
|
||||||
|
--build-arg RUST_VERSION=$(RUST_VERSION) \
|
||||||
|
--build-arg ORAS_VERSION=$(ORAS_VERSION) \
|
||||||
|
--build-arg HIGRESS_VERSION=$(HIGRESS_VERSION) \
|
||||||
|
-f DockerfileBuilder \
|
||||||
|
-t ${BUILDER} \
|
||||||
|
--push \
|
||||||
|
.
|
||||||
|
@echo ""
|
||||||
|
@echo "image: ${BUILDER}"
|
||||||
Reference in New Issue
Block a user