Gitlab持續集成是Gitlab提供的一整套持續集成、持續交付解決方案。Gitlab自9.0版本開始增長了CI和CD功能,因此若是你的公司裏的Gitlab上在Settings裏找不到關於CI/CD的配置項那麼大家確實該對公司的GitLab進行升級了。php
咱們公司以前項目部署一直在用一個叫瓦力的工具,雖然也能實現交付項目的功能可是也有很多弊端,好比:html
後來公司有的項目陸陸續續開始使用GitLab CI,由於當時對這套解決方案研究不深不知道該如何在CI上進行代碼回滾,如何管控生產環境的部署上線(好比只有權限高的人才能部署測試環境、構建完成後想手動部署生產環境而不是push後自動部署)因此只用來作構建和部署測試環境的代碼。與此同時執行CI Jobs的機器仍然是一臺物理機,上面須要全局安裝了這些構建工具來完成項目構建工做,這仍然會遇到上面第二點項目代碼版本依賴的衝突。前端
因爲我本身如今在公司一個重點項目裏作架構師,在項目開始之初就有打算將持續集成和持續交付這裏好好梳理一下,解決上面這些比較突出的問題。最近因爲這些問題爆發的愈來愈嚴重以爲有義務拿出一套比較好的解決方案來解決這些問題因此一直在研究解決這些問題的方案。java
隨着對Gitlab CI 這套方案理解的加深慢慢制定了以下的策略:node
我基本上是將CI分紅build
, test
, deploy
三個階段,build
裏主要就是完成項目代碼依賴包的安裝(composer 和 npm install 之類的工做, 咱們先後端是兩個項目,前端項目事先須要針對不一樣環境配置不一樣的打包命令)。mysql
build:
stage: build
image: kevinyan001/git-runner:php7.1-node10
script:
- /usr/local/bin/composer install
only:
- develop
- uat
tags:
- your-runner-tag
複製代碼
test
階段會去執行項目中編寫的測試用例:laravel
test-dev:
stage: test
image: kevinyan001/git-runner:php7.1-node10
script:
- php artisan migrate --force
- ./vendor/bin/phpunit
only:
- develop
tags:
- your-runner-tag
複製代碼
deploy
階段完成項目最後的部署和一些服務器reload操做最終將項目交付上線。git
deploy-testing:
stage: deploy
script:
- rsync -az --delete --exclude=.git --exclude=.gitignore --exclude=.gitlab-ci.yml ./ $SERVER_TOKEN_TEST:$WEB_ROOT_TEST
- ssh $SERVER_TOKEN_TEST -t "chown -R www:www ${WEB_ROOT_TEST}"
environment:
name: test
url: http://test.example.com
only:
- develop
tags:
- your-runner-tag
複製代碼
說明:github
$SERVER_TOKEN_TEST
這些是提早在GitLab項目的Settings --> CI/CD Pilelines裏定義的變量,執行任務時容器會在BASH SHELL中讀入這些預先定義的變量。$SERVER_TOKEN_TEST
裏設置的內容是user@server_ip
, ${WEB_ROOT_TEST}
裏設置的是項目在服務端的路徑。git runner會在每一個Job的開始階段經過鏡像kevinyan001/git-runner:php7.1-node10
跑一個容器,在容器中執行這些操做,等Job執行完後容器會被中止並清理掉,這就須要咱們在每次容器起來的時候在容器裏執行一些預備工做,好比與目標服務器創建信任關係這些基礎的工做,我是經過將SSH PRIVATE KEY注入到容器中,目標服務器事先放上對應的公鑰來創建容器與目標主機的信任關係的:面試
before_script:
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > /root/.ssh/id_rsa
- chmod -R 600 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- mkdir -p /etc/ansible
- echo 'xx.xx.xxx.xxx db_master' >> /etc/hosts #make container can connect to mysql server
- echo 'xx.xx.xxx.xxx db_slave' >> /etc/hosts
複製代碼
具體能夠參考gitlab ci關於這一塊的說明文檔:docs.gitlab.com/ee/ci/ssh_k…
因爲GitLab CI的功能很是多,可配置像也不少因此具體某個配置的做用我就不細說了,貼幾個我認爲比較有用的說明文檔出來節省你們的搜索時間。 docs.gitlab.com/ee/ci/ docs.gitlab.com/ee/ci/examp… docs.gitlab.com/ee/ci/yaml/… docs.gitlab.com/ee/ci/envir…
另外提供一個我寫的Laravel項目的CI配置文件供你們參考,這是一個徹底能夠應用在大型項目交付上的CI配置,實踐的時候更換成大傢俱體的配置,它也同時適用於除Laravel之外的其餘項目只須要把不一樣階段執行的任務換成對應的命令便可。
.gitlab-ci.yml: gist.github.com/kevinyan815…
kevinyan001/git-runner:php7.1-node10是我作的一個專門用來跑CI任務的容器的鏡像, 你能夠針對你的需求製做其餘的鏡像。
GitLab CI/CD提供了一套通用的解決方案讓你從最初的Coding開始到最後代碼交付上線都能在它提供的工具集合中輕鬆完成,經過Git Runner的Executor執行不一樣階段定製的任務進行代碼build、集成測試、和部署上線。除此以外還能夠幫咱們完成API文檔生成、代碼檢查、Wiki文檔構建等工做,只要在Linux Bash Shell中能實現的任務它都能幫你實現。它支持用不少不一樣類型的Executor來執行CI Jobs,其中我最推薦使用的類型是Docker Executor,這樣咱們的build環境就不依賴於Git Runner宿主機上的環境,從而可以應用不一樣容器完成各類不一樣項目的構建工做。
推薦一個這兩天很火的數據結構和算法課程,以前買過很多講持續交付、和微服務架構的課程,無奈東西太空看了兩天就堅持不下去了,數據結構和算法是一個能夠邊學邊實踐練習比較基礎的東西,不光對技術水平有提高,對參加一線公司的面試也是頗有幫助的。