Python 自动上传 CDN 静态资源到 OSS Bucket

最初是使用 OSS-Browser 客户端上传前端静态资源到 OSS Bucket 里的,需要针对不同的环境,上传不同的静态资源到 OSS Bucket,每次都要切换账号,非常的笨拙机械,同时也无法也加入到自动化流程里,所以才有了这篇文章。

oss-browser.png

首先需要通过 pip 工具安装 oss2

pip install oss2

如果在安装过程中遇到一些网络问题,可以参考我之前写的一篇文章:Windows 命令行工具 CMD 设置网络代理

通过 oss2.Auth 方法进行授权认证

access_key_id = '6MKOqxGiGU4AUk44'
access_key_secret = 'ufu7nS8kS59awNihtjSonMETLI0KLy'
auth = oss2.Auth(access_key_id, access_key_secret)

通过 oss2.Bucket 方法获取 bucket 对象

endpoint = 'https://oss-cn-shanghai.aliyuncs.com'
bucket_name = 'static'
bucket = oss2.Bucket(auth, endpoint, bucket_name)

通过 bucket.put_object_from_file 方法上传本地文件到 OSS Bucket 里

key = '/v1.0.0/index.html'
filename = r'D:\project\index.html'
bucket.put_object_from_file(key, filename)

通过 bucket.object_exists 方法判断 OSS Bucket 是否已经存在相关资源。在上传文件之前,最好验证一下 key 是否存在,避免误操作,覆盖已有的线上资源,造成线上事故

key = '/v1.0.0'
bucket.object_exists(key)

封装获取 OSS Bucket 对象的方法,根据不同的环境,返回不同 bucket 对象

def get_bucket(env):
    endpoint = 'https://oss-cn-shanghai.aliyuncs.com'
    env_bucket = {
        's': {
            'access_key_id': '',
            'access_key_secret': '',
            'bucket_name': ''
        },
        'p': {
            'access_key_id': '',
            'access_key_secret': '',
            'bucket_name': ''
        }
    }
    auth = oss2.Auth(env_bucket[env]['access_key_id'], env_bucket[env]['access_key_secret'])
    bucket = oss2.Bucket(auth, endpoint, env_bucket[env]['bucket_name'])
    return bucket

批量上传本地前端资源到 OSS Bucket 里

if __name__ == "__main__":
    env = 's'
    version = 'v1.0.0'
    source_folder = r'D:\project'
    bucket = get_bucket(env)
    dest_folder_map = {
        's': 'static-staging/%s' % version,
        'p': 'static/%s' % version
    }
    dest_folder = dest_folder_map[env]
    if bucket.object_exists(dest_folder):
        print('%s 已存在,不可以重复上传文件' % dest_folder)
        exit()
    files = os.listdir(source_folder)
    total = len(files)
    count = 0
    for file in files:
        key = dest_folder + '/' + file
        filename = source_folder + '\\' + file
        bucket.put_object_from_file(key, filename)
        count += 1
        print('{0} [{1}/{2}]'.format(file, count, total))

通过 os.listdir 列出源目录下的文件列表,通过 counttotal 来观察前端静态资源的上传进度。

参考资料

  • 对象存储 OSS
  • aliyun-oss-python-sdk
  • oss2 接口文档

如果这篇文章对您有帮助,记得给作者点个赞,谢谢!

你可能感兴趣的:(Python 自动上传 CDN 静态资源到 OSS Bucket)