本篇文章講解了如何利用云Travis CI Jekyll Docker 自動(dòng)化部署博客到云服務(wù)器滓玖,從而解決Github pages百度爬蟲禁用的問題。
本文章不包含Github pages 如何配置墙贱,相信Google上有類似的文章就不說明了
本人博客原文:https://elfgzp.cn/2018/10/02/travis-jekyll-docker.html
Jekyll Docker 容器構(gòu)建
在開始Jekyll
容器構(gòu)建之前檐盟,先說一下我用的是一款叫HardCandy-Jekyll的主題梯投,作者是xukimseven塞绿。
這款主題非常簡潔清新枕赵,而且對(duì)移動(dòng)端也有適配,在這里也感謝這位作者開源這個(gè)主題位隶。
在依照作者提供的部署說明在自己的倉庫部署好該主題后拷窜,在倉庫下先新建一個(gè)Dockerfile
文件用于容器構(gòu)建,Dockerfile
文件內(nèi)容如下涧黄。
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
文件內(nèi)容主要是使用ruby
容器為基礎(chǔ)篮昧,用gem
命令安裝jekyll
和bundler
,由于國內(nèi)使用國外的gem
源比較慢笋妥,所以我將源替換為gems.ruby-china.com
懊昨。
Centos 安裝Docker CE
在安裝前確保linux內(nèi)核版本是3.10以上并且是64位的centos版本。如果不能滿足這個(gè)前提春宣,建議看官的教程酵颁。
- 升級(jí)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
運(yùn)行完后重新打開ssh
會(huì)話躏惋。
使用Dockerfile構(gòu)建容器并運(yùn)行Jekyll
- 使用Dockerfile構(gòu)建容器
docker build -t elfgzp.github.io . # elfgzp.github.io為我的容器名稱
運(yùn)行結(jié)果如下:
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
- 構(gòu)建成功后測試Jekyll是否能夠運(yùn)行
docker run -d -p 4000:4000 elfgzp.github.io
運(yùn)行后使用docker ps
查看容器是否成功運(yùn)行,或者使用curl http://127.0.0.1:4000
訪問4000
端口嚷辅。
使用docker-compose來運(yùn)行容器
由于我們要實(shí)現(xiàn)自動(dòng)化構(gòu)建和運(yù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
的內(nèi)容非常簡單,內(nèi)容如下:
version: '3'
services:
blog:
build:
context: .
dockerfile: Dockerfile
image: elfgzp.github.io:latest # 這里是我鏡像的名字
network_mode: host
使用docker-compose構(gòu)建并運(yùn)行容器
這里將更新代碼的git pull
命令也加進(jìn)去了簸搞,運(yùn)行代碼如下:
git pull origin master && \
docker-compose build && \
docker-compose down && \
docker-compose up -d
運(yùn)行后會(huì)從git
倉庫拉取最新的代碼扁位,并根據(jù)Dockerfile
進(jìn)行容器構(gòu)建,并且重啟容器趁俊。
到這里我們已經(jīng)可以直接使用上面的命令拉取最新的代碼域仇,并且能夠構(gòu)建運(yùn)行新的容器,我們只剩下一個(gè)自動(dòng)觸發(fā)這個(gè)命令的工具寺擂,這里就需要用到Travis
暇务,接下來我會(huì)講解Travis
如何使用。
Travis 配置和使用
首先我們需要注冊一個(gè)Travis賬號(hào)沽讹,并且關(guān)聯(lián)Github
般卑。
- 在創(chuàng)建好賬號(hào)并關(guān)聯(lián)
Github
后,需要添加你的Github pages
倉庫爽雄。
- 在添加好后進(jìn)入倉庫的設(shè)置蝠检,點(diǎn)擊倉庫右邊的
more action
,并選擇settings
挚瘟。
然后需要從
Github
獲取一個(gè)DEPLOY_TOKEN
叹谁,步驟如下:-
進(jìn)入
Github
設(shè)置頁面饲梭,點(diǎn)擊Developer Settings
然后在點(diǎn)擊
Personal access tokens
,在點(diǎn)擊右上角的Generate new token
-
輸入生成的
token
名稱焰檩,然后勾選admin:public_key, admin:repo_hook, repo
-
最后將成的
DEPLOY_TOKEN
填入Travis
的Environment Variables
中 最后我們還需要配置
Travis
遠(yuǎn)程登陸我們云服務(wù)器的ssh key
-
首先需要在本地生成
id_ras_deploy
和id_ras_deploy.pub
ssh-keygen -t rsa -C "deploy_key" -f ~/.ssh/id_ras_deploy
-
然后將生成的
id_ras_deploy.pub
復(fù)制到云服務(wù)器中ssh-copy-id -i ~/.ssh/id_ras_deploy.pub gzp@cloud.elfgzp.cn # 我的服務(wù)器域名
-
在倉庫中創(chuàng)建
ssh_config
文件憔涉,內(nèi)容如下Host cloud.elfgzp.cn HostName cloud.elfgzp.cn StrictHostKeyChecking no User gzp IdentityFile ~/.ssh/id_ras_deploy
-
最后在安裝好
Travis
,運(yùn)行命令gem install travis travis login --auto # 注意這里登陸會(huì)要求輸入Github賬號(hào)密碼析苫,賬號(hào)是郵箱不是用戶名 touch .travis.yml travis encrypt-file ~/.ssh/id_ras_deploy --add
-
會(huì)在生成的
.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
中加入成功之后訪問云服務(wù)器執(zhí)行響應(yīng)的操作更新容器并運(yùn)行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
兜叨,如果使用的是默認(rèn)的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
結(jié)果,如果成功則最后的結(jié)果應(yīng)該與運(yùn)行docker-compose
的結(jié)果相同茫死。
總結(jié)
在網(wǎng)上其實(shí)還有很多通過coding pages
與github pages
同步的方式來解決百度爬蟲被禁用的問題跪但,之所以我會(huì)選擇這種方式,因?yàn)檫@種方式能學(xué)到更多使用的技術(shù)知識(shí)峦萎。
希望看完本文章由收獲的別忘了給我留言哦屡久。
參考文章
centos安裝docker,docker-compose
基于Docker搭建Jekyll并實(shí)現(xiàn)自動(dòng)部署
Jekyll + Travis CI 自動(dòng)化部署博客
Travis-ci遠(yuǎn)程部署到服務(wù)器
使用travis自動(dòng)部署hexo日志