0%

Jenkins,GitHub自動化部署Hexo

/images/20190301/0.png

這個部落格是用 hexo 來製作的,優點是可以用 Markdown 寫法,且很多套件支援,讓我這個美感小白痴也可以輕鬆弄出富有質感的部落格(自己說)。

但也因為這樣,每次寫完文章都需要下 command 來編譯部落格、發佈到 Github ,讓我覺得不夠自動化

1
2
$ hexo g 
$ hexo deploy

剛好最近在玩 AWS ,就想說來弄一台 t2.small Centos 機器來做 CI 機器好了

/images/20190301/1.png


AWS EC2


Launch Instance

AMI : CentOS 7

/images/20190301/2.png

Type : t2.small

/images/20190301/3.png

原本用 t2.micro ,但經過測試在 Jenkins 執行 Job 的時候常常因為記憶體不足就當掉了,改 t2.small 後穩定許多

因為我之前已經有其他台 EC2 ,所以這邊我選擇用已經產過的 ssh key 來當作連線這台機器的 Key

/images/20190301/4.png


Security Group

SSH 連線需要開 22 Port,先確認一下 Security Group 有開啟

/images/20190301/5.png

用剛剛產出的 pem 檔連線到機器

1
$ ssh -i ~/.ssh/{yourSSH.pem} centos@{yourEc2IP}

如果登入成功應該會看到這樣

/images/20190301/6.png

如果遇到 Permission denied ,你需要先調整剛剛下載下來的 pem 檔的權限

1
$ chmod 400 yourSSH.pem

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for ‘amazonec2.pem’ are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: amazonec2.pem
Permission denied (publickey).


Jenkins


安裝

基本上我完全是按照上面的文章教學一步一步完成的,在 Linux 還不是很熟的情況下,這邊只記下流水帳,詳細建議參考上述文章。

  1. Install the OpenJDK 8 package

    1
    $ sudo yum install java-1.8.0-openjdk-devel
  2. Import the GPG key

    1
    $ curl --silent --location http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo | sudo tee /etc/yum.repos.d/jenkins.repo
  3. Add the Jenkins repository to your system

    1
    $ sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
  4. Install Jenkins

    1
    $ sudo yum install jenkins
  5. Start the Jenkins service

    1
    $ sudo systemctl start jenkins
  6. Check Jenkins Status

1
$ systemctl status jenkins

/images/20190301/7.png

  1. Enable the Jenkins service to start on system boot

    1
    $ sudo systemctl enable jenkins

設定

這時候透過瀏覽器連線 Jenkins,應該會得到 Timeout 的回應

1
網址:http://yourEc2PublicIP:8080

/images/20190301/8.png

原因是機器的 Security Group 並沒有開放 80 Port 可以連進來,所以需要設定一下

/images/20190301/9.png

再次連線應該就可以看到設定畫面了

/images/20190301/10.png


第一次設定需要透過機器取得密碼

1
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

/images/20190301/11.png

將這段密碼貼上去後就可以進入下一步

/images/20190301/12.png

選擇 Install Suggested plugins

/images/20190301/13.png

設定 Admin User

/images/20190301/14.png

/images/20190301/15.png

Hexo


安裝 Nodejs 、 NPM

為了能在 Jenkins Build Hexo ,必須先安裝好 NodeJs 並安裝 Hexo

這邊一樣只節錄流水帳,詳細說明建議參考原文

  1. Add NodeSource yum repository

    1
    $ curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
  2. Install NodeJs and NPM

    1
    $ sudo yum install nodejs
  3. Check

    1
    2
    $ node --version
    $ npm --version

Install Git

1
2
$ sudo yum install git
$ git --version

Build Hexo

因為我原本就已經有 Hexo Blog Repository,所以我該先讓 Jenkins 機器能夠從 pull blog source

  1. 建立 ssh key

    1
    $ ssh-keygen

    /images/20190301/16.png

  2. Add this ssh public key to github

    1
    $ cat ~/.ssh/id_rsa.pub

    將這整段 Public Key 加到 Github

    /images/20190301/17.png

    /images/20190301/18.png

  3. Install Hexo

    1
    $ sudo npm install hexo-cli -g
  4. Test git clone and hexo build

    1
    2
    3
    4
    5
    $ git clone git@github.com:yourRepository/yourRepository.github.io.source.git
    $ cd yourRepository
    $ npm install
    $ hexo g
    $ hexo server

    如果到這邊都正常,基本上 Jenkins 機器已經有能力幫你 Build Hexo了


Create Jenkins Job

  1. 新增作業

    /images/20190301/19.png

  2. 原始碼管理

    /images/20190301/20.png

  3. 設置 Credentials(點選 Add > Jenkins)

    將 Private Key 貼進去

    1
    $ cat ~/.ssh/id_rsa

    /images/20190301/21.png

    連線就正常了

    /images/20190301/22.png

  4. 建置觸發程序

    /images/20190301/23.png

  5. 建置

    /images/20190301/24.png


Github Webhook

這邊是要設定,當 Github 發現 Repository 被更新時,主動打個 Request 觸發剛剛建立好的 Jenkins

  1. 先進到 Your Repository > Settings > Webhooks

    /images/20190301/25.png

  2. Add Webhooks

    1
    http://yourEc2PublicIP:8080/github-webhook/

    請特別注意!! github-webhook/ 後面這個斜線一定要,不然會 302 錯誤

    /images/20190301/26.png

錯誤排除

看似一切美好又順利的把 Webhooks 接了起來,但觸發 Jenkins 後發現以下錯誤

1
2
3
INFO  Deploying: git
Permission denied (publickey).
fatal: Could not read from remote repository.

為什麼 ? 剛剛不是遠端登進去都試過跟 Git 之前的操作沒問題嗎?

原來是因為剛剛的 SSH Key 是建立在 centos 這個登入帳號底下,Jenkins 是透過自己的帳號權限在執行,所以我們必須將剛剛的SSH Key 搬過去給你,並賦予它權限

1
2
$ cp ~/.ssh/id_rsa.pub /var/lib/jenkins/.ssh/
$ cp ~/.ssh/id_rsa /var/lib/jenkins/.ssh/

移過去後還需要將檔案擁有者改成 Jenkins,或是你可以針對 Jenkins 這跟帳號設定檔案權限,我這邊選擇直接把擁有者改成 Jenkins

1
2
$ sudo chown jenkins /var/lib/jenkins/.ssh/id_rsa.pub
$ sudo chown jenkins /var/lib/jenkins/.ssh/id_rsa

確認權限都正確就大功告成啦!!

/images/20190301/27.png


現在你看到的這篇,就是透過 Jenkins 自動建置部署上來的