Travis CI Jekyll Docker 自動化部署博客到云服務器

本篇文章講解了如何利用云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命令安裝jekyllbundler,由于國內使用國外的gem源比較慢,所以我將源替換為gems.ruby-china.com

Centos 安裝Docker CE

在安裝前確保linux內核版本是3.10以上并且是64位的centos版本。如果不能滿足這個前提,建議看官的教程。

  1. 升級yum

sudo yum update

  1. 安裝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

  1. 使用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

  1. 構建成功后測試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

  1. 在創(chuàng)建好賬號并關聯(lián)Github后,需要添加你的Github pages倉庫。
WX20181003-002426@2x.png
  1. 在添加好后進入倉庫的設置,點擊倉庫右邊的more action,并選擇settings。
WX20181003-002806@2x.png
  1. 然后需要從Github獲取一個DEPLOY_TOKEN,步驟如下:

  2. 進入Github設置頁面,點擊Developer Settings

    WX20181003-003201@2x.png
  3. 然后在點擊Personal access tokens,在點擊右上角的Generate new token

WX20181003-003247@2x.png
  1. 輸入生成的token名稱,然后勾選admin:public_key, admin:repo_hook, repo

    WX20181003-003327@2x.png
  2. 最后將成的DEPLOY_TOKEN填入TravisEnvironment Variables

    WX20181003-021647@2x.png
  3. 最后我們還需要配置Travis遠程登陸我們云服務器的ssh key

  4. 首先需要在本地生成id_ras_deployid_ras_deploy.pub

    
    ssh-keygen -t rsa -C "deploy_key" -f ~/.ssh/id_ras_deploy
    
    
  5. 然后將生成的id_ras_deploy.pub復制到云服務器中

    
    ssh-copy-id -i ~/.ssh/id_ras_deploy.pub  gzp@cloud.elfgzp.cn # 我的服務器域名
    
    
  6. 在倉庫中創(chuàng)建ssh_config文件,內容如下

    
    Host cloud.elfgzp.cn
    
        HostName cloud.elfgzp.cn
    
        StrictHostKeyChecking no
    
        User gzp
    
        IdentityFile ~/.ssh/id_ras_deploy
    
    
  7. 最后在安裝好Travis,運行命令

    
    gem install travis
    
    travis login --auto  # 注意這里登陸會要求輸入Github賬號密碼,賬號是郵箱不是用戶名
    
    touch .travis.yml
    
    travis encrypt-file ~/.ssh/id_ras_deploy --add
    
    
  8. 會在生成的.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需要去掉\

  9. 我們還需要在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 pagesgithub pages同步的方式來解決百度爬蟲被禁用的問題,之所以我會選擇這種方式,因為這種方式能學到更多使用的技術知識。

希望看完本文章由收獲的別忘了給我留言哦。

參考文章

centos安裝docker,docker-compose
基于Docker搭建Jekyll并實現(xiàn)自動部署
Jekyll + Travis CI 自動化部署博客
Travis-ci遠程部署到服務器
使用travis自動部署hexo日志

https://elfgzp.cn/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容