Hugo 自动化部署脚本 deploy.py

发布时间:2018年10月21日 阅读:621 次

CoderZh写了一个脚本用来自动部署 Hugo 博客,今天来说明一下怎么使用。

脚本路径:https://github.com/coderzh/coderzh-hugo-blog/blob/master/deploy.py


#!/usr/bin/env python
# coding:utf-8
import os
import sys
import glob
import locale
import shutil
import argparse
import subprocess
__author__ = 'coderzh'
GIT_REPO = [
    ['origin',  'gh-pages', 'git@github.com:coderzh/hugo-blog-deployed.git'],
    # ['gitcafe', 'gh-pages', 'git@gitcafe.com:coderzh/coderzh-hugo-blog.git'],
    ['coding',  'gh-pages', 'git@git.coding.net:coderzh/hugo-blog-deployed.git'],
]
DEPLOY_DIR = 'gh-pages'
class ChDir:
    """Context manager for changing the current working directory"""
    def __init__(self, new_path):
        self.newPath = os.path.expanduser(new_path)
    def __enter__(self):
        self.savedPath = os.getcwd()
        os.chdir(self.newPath)
    def __exit__(self, exception_type, exception_value, traceback):
        os.chdir(self.savedPath)
def deploy(args):
    current_dir = os.path.dirname(os.path.abspath(__file__))
    parent_dir = os.path.abspath(os.path.join(current_dir, '..'))
    public_dir = os.path.join(current_dir, 'public')
    commit_msg = ''
    with ChDir(current_dir):
        # step1 clean
        if os.path.exists(public_dir):
            shutil.rmtree(public_dir)
        if args.type == 'auto':
            subprocess.call('git fetch origin', shell=True)
            subprocess.call('git checkout master', shell=True)
            subprocess.call('git reset --hard origin/master', shell=True)
            subprocess.call('git clean -fdx', shell=True)
            subprocess.call('git submodule init', shell=True)
            subprocess.call('git submodule update', shell=True)
            subprocess.call('git submodule foreach git pull --rebase origin master', shell=True)
            
        # on windows set TERM=msys
        s = subprocess.Popen('git log -1 --pretty=format:"%s"',
                             shell=True, stdout=subprocess.PIPE)
        commit_msg = s.communicate()[0].decode('utf-8').encode(locale.getpreferredencoding())
        # step2 build
        subprocess.call('hugo -v --cacheDir="./cache"', shell=True)
    deploy_dir = os.path.join(parent_dir, DEPLOY_DIR)
    # step3 clone if not exists
    if not os.path.exists(deploy_dir):
        os.makedirs(deploy_dir)
        with ChDir(deploy_dir):
            subprocess.call('git init', shell=True)
            for repo in GIT_REPO:
                subprocess.call('git remote add {0} {1}'.format(repo[0], repo[2]), shell=True)
    elif args.type == 'first':
        with ChDir(deploy_dir):
            subprocess.call('git init', shell=True)
            for repo in GIT_REPO:
                subprocess.call('git remote add {0} {1}'.format(repo[0], repo[2]), shell=True)
    with ChDir(deploy_dir):
        # step4 clean and pull
        if len(GIT_REPO) > 0:
            subprocess.call('git fetch {0}'.format(GIT_REPO[0][0]), shell=True)
            if args.type == 'first':
                subprocess.call('git checkout --orphan temp', shell=True)
                subprocess.call('git rm --cached -r .', shell=True)
                subprocess.call('git clean -fdx', shell=True)
                subprocess.call('git branch -D {0}'.format(GIT_REPO[0][1]), shell=True)
                subprocess.call('git checkout -b {0}'.format(GIT_REPO[0][1]), shell=True)
            else:
                subprocess.call('git checkout {0}'.format(GIT_REPO[0][1]), shell=True)
            subprocess.call('git reset --hard {0}/{1}'.format(GIT_REPO[0][0], GIT_REPO[0][1]), shell=True)
            subprocess.call('git clean -fdx', shell=True)
        # step5 remove all files
        for f in os.listdir('.'):
            if f != '.git':
                if os.path.isfile(f):
                    os.remove(f)
                elif os.path.isdir(f):
                    shutil.rmtree(f)
        # step6 copy new files
        for f in os.listdir(public_dir):
            file_path = os.path.join(public_dir, f)
            if os.path.isfile(file_path):
                shutil.copy(file_path, '.')
            elif os.path.isdir(file_path):
                shutil.copytree(file_path, f)
        # step7 commit and push
        if len(GIT_REPO) > 0:
            subprocess.call('git add --all', shell=True)
            subprocess.call('git commit -a -m "{0}"'.format(commit_msg), shell=True)
            for repo in GIT_REPO:
                if args.test:
                    print('git push {0} {1}:{2} -u'.format(repo[0], GIT_REPO[0][1], repo[1]))
                else:
                    subprocess.call('git push {0} {1}:{2} -u'.format(repo[0], GIT_REPO[0][1], repo[1]), shell=True)
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='deploy hugo')
    parser.add_argument('type', help='auto or manual')
    parser.add_argument('-t', dest='test', action='store_true', help='for test')
    args = parser.parse_args()
    if args.type in ['auto', 'manual', 'first']:
        deploy(args)


原理

deploy.py 会自动执行 hugo 命令生成静态站点,然后将生成的文件拷贝到上层的一个目录里,然后,在那个目录里将文件 push 到你指定的 Git Repository 里。

使用方法

  1. 将 deploy.py 放到你的 Hugo 站点目录。(和 config.yaml 等文件放一起)

  2. 编辑 deploy.py 文件,修改你要部署到的 Git Repository:

    GIT_REPO = [    # [别名,   分支名,     Git Repo 路径]
        ['origin',  'gh-pages', 'git@github.com:coderzh/hugo-blog-deployed.git'],
        ['gitcafe', 'gh-pages', 'git@gitcafe.com:coderzh/coderzh-hugo-blog.git'],
    ]# 部署到哪里,相对上一级目录。比如下面的配置,会部署到 ../gh-pages 目录里DEPLOY_DIR = 'gh-pages'
  3. 如果你的网站需要指定皮肤,需要在 config 文件中指定 theme 。因为我的脚本在生成静态文件时并不会指定皮肤。

    theme: "rapid"
  4. 第一次执行,使用 first 参数,它会做一些初始化的操作。并使用 -t 表示只是测试一下,并不会真的 push 。

    python deploy.py first -t
  5. 中间可能需要输入密码,如果是自动化部署,可在 Git Repo 里添加一个没有密码的 SSH Key 。

  6. 如果一切正常,切换到 DEPLOY_DIR 目录,git log 看看 commit 记录是否正常。如果一切也如你所愿。则可以把 -t 参数去掉重新执行一遍,执行真的 push 操作:

    python deploy.py first
  7. 执行完成后,应该已经将生成的静态页面自动 push 到了你指定的 GIT_REPO 里。

  8. 之后如需再次手工部署,只需要使用 manual 参数,速度会快很多:

    python deploy.py manual
  9. 如果你想通过 webhook 来自动部署,使用 auto 参数,这样在执行 deploy.py 时,会使用 Git 自动更新你当前的 Hugo 站点目录 ,然后部署:

    python deploy.py auto

That’s all, 祝你好运!

原文:http://www.gohugo.org/2015/11/21/hugo-deploy-script/

本文标题:Hugo 自动化部署脚本 deploy.py
本文链接:http://malonghua.com/post/26.html
作者授权:除特别说明外,本文由 SylarM 原创编译并授权 猪逻辑公园工作室 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
Tag:Hugo 自动部署
相关文章
发表评论

发表评论: