這個部落格是用 hexo 來製作的,優點是可以用 Markdown 寫法,且很多套件支援,讓我這個美感小白痴也可以輕鬆弄出富有質感的部落格(自己說)。
但也因為這樣,每次寫完文章都需要下 command 來編譯部落格、發佈到 Github ,讓我覺得不夠自動化
1 | hexo g |
剛好最近在玩 AWS ,就想說來弄一台 t2.small Centos 機器來做 CI 機器好了
AWS EC2
Launch Instance
AMI : CentOS 7
Type : t2.small
原本用 t2.micro ,但經過測試在 Jenkins 執行 Job 的時候常常因為記憶體不足就當掉了,改 t2.small 後穩定許多
因為我之前已經有其他台 EC2 ,所以這邊我選擇用已經產過的 ssh key 來當作連線這台機器的 Key
Security Group
SSH 連線需要開 22 Port,先確認一下 Security Group 有開啟
用剛剛產出的 pem 檔連線到機器
1 | ssh -i ~/.ssh/{yourSSH.pem} centos@{yourEc2IP} |
如果登入成功應該會看到這樣
如果遇到 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 還不是很熟的情況下,這邊只記下流水帳,詳細建議參考上述文章。
Install the OpenJDK 8 package
1
sudo yum install java-1.8.0-openjdk-devel
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
Add the Jenkins repository to your system
1
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
Install Jenkins
1
sudo yum install jenkins
Start the Jenkins service
1
sudo systemctl start jenkins
Check Jenkins Status
1 | systemctl status jenkins |
Enable the Jenkins service to start on system boot
1
sudo systemctl enable jenkins
設定
這時候透過瀏覽器連線 Jenkins,應該會得到 Timeout 的回應
1 | 網址:http://yourEc2PublicIP:8080 |
原因是機器的 Security Group 並沒有開放 80 Port 可以連進來,所以需要設定一下
再次連線應該就可以看到設定畫面了
第一次設定需要透過機器取得密碼
1 | sudo cat /var/lib/jenkins/secrets/initialAdminPassword |
將這段密碼貼上去後就可以進入下一步
選擇 Install Suggested plugins
設定 Admin User
Hexo
安裝 Nodejs 、 NPM
為了能在 Jenkins Build Hexo ,必須先安裝好 NodeJs 並安裝 Hexo
這邊一樣只節錄流水帳,詳細說明建議參考原文
Add NodeSource yum repository
1
curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
Install NodeJs and NPM
1
sudo yum install nodejs
Check
1
2node --version
npm --version
Install Git
1 | sudo yum install git |
Build Hexo
因為我原本就已經有 Hexo Blog Repository,所以我該先讓 Jenkins 機器能夠從 pull blog source
建立 ssh key
1
ssh-keygen
Add this ssh public key to github
1
cat ~/.ssh/id_rsa.pub
將這整段 Public Key 加到 Github
Install Hexo
1
sudo npm install hexo-cli -g
Test git clone and hexo build
1
2
3
4
5git clone git@github.com:yourRepository/yourRepository.github.io.source.git
cd yourRepository
npm install
hexo g
hexo server如果到這邊都正常,基本上 Jenkins 機器已經有能力幫你 Build Hexo了
Create Jenkins Job
新增作業
原始碼管理
設置 Credentials(點選 Add > Jenkins)
將 Private Key 貼進去
1
cat ~/.ssh/id_rsa
連線就正常了
建置觸發程序
建置
Github Webhook
這邊是要設定,當 Github 發現 Repository 被更新時,主動打個 Request 觸發剛剛建立好的 Jenkins
先進到 Your Repository > Settings > Webhooks
Add Webhooks
1
http://yourEc2PublicIP:8080/github-webhook/
請特別注意!! github-webhook/ 後面這個斜線一定要,不然會 302 錯誤
錯誤排除
看似一切美好又順利的把 Webhooks 接了起來,但觸發 Jenkins 後發現以下錯誤
1 | INFO Deploying: git |
為什麼 ? 剛剛不是遠端登進去都試過跟 Git 之前的操作沒問題嗎?
原來是因為剛剛的 SSH Key 是建立在 centos 這個登入帳號底下,Jenkins 是透過自己的帳號權限在執行,所以我們必須將剛剛的SSH Key 搬過去給你,並賦予它權限
1 | cp ~/.ssh/id_rsa.pub /var/lib/jenkins/.ssh/ |
移過去後還需要將檔案擁有者改成 Jenkins,或是你可以針對 Jenkins 這跟帳號設定檔案權限,我這邊選擇直接把擁有者改成 Jenkins
1 | sudo chown jenkins /var/lib/jenkins/.ssh/id_rsa.pub |
確認權限都正確就大功告成啦!!
現在你看到的這篇,就是透過 Jenkins 自動建置部署上來的