本篇文章講解了如何利用云Travis CI Jekyll Docker 自動化部署博客到云服務器,從而解決Github pages百度爬蟲禁用的問題。
本文章不包含Github pages 如何配置,相信Google上有類似的文章就不說明了
本人博客原文:https://elfgzp.cn/2018/10/02/travis-jekyll-docker.html
Jekyll Docker 容器構建
在開始Jekyll容器構建之前,先說一下我用的是一款叫HardCandy-Jekyll的主題,作者是xukimseven。
這款主題非常簡潔清新,而且對移動端也有適配,在這里也感謝這位作者開源這個主題。
在依照作者提供的部署說明在自己的倉庫部署好該主題后,在倉庫下先新建一個Dockerfile文件用于容器構建,Dockerfile文件內容如下。
FROM ruby:latest
RUN gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
RUN gem install jekyll bundler
COPY . /blog/
RUN bundle config mirror.https://rubygems.org https://gems.ruby-china.com
RUN cd blog \
&& bundler install
WORKDIR /blog
CMD bundle exec jekyll serve --host 0.0.0.0
文件內容主要是使用ruby容器為基礎,用gem命令安裝jekyll和bundler,由于國內使用國外的gem源比較慢,所以我將源替換為gems.ruby-china.com。
Centos 安裝Docker CE
在安裝前確保linux內核版本是3.10以上并且是64位的centos版本。如果不能滿足這個前提,建議看官的教程。
- 升級yum
sudo yum update
- 安裝Docker CE
sudo yum -y install docker
在安裝完docker后,還需要配置免sudo使用docker命令,步驟如下:
sudo groupadd docker
sudo gpasswd -a gzp docker # gzp為我的用戶名
sudo service docker restart
newgrp - docker
運行完后重新打開ssh會話。
使用Dockerfile構建容器并運行Jekyll
- 使用Dockerfile構建容器
docker build -t elfgzp.github.io . # elfgzp.github.io為我的容器名稱
運行結果如下:
Sending build context to Docker daemon 203.5MB
Step 1/8 : FROM ruby:latest
---> eb8759981348
Step 2/8 : RUN gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
---> Using cache
---> 9825055ad6ed
Step 3/8 : RUN gem install jekyll bundler
---> Using cache
---> 1f6bad52f4e4
Step 4/8 : COPY . /blog/
---> e252fdb8d16a
Step 5/8 : RUN bundle config mirror.https://rubygems.org https://gems.ruby-china.com
---> Running in aeb0a7c21689
Removing intermediate container aeb0a7c21689
---> 2a3944c701f0
Step 6/8 : RUN cd blog && bundler install
---> Running in 494cbc520804
Fetching gem metadata from https://gems.ruby-china.com/...........
Fetching public_suffix 3.0.2
Installing public_suffix 3.0.2
Using addressable 2.5.2
Using bundler 1.16.5
Using colorator 1.1.0
Using concurrent-ruby 1.0.5
Using eventmachine 1.2.7
Using http_parser.rb 0.6.0
Using em-websocket 0.5.1
Fetching ffi 1.9.23
Installing ffi 1.9.23 with native extensions
Using forwardable-extended 2.6.0
Using i18n 0.9.5
Using rb-fsevent 0.10.3
Using rb-inotify 0.9.10
Using sass-listen 4.0.0
Fetching sass 3.5.6
Installing sass 3.5.6
Using jekyll-sass-converter 1.5.2
Using ruby_dep 1.5.0
Using listen 3.1.5
Using jekyll-watch 2.0.0
Fetching kramdown 1.16.2
Installing kramdown 1.16.2
Using liquid 4.0.0
Using mercenary 0.3.6
Using pathutil 0.16.1
Fetching rouge 3.1.1
Installing rouge 3.1.1
Using safe_yaml 1.0.4
Fetching jekyll 3.8.1
Installing jekyll 3.8.1
Fetching jekyll-feed 0.9.3
Installing jekyll-feed 0.9.3
Fetching jekyll-seo-tag 2.4.0
Installing jekyll-seo-tag 2.4.0
Fetching minima 2.5.0
Installing minima 2.5.0
Bundle complete! 4 Gemfile dependencies, 29 gems now installed.
Bundled gems are installed into `/usr/local/bundle`
Removing intermediate container 494cbc520804
---> c5cadba1e55e
Step 7/8 : WORKDIR /blog
---> Running in ccff546be8e0
Removing intermediate container ccff546be8e0
---> 70d0f72ed6b1
Step 8/8 : CMD bundle exec jekyll serve --host 0.0.0.0
---> Running in ae3fd7719de5
Removing intermediate container ae3fd7719de5
---> e9973d4dac75
Successfully built e9973d4dac75
Successfully tagged elfgzp.github.io:latest
- 構建成功后測試Jekyll是否能夠運行
docker run -d -p 4000:4000 elfgzp.github.io
運行后使用docker ps查看容器是否成功運行,或者使用curl http://127.0.0.1:4000訪問4000端口。
使用docker-compose來運行容器
由于我們要實現(xiàn)自動化構建和運行容器,這里使用了docker-compose
Centos 安裝 docker-compose
sudo yum -y install epel-release
sudo yum -y install python-pip
pip install docker-compose
編寫docker-compose.yml
docker-compose.yml的內容非常簡單,內容如下:
version: '3'
services:
blog:
build:
context: .
dockerfile: Dockerfile
image: elfgzp.github.io:latest # 這里是我鏡像的名字
network_mode: host
使用docker-compose構建并運行容器
這里將更新代碼的git pull命令也加進去了,運行代碼如下:
git pull origin master && \
docker-compose build && \
docker-compose down && \
docker-compose up -d
運行后會從git倉庫拉取最新的代碼,并根據(jù)Dockerfile進行容器構建,并且重啟容器。
到這里我們已經(jīng)可以直接使用上面的命令拉取最新的代碼,并且能夠構建運行新的容器,我們只剩下一個自動觸發(fā)這個命令的工具,這里就需要用到Travis,接下來我會講解Travis如何使用。
Travis 配置和使用
首先我們需要注冊一個Travis賬號,并且關聯(lián)Github。
- 在創(chuàng)建好賬號并關聯(lián)
Github后,需要添加你的Github pages倉庫。

- 在添加好后進入倉庫的設置,點擊倉庫右邊的
more action,并選擇settings。

然后需要從
Github獲取一個DEPLOY_TOKEN,步驟如下:-
進入
Github設置頁面,點擊Developer SettingsWX20181003-003201@2x.png 然后在點擊
Personal access tokens,在點擊右上角的Generate new token

-
輸入生成的
token名稱,然后勾選admin:public_key, admin:repo_hook, repoWX20181003-003327@2x.png -
最后將成的
DEPLOY_TOKEN填入Travis的Environment Variables中WX20181003-021647@2x.png 最后我們還需要配置
Travis遠程登陸我們云服務器的ssh key-
首先需要在本地生成
id_ras_deploy和id_ras_deploy.pubssh-keygen -t rsa -C "deploy_key" -f ~/.ssh/id_ras_deploy -
然后將生成的
id_ras_deploy.pub復制到云服務器中ssh-copy-id -i ~/.ssh/id_ras_deploy.pub gzp@cloud.elfgzp.cn # 我的服務器域名 -
在倉庫中創(chuàng)建
ssh_config文件,內容如下Host cloud.elfgzp.cn HostName cloud.elfgzp.cn StrictHostKeyChecking no User gzp IdentityFile ~/.ssh/id_ras_deploy -
最后在安裝好
Travis,運行命令gem install travis travis login --auto # 注意這里登陸會要求輸入Github賬號密碼,賬號是郵箱不是用戶名 touch .travis.yml travis encrypt-file ~/.ssh/id_ras_deploy --add -
會在生成的
.travis.yml中看到before_install: - openssl aes-256-cbc -K $encrypted_f91baf41390f_key -iv $encrypted_f91baf41390f_iv -in id_ras_deploy.enc -out ~/.ssh/id_ras_deploy -d注意
~/.ssh有可能為~\/.ssh需要去掉\ -
我們還需要在
after_success中加入成功之后訪問云服務器執(zhí)行響應的操作更新容器并運行after_success: - ssh gzp@cloud.elfgzp.cn "cd ~/workspace/elfgzp.github.io && source ~/.zshrc && git pull origin master && docker-compose build && docker-compose down && docker-compose up -d"注意這里我使用的是
zsh所以配置是~/.zshrc,如果使用的是默認的bash,請使用~/.bashrc最后的
.travis文件格式如下:language: ruby rvm: - 2.3.3 addons: ssh_known_hosts: cloud.elfgzp.cn before_install: - openssl aes-256-cbc -K $encrypted_f91baf41390f_key -iv $encrypted_f91baf41390f_iv -in id_ras_deploy.enc -out ~/.ssh/id_ras_deploy -d - chmod 600 ~/.ssh/id_ras_deploy - cp ssh_config ~/.ssh/config script: - bundle install - bundle exec jekyll build after_success: - ssh gzp@cloud.elfgzp.cn "cd ~/workspace/elfgzp.github.io && source ~/.zshrc && git pull origin master && docker-compose build && docker-compose down && docker-compose up -d" branches: only: - master env: global: - NOKOGIRI_USE_SYSTEM_LIBRARIES=true大功告成,最后我們只需要把代碼提交到
master分支,然后到Travis中查看代碼的build結果,如果成功則最后的結果應該與運行docker-compose的結果相同。
總結
在網(wǎng)上其實還有很多通過coding pages與github pages同步的方式來解決百度爬蟲被禁用的問題,之所以我會選擇這種方式,因為這種方式能學到更多使用的技術知識。
希望看完本文章由收獲的別忘了給我留言哦。
參考文章
centos安裝docker,docker-compose
基于Docker搭建Jekyll并實現(xiàn)自動部署
Jekyll + Travis CI 自動化部署博客
Travis-ci遠程部署到服務器
使用travis自動部署hexo日志


