当我们需要对Answer的功能做一些扩展时,例如OAuth登录,我们设计了一种使用插件的方式来实现这些功能。

介绍

官方插件

您可以在[此处]找到官方支持的 Answer 插件列表(https://github.com/apache/incubator-answer-plugins).

插件类型

我们将插件分为不同的类型。不同类型的插件有不同的功能。同一类型的插件具有相同的效果,但实现方式不同。

  • Connector:Connector插件帮助我们实现第三方登录功能。例如GitHub OAuth 登录
  • 存储:存储插件帮助我们将文件上传到第三方存储。 (预览)
  • 缓存:支持使用不同的缓存中间件。例如Redis(预览)
  • 过滤:过滤掉非法问题或答案。 (即将推出)
  • 渲染:不同内容格式的解析器。 (即将推出)
  • Finder:支持使用搜索引擎加速搜索问题答案。 (即将推出)

建造

答案二进制文件支持将不同的所需插件打包到二进制文件中。

先决条件

命令

我们使用 Answer 二进制文件提供的 build 命令来重建带有插件的 Answer 版本。

例如,让我们看看如何构建包含 github 第三方登录插件的 Answer 二进制文件。

  1. # answer build --with [plugin@plugin_version=[replacement]] --output [file]
  2. $ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
  3. # build a new answer with github login plugin then output to ./new_answer.
  4. $ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0 --output ./new_answer
  5. # with multiple plugins
  6. $ ./answer build \
  7. --with github.com/apache/incubator-answer-plugins/connector-github \
  8. --with github.com/apache/incubator-answer-plugins/connector-google
  9. # with local plugins
  10. $ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0=/my-local-space
  11. # cross compilation. Build a linux-amd64 binary in macos
  12. $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
  13. # specify the answer version using ANSWER_MODULE environment variable
  14. $ ANSWER_MODULE=github.com/apache/incubator-answer@v1.2.0-RC1 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github

您可以使用 plugin 命令列出当前包含插件的二进制文件。

  1. $ ./new_answer plugin
  2. # output
  3. # github connector[0.0.1] made by answerdev
  4. # google connector[0.0.1] made by answerdev

构建docker镜像与插件从回答基础镜像

您可以按照上述步骤先使用插件构建二进制文件,然后构建包含该二进制文件的 docker 镜像。当然,您也可以直接在原始图像之上构建。

  1. FROM apache/answer as answer-builder
  2. FROM golang:1.19-alpine AS golang-builder
  3. COPY --from=answer-builder /usr/bin/answer /usr/bin/answer
  4. RUN apk --no-cache add \
  5. build-base git bash nodejs npm go && \
  6. npm install -g pnpm@8.9.2
  7. RUN answer build \
  8. --with github.com/apache/incubator-answer-plugins/connector-basic \
  9. --with github.com/apache/incubator-answer-plugins/storage-s3 \
  10. --with github.com/apache/incubator-answer-plugins/search-elasticsearch \
  11. --output /usr/bin/new_answer
  12. FROM alpine
  13. LABEL maintainer="linkinstar@apache.org"
  14. ARG TIMEZONE
  15. ENV TIMEZONE=${TIMEZONE:-"Asia/Shanghai"}
  16. RUN apk update \
  17. && apk --no-cache add \
  18. bash \
  19. ca-certificates \
  20. curl \
  21. dumb-init \
  22. gettext \
  23. openssh \
  24. sqlite \
  25. gnupg \
  26. tzdata \
  27. && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
  28. && echo "${TIMEZONE}" > /etc/timezone
  29. COPY --from=golang-builder /usr/bin/new_answer /usr/bin/answer
  30. COPY --from=answer-builder /data /data
  31. COPY --from=answer-builder /entrypoint.sh /entrypoint.sh
  32. RUN chmod 755 /entrypoint.sh
  33. VOLUME /data
  34. EXPOSE 80
  35. ENTRYPOINT ["/entrypoint.sh"]

您可以更新 —with 参数以添加更多您需要的插件。

  1. # create a Dockerfile and copy the content above
  2. $ vim Dockerfile
  3. $ docker build -t answer-with-plugin .
  4. $ docker run -d -p 9080:80 -v answer-data:/data --name answer answer-with-plugin

第三方插件

我们推荐使用官方插件,如果您想使用第三方插件,请参考以下内容。

  • 如果第三方插件是公开可用的,您可以像官方插件一样使用它进行构建。
  • 如果第三方插件是私有的,您需要下载它然后使用它进行构建。

用法

带有插件版本的答案的使用方式与以前相同。您可以在管理页面中找到该插件的配置。

plugin-config-admin-page

升级

注意,如果是从非插件版本升级到插件版本,还需要执行升级命令(也算升级)。

您需要使用新的插件版本构建新的答案二进制文件,然后用新的答案替换旧的答案二进制文件。与普通升级一样,您需要根据部署方式执行不同的升级步骤。例如,如果您使用二进制部署,则需要执行“upgrade”命令。

开发和贡献

详情请参阅文档

设计与原理

由于Golang是静态语言,没有友好的插件机制。因此,我们不使用动态方法,而是使用重新编译进行部署。详情请参阅博客