# Gitee 借助 Gitee Go 将博客或文档知识库上传至阿里云 OSS 中

> [Gitee 借助 Gitee Go 将博客或文档知识库上传至阿里云 OSS 中](https://www.ftls.xyz/posts/gitee-oss/)
> Penned by [恐咖兵糖](https://www.ftls.xyz/) on 2022-06-29

Gitee借助 Gitee Go 将博客(文档知识库)上传至阿里云 OSS 中

<!--more-->

本文借助Gitee Go实现上传博客到阿里云中，成品在 https://note.ftls.xyz 。有两种方法可以实现。

## 准备工作
1. 博客本体，存储至 Gitee 中。并开通了 Gitee Go。
2. 阿里云存储桶一个。准备存储桶参数 endpoint ， bucketname。 并在基础设置中开启静态页面服务。
3. 有存储桶写入权限的阿里云 AccessKey 。即 accessKeyID 和 accessKeySecret 。
4. 服务器一台。不需要有公网ip,但是要有网。能被添加到 [Gitee 主机组管理](https://gitee.com/profile/host_groups) 即可。
5. Docker软件 + Docker 仓库 + [Gitee 凭证管理](https://gitee.com/profile/credentials)添加凭证 + Gitee 私人令牌


> 注意: 阿里OSS静态页面服务和阿里云CDN的OSS私有Bucket回源冲突! [原因及解决方案](https://help.aliyun.com/document_detail/321116.htm?spm=5176.11785003.domainDetail.20.227f142fdqCF03) 。

> 注意: 4，5满足其中一个即可。

> 说明: 本文使用[docsify](https://docsify.js.org/)作为博客网站生成渲染工具。docsify十分小巧。比起其他软件生成的一堆文件，docsify只需上传源文件。流量存储开销都很小。/root /home/kkbt





## 资料

[命令行工具ossutil快速入门](https://help.aliyun.com/document_detail/207217.html)

## 步骤

### 方法一 Shell 脚本执行

该方法大约执行 3s .总文件大小不到 100k ,文件数不到 20.

#### 在服务器上下载 git 和 ossutil 

git clone 自己的项目，git 操作私有库可以使用 `git config --global credential.helper store` 存储密码。或者 

`git clone https://<用户名>:<私人令牌>@gitee.com/<用户名>/<项目名>/`。

ossutil 安装和使用见[命令行工具ossutil快速入门](https://help.aliyun.com/document_detail/207217.html)

#### 主机组管理添加

打开 [Gitee 主机组管理](https://gitee.com/profile/host_groups) 

新建一组主机，添加主机。然后将命令复制到自己的服务器上(可以没有公网ip)。等待完成。

具体可见 https://gitee.com/help/categories/76

然后在 Gitee 新建一条流水线，触发事件选择 Push 事件 - 分支匹配留空可监听所有分支。

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629135254.png" caption="Push触发" >}}

Gitee Go 任务编排-工具Shell 脚本执行: 在指定主机组执行Shell脚本，可完成测试、部署等任务。

选择 任务编排，添加一个新任务。在 工具- Shell 脚本执行 中配置执行主机组和构建命令。

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629140042.png" caption="配置执行主机组和构建命令" >}}

构建命令就是会在自己服务器执行的脚本，可以参考

```bash
echo 'Start Push To OSS'
cd /home/kkbt/note
git pull
/home/kkbt/ossutil64 cp /home/kkbt/note/ oss://bucketname -rf --only-current-dir
/home/kkbt/ossutil64 cp /home/kkbt/note/text/ oss://bucketname/text -rf 
echo 'The End of Push'
```
两条上传主要排除 .git 文件夹。主要因为里面文件很多，还没必要上传。这之后只要Push就会触发脚本上传。

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629140400.png" caption="成功" >}}

### 方法二 Docker 

该方法大约执行 30s .总文件大小不到 100k ,文件数不到 20. 可自行打包镜像，也可以使用 alpine 或 ubuntu 。

#### 构建镜像

开源项目地址 https://github.com/chuangbo/docker-ossutil

Dockerfile:
```
FROM alpine as certs
RUN apk update && apk add ca-certificates

FROM busybox:glibc
COPY --from=certs /etc/ssl/certs /etc/ssl/certs

ENV OSSUTIL_VERSION 1.7.13

RUN mkdir -p /usr/local/bin \
    && wget http://gosspublic.alicdn.com/ossutil/${OSSUTIL_VERSION}/ossutil64 -O /usr/local/bin/ossutil \
    && chmod +x /usr/local/bin/ossutil

ENTRYPOINT ["/usr/local/bin/ossutil"]
```
原使用镜像: [chuangbo/ossutil](https://hub.docker.com/r/chuangbo/ossutil)

我自己clone一个并更新了 1.7.13 版本 . 放在阿里云公开仓库了. 大约 15M 。地址: 

```
registry.cn-hangzhou.aliyuncs.com/kkbt/ossutil:1.7.13
```

#### Docker仓库的配置

本文使用了[阿里云容器镜像服务](https://cr.console.aliyun.com/)作为Docker私人镜像仓库。创建命名空间、创建镜像仓库。一个仓库可以存储不同版本的镜像。在容器镜像服务/实例列表/镜像仓库/基本信息中可以找到操作指南。

打开[Gitee 凭证管理](https://gitee.com/profile/credentials)添加凭证。


{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629133459.png" caption="Gitee上添加凭证" >}}



#### 配置流水线


在 Giee 流水线设置四个全局参数

ENDPOINT

ACCESS_KEY_ID

ACCESS_KEY_SECRET

BUCKET_NAME

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629181009.png" caption="全局参数配置" >}}

在配置中引用

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629181205.png" caption="流水线内参数引用" >}}

配置任务

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220629181123.png" caption="配置任务" >}}

镜像地址 registry.cn-hangzhou.aliyuncs.com/kkbt/ossutil:1.7.13

构建命令

```bash
echo '开始构建'
/usr/local/bin/ossutil config -e ${ENDPOINT} -i ${ACCESS_KEY_ID} -k ${ACCESS_KEY_SECRET} -L CH -c /root/.ossutilconfig # 生成配置文件
/usr/local/bin/ossutil cp . oss://${BUCKET_NAME} -rf --only-current-dir 
/usr/local/bin/ossutil cp ./text/ oss://${BUCKET_NAME}/text -rf 
echo '完成推送'
```

我两条上传主要不上传 .git 文件夹。而阿里的 ossutil 不能排除文件夹，只能排除文件。至少 1.7.13 版本是这样。


#### 需要使用 Hugo , Hexo 等需要构建的博客

选择一个小 Linux 镜像 alpine。拉取镜像地址。拉取镜像地址 docker.io/alpine:latest  。

基于镜像的脚本执行的镜像地址填写 `docker.io/alpine:latest`。需要什么就安装什么，如hugo,hexo,zola等。

hexo 需要先安装 npm ，再使用 npm install -g hexo-cli 安装。hugo , zola 都可以通过 apk 安装。目前 mdbook 没有编译好的包，需要安装 Rust 环境，编译安装。

**下面是hugo的安装和一些测试**

构建命令填写 

```bash
echo '开始测试'
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # alpine 包管理 apk 换源
apk add hugo # apk 安装 hugo
hugo version # 测试 hugo
wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 # 下载 ossutil64
chmod 755 ossutil64 # 赋予 ossutil64 执行权限
./ossutil64 config -e ${ENDPOINT} -i ${ACCESS_KEY_ID} -k ${ACCESS_KEY_SECRET} -L CH -c /root/.ossutilconfig # 生成配置文件
cat /root/.ossutilconfig # 查看是否成功
```

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220701120505.png" caption="构建命令填写" >}}

**构建详情-基于镜像的脚本执行-执行日志脚本执行结果**

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220701120742.png" caption="执行结果" >}}

```
[2022-07-01 04:05:13]  ##################################################################################
[2022-07-01 04:05:13]  #             ____________.    _       __                                        #
[2022-07-01 04:05:13]  #            / __________/    (*)  .__/ /_.   _________.   _________.            #
[2022-07-01 04:05:13]  #           / /   ________.  / /  /__  __/   / _____  /   / _____  /             #
[2022-07-01 04:05:13]  #          / /   /_____/ /  / /    / /      / /____/ /   / /____/ /              #
[2022-07-01 04:05:13]  #         / /________/ /   / /    / /__.   / /______.   / /______.               #
[2022-07-01 04:05:13]  #         \_____**____/   /_/    /_**_/    \__**___/    \__**___/                #
[2022-07-01 04:05:13]  #                                                                                #
[2022-07-01 04:05:13]  ################################################################################## 
[2022-07-01 04:05:13] 
[2022-07-01 04:05:13] 开始测试
[2022-07-01 04:05:13] fetch https://mirrors.aliyun.com/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
[2022-07-01 04:05:16] fetch https://mirrors.aliyun.com/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
[2022-07-01 04:05:19] (1/3) Installing libgcc (11.2.1_git20220219-r2)
[2022-07-01 04:05:19] (2/3) Installing libstdc++ (11.2.1_git20220219-r2)
[2022-07-01 04:05:20] (3/3) Installing hugo (0.99.1-r0)
[2022-07-01 04:05:56] Executing busybox-1.35.0-r13.trigger
[2022-07-01 04:05:56] OK: 61 MiB in 17 packages
[2022-07-01 04:05:56] hugo v0.99.1-57dae1c2a4fbd9563f9c1ebf4196b5c5de4d6878+extended linux/amd64 BuildDate=2022-05-18T16:48:40Z
[2022-07-01 04:05:56] Connecting to gosspublic.alicdn.com (140.249.40.227:443)
[2022-07-01 04:05:56] saving to 'ossutil64'
[2022-07-01 04:05:56] ossutil64            100% |********************************|  9.9M  0:00:00 ETA
[2022-07-01 04:05:56] 'ossutil64' saved
[2022-07-01 04:05:56] [Credentials]
[2022-07-01 04:05:56] language=CH
[2022-07-01 04:05:56] endpoint=******
[2022-07-01 04:05:56] accessKeyID=******
[2022-07-01 04:05:56] accessKeySecret=******
```

## 总结

配合 OSS 的 CDN 更新触发，很好的完成了网站的自动部署和更新。

两个方法都跟通用，第二个通过简单配置即可使用。
