当我们需要对Answer的功能做一些扩展时,例如OAuth登录,我们设计了一种使用插件的方式来实现这些功能。
介绍
官方插件
您可以在[此处]找到官方支持的 Answer 插件列表(https://github.com/apache/incubator-answer-plugins).
插件类型
我们将插件分为不同的类型。不同类型的插件有不同的功能。同一类型的插件具有相同的效果,但实现方式不同。
- Connector:Connector插件帮助我们实现第三方登录功能。例如
GitHub OAuth 登录
- 存储:存储插件帮助我们将文件上传到第三方存储。 (预览)
- 缓存:支持使用不同的缓存中间件。例如
Redis
(预览) - 过滤:过滤掉非法问题或答案。 (即将推出)
- 渲染:不同内容格式的解析器。 (即将推出)
- Finder:支持使用搜索引擎加速搜索问题答案。 (即将推出)
建造
答案二进制文件支持将不同的所需插件打包到二进制文件中。
先决条件
命令
我们使用 Answer 二进制文件提供的
build
命令来重建带有插件的 Answer 版本。
例如,让我们看看如何构建包含 github 第三方登录插件的 Answer 二进制文件。
# answer build --with [plugin@plugin_version=[replacement]] --output [file]
$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
# build a new answer with github login plugin then output to ./new_answer.
$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0 --output ./new_answer
# with multiple plugins
$ ./answer build \
--with github.com/apache/incubator-answer-plugins/connector-github \
--with github.com/apache/incubator-answer-plugins/connector-google
# with local plugins
$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0=/my-local-space
# cross compilation. Build a linux-amd64 binary in macos
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
# specify the answer version using ANSWER_MODULE environment variable
$ ANSWER_MODULE=github.com/apache/incubator-answer@v1.2.0-RC1 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
您可以使用
plugin
命令列出当前包含插件的二进制文件。
$ ./new_answer plugin
# output
# github connector[0.0.1] made by answerdev
# google connector[0.0.1] made by answerdev
构建docker镜像与插件从回答基础镜像
您可以按照上述步骤先使用插件构建二进制文件,然后构建包含该二进制文件的 docker 镜像。当然,您也可以直接在原始图像之上构建。
FROM apache/answer as answer-builder
FROM golang:1.19-alpine AS golang-builder
COPY --from=answer-builder /usr/bin/answer /usr/bin/answer
RUN apk --no-cache add \
build-base git bash nodejs npm go && \
npm install -g pnpm@8.9.2
RUN answer build \
--with github.com/apache/incubator-answer-plugins/connector-basic \
--with github.com/apache/incubator-answer-plugins/storage-s3 \
--with github.com/apache/incubator-answer-plugins/search-elasticsearch \
--output /usr/bin/new_answer
FROM alpine
LABEL maintainer="linkinstar@apache.org"
ARG TIMEZONE
ENV TIMEZONE=${TIMEZONE:-"Asia/Shanghai"}
RUN apk update \
&& apk --no-cache add \
bash \
ca-certificates \
curl \
dumb-init \
gettext \
openssh \
sqlite \
gnupg \
tzdata \
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone
COPY --from=golang-builder /usr/bin/new_answer /usr/bin/answer
COPY --from=answer-builder /data /data
COPY --from=answer-builder /entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
VOLUME /data
EXPOSE 80
ENTRYPOINT ["/entrypoint.sh"]
您可以更新 —with 参数以添加更多您需要的插件。
# create a Dockerfile and copy the content above
$ vim Dockerfile
$ docker build -t answer-with-plugin .
$ docker run -d -p 9080:80 -v answer-data:/data --name answer answer-with-plugin
第三方插件
我们推荐使用官方插件,如果您想使用第三方插件,请参考以下内容。
- 如果第三方插件是公开可用的,您可以像官方插件一样使用它进行构建。
- 如果第三方插件是私有的,您需要下载它然后使用它进行构建。
用法
带有插件版本的答案的使用方式与以前相同。您可以在管理页面中找到该插件的配置。
升级
注意,如果是从非插件版本升级到插件版本,还需要执行升级命令(也算升级)。
您需要使用新的插件版本构建新的答案二进制文件,然后用新的答案替换旧的答案二进制文件。与普通升级一样,您需要根据部署方式执行不同的升级步骤。例如,如果您使用二进制部署,则需要执行“upgrade”命令。
开发和贡献
详情请参阅文档。
设计与原理
由于Golang是静态语言,没有友好的插件机制。因此,我们不使用动态方法,而是使用重新编译进行部署。详情请参阅博客。