Build my first blog by Hugo and Github, auto deploy by Travis <2> :: 漫步在数位灵魂之中

首先需要建立两个Repository,一个是 Username.github.io,这个github会自动启动pages服务。另外一个repository可以随便命名,我命名为BlogSource,记得设定成private,这个仓库是要放local电脑上所有hugo的相关数据和设定,因为有可能包含私人的参数,这些数据最好不要放在公开的repository上,避免有心人利用

create BlogSource BlogSource建立好之后,复制git网址并将网址加入到在本地端的hugo目录的git config中,git相关的设定请自行搜寻建立相关知识。这里github也很贴心的提供相关的操作,只要按照步骤应该能够完成设定 BlogSource git config

再来我们要建立一个token,位置在 Settings -> Developer settings -> Personal access tokens -> Generate new token ,要将 repo:status, repo_deployment, public_repo三个选项勾起来

generate token

然后你会产生出来一串凭证,请保存起来,接着需要这个凭证可以让 Travis-ci 执行自动化工作后,接着将最后的静态网页push to pages服务的repository上 copy token string

Travis设定

Travis-ci 建立一个账号,可是事实上travis-ci.com已经跟github高度整合,只需要点击右上角的sign in with github,接着点击 Manage repositories on Github,默认可以控制所有的repository,这样有点恐怖,所以我这里改成指定特定的仓库即可 Only select repositories

此时会回到Travis-ci,就可以看到BlogSource出现在列表中 import repositories

开始设定token到Travis-ci,点击BlogSource 旁的settings按钮,如画面将选项打开,同时新增一组Environment Variables,命名为GITHUB_TOKEN,Value就填入刚刚在github产生的凭证字符串,然后按下Add。完毕后Travis-ci的设定工作就算完成了 add github_token

撰写 .travis.yml

最后我们回到local端,到hugo site的目录下新增一个 .travis.yml,内容如下

language: go

go:
  - "1.8"  # 指定Golang 1.8

install:
    - wget https://github.com/gohugoio/hugo/releases/download/v0.55.4/hugo_0.55.4_Linux-64bit.deb
    - sudo dpkg -i hugo*.deb

before_script:
  - echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config
  - git config --global user.email ${GITHUB_EMAIL}
  - git config --global user.name ${GITHUB_USERNAME}

script:
  - hugo 

after_script:
  - git clone "https://chimerakang:${GithubToken}@${GH_REF}" github-pages
  - rm github-pages/public -rf
  - cp ./public/* github-pages -rf
  - cd github-pages
  - git add .
  - git commit -m "Update Blog By TravisCI with Build $TRAVIS_BUILD_NUMBER"
  - git tag v0.0.$TRAVIS_BUILD_NUMBER -a -m "Auto Taged By TravisCI With Build $TRAVIS_BUILD_NUMBER"
  # github Pages
  - git push --force "https://${GITHUB_TOKEN}@${GH_REF}" master:master
  # github Pages
  - git push "https://${GITHUB_TOKEN}@${GH_REF}" master:master --tags

env: 
  global:
    - GH_REF: github.com/chimerakang/chimerakang.github.io.git

撰写这个script之前我参考了相当多网络文章,试了一整天发现很多错误,根本做不到他们说的可以自动更新我的Pages页面。或许是年代久远,或者很多人只是互相抄袭我不知道,直到自己大概想一下前因后果,了解Travis-ci的运行原理是在Travis-ci中建立一个虚拟机,可能也是利用docker的方式,每次建立hugo环境,然后将更新的BlogSource目录下执行hugo命令将静态网页产生出来,这个动作和我们在本机端是一样的。

但是在after_script阶段的动作就相当重要,先将个人pages的repository pull到 github-pages中,然后将静态网页的结果正个复制到 github-pages目录中,最后再push回去,此时你的博客就更新了

所以之后只要在本地端的内容写了新的贴文或者修改内容,push to github,Travis-ci就会自动将博客更新,这样世界是不是很美好

附注

注意一下其实travis-ci有两个服务,几乎所有人都是介绍travis-ci.org,但是这个只能支持public repository,在我看来实在不妥,毕竟以资安的角度来看,一些设定和个人参数,甚至连token这些数据放在每个人都可以任意存取的地方,实在是风险很大。还好我后来找了数据发现原来travis-ci.com是个孪生兄弟,是商业版的服务,不一样的是支持了private repository的存取,于是改用travis-ci.com是比较安全的选择,至少private repository是无法任意存取的,比较令人放心将数据放在上面。

参考: