起因
最開始我是使用CircleCI來進行博客的自動部署的,但是在部署的時候使用又拍云的upx同步博客到對象存儲的時候經常出現504(網關超時)錯誤最后導致失敗。很容易就可以想應該是因為眾所周知的網絡原因,但是說好的全球cdn呢:sweat:,這不免讓我對它的全球cdn的實力有所懷疑:joy:。于是就打算自己搭Jenkins服務器在國內構建部署解決問題,順帶學習一下。
Jenkins安裝
Jenkins的詳細安裝方法可以參考官方的中文文檔:https://jenkins.io/zh/doc/book/installing/。這里我使用Docker進行安裝,安裝時使用的docker-compose.yml配置文件如下所示:
version: "3" services: kms: image: jenkinsci/blueocean user: root ports: - 8080:8080 volumes: - jenkins-data:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock restart: always volumes: jenkins-data:
運行的時候先別急著docker-compose up -d,先docker-compose up一下,這時如果防火墻安全組什么的設置沒有問題的話可以在8080端口訪問到了。在看終端的輸出信息的時候記錄一下初始安裝的隨機密碼,初始安裝的時候需要用到,之后就是根據網站的提示一直下一步下一步了。安裝配置結束后可以讓docker轉到后臺運行。
使用前的配置
反向代理
直接使用8080端口當然也是可以的,但是明顯看起來有點丑(主要是逼格不夠高:smirk:),這個這個時候我們就需要用到反向代理來處理一下了。這里我使用的是caddy,caddy的配置十分簡單,兩行行實現https自動申請續期與透明轉發,我的Caddyfile如下所示。
https://ci.yinaoxiong.cn { gzip log /var/log/caddy/ci.log tls aoxiongyin@qq.com proxy / localhost:8080 { transparent } }
添加虛擬內存
安裝的時候看到官方對于小團隊的推薦硬件配置自己這個騰訊云的學生機也算是勉強達到了,然后一頓操作猛如虎,然后build的時候out of memory甩臉上。然后用free -h看了一下發現自己的交互內存配置的是0,趕緊加個1G的交換內存試一下看看,這里使用交換文件添加交換內存。具體操作如下所示:
#創建一個大小為1G的文件 sudo fallocate -l 1G /swapfile #鎖定root權限 sudo chmod 600 /swapfile #標記文件為交換空間 sudo mkswap /swapfile #啟用交換空間 sudo swapon /swapfile #查看設置是否生效 free -h #配置寫入fstab永久生效 #先備份文件 sudo cp /etc/fstab /etc/fstab.bak #寫入文件 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
配置構建與部署
Jenkins的使用這個問題過于龐大,大家可以去官網看它的文檔學習一下,下面分享一下我的僅分享一下我自己的配置,這個博客的配置文件可以在這個鏈接中查看:Jenkinsfile。目前使用 的配置文件如下所示:
pipeline { agent { docker { image 'circleci/ruby:2.6.0' } } stages { stage('build') { steps { sh 'gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/' sh 'sudo gem install bundler -f' sh 'bundle config mirror.https://rubygems.org https://gems.ruby-china.com' sh 'bundle install --jobs=4 --retry=3 --path vendor/bundle' sh 'bundle exec jekyll build' } } stage('deploy') { steps { sh 'wget -c http://collection.b0.upaiyun.com/softwares/upx/upx-linux-amd64-v0.2.3' sh 'mv upx-linux-amd64-v0.2.3 upx' sh 'chmod +x upx' sh './upx login yax-blog ${upx_USR} ${upx_PSW}' sh './upx sync _site/ / --delete' } } } environment { upx = credentials('upyun-account') } }
直接使用CircleCI家的docker鏡像規范環境,因為本來就是從他們家遷移的就沒什么好改的了。構建的時候為ruby設置中國源加速訪問。最后使用又拍云的upx工具同步到對象存儲中。
添加徽標
原來使用CircleCI直接提供了構建的徽標鏈接來滿足用戶的使用(裝逼)需要,但是Jenkins本身沒有提供這個功能。好在萬能的網友早已明白人們對于徽標的使用(裝逼)需求,并創建了一個生成各種徽標的開源項目。項目的地址是:badges/shields,項目的一個demo網址是:https://shields.io/。
在build中點擊Jenkins按照要求填寫好你就可以獲得你想要的徽標了,我的填寫方式如下所示。
配置方式
將my-blog更換成你自己的job名稱應該就可以了,需要注意的是Jenkins默認是不允許匿名查看的,所以直接上去一頓操作是不行的。需要先用管理員賬號在 系統管理》全局安全設置》訪問控制 里面勾選允許匿名只讀訪問才行。如果你不想這么做也可以自己使用badges/shields搭建服務,然后按照這個文檔:Server Secrets,設置好具有權限的Jenkins賬號密碼,這樣就不用把構建信息公開了。