简介

建立 blog 后,希望每次在 Drone 自动构建完成博客后,自动提交网站链接。 此种更新一般情况是由站点生成 sitemap.xml 搜素引擎根据 sitemap.xml 记录进行更新。 但是由于 baidu 要求的 sitemap.xml 与标准的 sitemap.xml 不同。同时生成起来还需要理解 baidusitemap.xml 的格式,比较麻烦。 当前通过解析普通的 sitemap.xml,调用 baidu 的「主动提交」接口更新链接

原理

  • 解析 sitemap.xml
  • 调用 baidu 主动推送接口更新链接

具体实现

controller

逻辑很简单,实现解析 xml 和更新 url 的两个函数 ,具体可见文件 controller/impl/sitemap.go

main 方法

drone 的插件是通过 PLUGIN_XXX 将 drone 中的变量以环境变量的形式打入,该方法中首先通过从 os 中获取 PLUGIN_SITE 等环境变量,近一步调用已实现的 controller 方法完成解析和更新

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func main() {
	ctx := context.Background()

	site := os.Getenv("PLUGIN_SITE")
	token := os.Getenv("PLUGIN_TOKEN")
	path := os.Getenv("PLUGIN_PATH")

	SiteMapController := impl.DefaultSiteMapController
	urls := SiteMapController.GetSiteMapUrls(ctx, path)
	SiteMapController.SendData(ctx, site, token, strings.Join(urls, "\n"))
}

部署流程

Makefile

生成 release 二进制文件

1
2
build_linux_amd64:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -a -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o release/linux/amd64/$(DEPLOY_IMAGE)

Docker 打包

采用 plugins/base:linux-amd64 作为基础镜像,将 Make 方法生成的二进制文件拷入 docker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
FROM plugins/base:linux-amd64

LABEL maintainer="Hou Rong <nmghr9@gmail.com>" \
  org.label-schema.name="Drone Baidu Sitemap" \
  org.label-schema.vendor="Hou Rong" \
  org.label-schema.schema-version="1.0"

RUN apk add --no-cache ca-certificates && \
  rm -rf /var/cache/apk/*

COPY release/linux/amd64/drone-baidu-sitemap /bin/
ENTRYPOINT ["/bin/drone-baidu-sitemap"]

部署配置

以上方法实现后,基本功能已经实现,配置 .drone.yml 自动构建发布

发布至 docker-hub 后效果如下

使用

使用方法有两种

  • 使用 drone 作为 CI。配置 drone 的 pipeline 进行使用
  • 使用其他 CI 或本地使用。Docker 运行直接使用

ps: 直接把二进制打包进去的,只有 7MB,镜像很小不用担心网络上的问题

drone 配置

将 baidu-sitemap 作为构建的一个步骤放入,配置 site、token、path 即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kind: pipeline
name: default

steps:
  - name: baidu-sitemap
    image: henryhou009/drone-baidu-sitemap:linux-amd64
    settings:
      site: henryhou.com
      token: 
        from_secret: baidu_sitemap_token
      path: ./public/sitemap.xml

Docker 直接运行

采用以下方法启动 drone-baidu-sitemap。 需要使用 -v 参数,与 -w 参数,将当前工作环境与 docker 中的路径进行匹配,该操作用于在 docker 项目中能够打开 sitemap.xml 文件

1
2
3
4
5
6
docker run --rm \
           -e PLUGIN_SITE=host \   # site 例如 henryhou.com
           -e PLUGIN_TOKEN=token \ # baidu token
           -e PLUGIN_PATH=./public/sitemap.xml \
           -v $(pwd):$(pwd) \
           -w $(pwd) henryhou009/drone-baidu-sitemap

总结

由于 baidu 要求的 sitemap.xml 与标准 sitemap.xml 不同。在个人博客中需要对 baidu 的链接提交进行定制。通过实现百度的链接提交,采用主动推送的方式自动更新。 本文中通过百度的「主动推送」接口实现了更新博客链接的插件,并提供打包后的 drone plugin 以便大家使用