起因
最開(kāi)始我是使用CircleCI來(lái)進(jìn)行博客的自動(dòng)部署的,但是在部署的時(shí)候使用又拍云的upx同步博客到對(duì)象存儲(chǔ)的時(shí)候經(jīng)常出現(xiàn)504(網(wǎng)關(guān)超時(shí))錯(cuò)誤最后導(dǎo)致失敗。很容易就可以想應(yīng)該是因?yàn)楸娝苤木W(wǎng)絡(luò)原因,但是說(shuō)好的全球cdn呢:sweat:,這不免讓我對(duì)它的全球cdn的實(shí)力有所懷疑:joy:。于是就打算自己搭Jenkins服務(wù)器在國(guó)內(nèi)構(gòu)建部署解決問(wèn)題,順帶學(xué)習(xí)一下。

Jenkins安裝
Jenkins的詳細(xì)安裝方法可以參考官方的中文文檔:https://jenkins.io/zh/doc/book/installing/。這里我使用Docker進(jìn)行安裝,安裝時(shí)使用的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:
運(yùn)行的時(shí)候先別急著docker-compose up -d,先docker-compose up一下,這時(shí)如果防火墻安全組什么的設(shè)置沒(méi)有問(wèn)題的話可以在8080端口訪問(wèn)到了。在看終端的輸出信息的時(shí)候記錄一下初始安裝的隨機(jī)密碼,初始安裝的時(shí)候需要用到,之后就是根據(jù)網(wǎng)站的提示一直下一步下一步了。安裝配置結(jié)束后可以讓docker轉(zhuǎn)到后臺(tái)運(yùn)行。
使用前的配置
反向代理
直接使用8080端口當(dāng)然也是可以的,但是明顯看起來(lái)有點(diǎn)丑(主要是逼格不夠高:smirk:),這個(gè)這個(gè)時(shí)候我們就需要用到反向代理來(lái)處理一下了。這里我使用的是caddy,caddy的配置十分簡(jiǎn)單,兩行行實(shí)現(xiàn)https自動(dòng)申請(qǐng)續(xù)期與透明轉(zhuǎn)發(fā),我的Caddyfile如下所示。
https://ci.yinaoxiong.cn { gzip log /var/log/caddy/ci.log tls [email protected] proxy / localhost:8080 { transparent } }
添加虛擬內(nèi)存
安裝的時(shí)候看到官方對(duì)于小團(tuán)隊(duì)的推薦硬件配置自己這個(gè)騰訊云的學(xué)生機(jī)也算是勉強(qiáng)達(dá)到了,然后一頓操作猛如虎,然后build的時(shí)候out of memory甩臉上。然后用free -h看了一下發(fā)現(xiàn)自己的交互內(nèi)存配置的是0,趕緊加個(gè)1G的交換內(nèi)存試一下看看,這里使用交換文件添加交換內(nèi)存。具體操作如下所示:
#創(chuàng)建一個(gè)大小為1G的文件 sudo fallocate -l 1G /swapfile #鎖定root權(quán)限 sudo chmod 600 /swapfile #標(biāo)記文件為交換空間 sudo mkswap /swapfile #啟用交換空間 sudo swapon /swapfile #查看設(shè)置是否生效 free -h #配置寫(xiě)入fstab永久生效 #先備份文件 sudo cp /etc/fstab /etc/fstab.bak #寫(xiě)入文件 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
配置構(gòu)建與部署
Jenkins的使用這個(gè)問(wèn)題過(guò)于龐大,大家可以去官網(wǎng)看它的文檔學(xué)習(xí)一下,下面分享一下我的僅分享一下我自己的配置,這個(gè)博客的配置文件可以在這個(gè)鏈接中查看: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鏡像規(guī)范環(huán)境,因?yàn)楸緛?lái)就是從他們家遷移的就沒(méi)什么好改的了。構(gòu)建的時(shí)候?yàn)閞uby設(shè)置中國(guó)源加速訪問(wèn)。最后使用又拍云的upx工具同步到對(duì)象存儲(chǔ)中。
添加徽標(biāo)
原來(lái)使用CircleCI直接提供了構(gòu)建的徽標(biāo)鏈接來(lái)滿足用戶的使用(裝逼)需要,但是Jenkins本身沒(méi)有提供這個(gè)功能。好在萬(wàn)能的網(wǎng)友早已明白人們對(duì)于徽標(biāo)的使用(裝逼)需求,并創(chuàng)建了一個(gè)生成各種徽標(biāo)的開(kāi)源項(xiàng)目。項(xiàng)目的地址是:badges/shields,項(xiàng)目的一個(gè)demo網(wǎng)址是:https://shields.io/。
在build中點(diǎn)擊Jenkins按照要求填寫(xiě)好你就可以獲得你想要的徽標(biāo)了,我的填寫(xiě)方式如下所示。

配置方式
將my-blog更換成你自己的job名稱應(yīng)該就可以了,需要注意的是Jenkins默認(rèn)是不允許匿名查看的,所以直接上去一頓操作是不行的。需要先用管理員賬號(hào)在 系統(tǒng)管理》全局安全設(shè)置》訪問(wèn)控制 里面勾選允許匿名只讀訪問(wèn)才行。如果你不想這么做也可以自己使用badges/shields搭建服務(wù),然后按照這個(gè)文檔:Server Secrets,設(shè)置好具有權(quán)限的Jenkins賬號(hào)密碼,這樣就不用把構(gòu)建信息公開(kāi)了。