故事是這樣的..
咱們源碼從github遷移到自主搭建的gitlab服務器管理,之前用github的時候是使用jenkins進行持續集成的,原本應用上jenkins我只要配一下webhook就能夠了,可我就是任性。
我心想,既然已經遷移到gitlab了,爲什麼不用用gitlab-ci呢,更況且gitlab宣稱集成了gitlab-ci,應該很快就能應用上。
我正是這樣把本身推動坑的。html
進坑前先理清一些名詞,以及他們之間的關係。node
GitLab是一個利用Ruby on Rails開發的開源應用程序,實現一個自託管的Git項目倉庫,可經過Web界面進行訪問公開的或者私人項目。
它擁有與GitHub相似的功能,可以瀏覽源代碼,管理缺陷和註釋。能夠管理團隊對倉庫的訪問,它很是易於瀏覽提交過的版本並提供一個文件歷史庫。團隊成員能夠利用內置的簡單聊天程序(Wall)進行交流。它還提供一個代碼片斷收集功能能夠輕鬆實現代碼複用,便於往後有須要的時候進行查找。mysql
Gitlab-CI是GitLab Continuous Integration(Gitlab持續集成)的簡稱。
從Gitlab的8.0版本開始,gitlab就全面集成了Gitlab-CI,而且對全部項目默認開啓。
只要在項目倉庫的根目錄添加.gitlab-ci.yml
文件,而且配置了Runner(運行器),那麼每一次合併請求(MR)或者push都會觸發CI pipeline。linux
Gitlab-runner是.gitlab-ci.yml
腳本的運行器,Gitlab-runner是基於Gitlab-CI的API進行構建的相互隔離的機器(或虛擬機)。GitLab Runner 不須要和Gitlab安裝在同一臺機器上,可是考慮到GitLab Runner的資源消耗問題和安全問題,也不建議這二者安裝在同一臺機器上。git
Gitlab Runner分爲兩種,Shared runners和Specific runners。
Specific runners只能被指定的項目使用,Shared runners則能夠運行全部開啓 Allow shared runners
選項的項目。github
Pipelines是定義於.gitlab-ci.yml
中的不一樣階段的不一樣任務。
我把Pipelines理解爲流水線,流水線包含有多個階段(stages),每一個階段包含有一個或多個工序(jobs),好比先購料、組裝、測試、包裝再上線銷售,每一次push或者MR都要通過流水線以後才能夠合格出廠。而.gitlab-ci.yml
正是定義了這條流水線有哪些階段,每一個階段要作什麼事。web
徽章,當Pipelines執行完成,會生成徽章,你能夠將這些徽章加入到你的README.md文件或者你的網站。redis
徽章的連接形如:http://example.gitlab.com/namespace/project/badges/branch/build.svg
咱們用gitlab項目的徽章做爲例子:sql
這裏跳過Gitlab的安裝,請自行谷歌。可是對於安裝gitlab有一點提醒,就是建議使用官方推薦的集成安裝包的方式安裝,經過源碼安裝會有不少坑踩不完。docker
若是想要使用docker runner,則須要安裝docker。(可選)curl -sSL https://get.docker.com/ | sh
由於docker須要linux內核在3.10或以上,安裝前能夠經過uname -r
查看Linux內核版本。
添加Gitlab的官方源:
# For Debian/Ubuntu curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash # For CentOS curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
安裝
# For Debian/Ubuntu sudo apt-get install gitlab-ci-multi-runner # For CentOS sudo yum install gitlab-ci-multi-runner
註冊Runner
Runner須要註冊到Gitlab才能夠被項目所使用,一個gitlab-ci-multi-runner服務能夠註冊多個Runner。
$ sudo gitlab-ci-multi-runner register Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com ) https://mygitlab.com/ci Please enter the gitlab-ci token for this runner xxx-xxx-xxx Please enter the gitlab-ci description for this runner my-runner INFO[0034] fcf5c619 Registering runner... succeeded Please enter the executor: shell, docker, docker-ssh, ssh? docker Please enter the Docker image (eg. ruby:2.1): node:4.5.0 INFO[0037] Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
更新Runner
若是須要更新Runner,只須要執行如下腳本:
# For Debian/Ubuntu sudo apt-get update sudo apt-get install gitlab-ci-multi-runner # For CentOS sudo yum update sudo yum install gitlab-ci-multi-runner
Runner高級配置
經過gitlab-ci-multi-runner register
註冊的Runner配置會存儲在/etc/gitlab-runner/config.toml
中,若是須要修改可直接編輯該文件。詳見這裏
concurrent = 4 check_interval = 0 [[runners]] name = "test" url = "http://your-domain.com/ci" token = "your-token" executor = "docker" [runners.docker] tls_verify = false image = "node:4.5.0" privileged = false disable_cache = false volumes = ["/cache"] [runners.cache] [runners.kubernetes] host = "" cert_file = "" key_file = "" ca_file = "" image = "" namespace = "" privileged = false cpus = "" memory = "" service_cpus = "" service_memory = ""
到這裏咱們的Runner就安裝配置好了,接下來是對項目根目錄中.gitlab-ci.yml
進行配置。
在項目根目錄添加.gitlab-ci.yml
文件
關於該文件的各項配置請見
示例:
# 這裏使用了我本身的docker image,配置了本身須要的環境 image: wuyanxin/node variables: MYSQL_DATABASE: wan_ark-unit MYSQL_ALLOW_EMPTY_PASSWORD: "yes" # 關於service請見: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service services: - mysql:5.6 - redis:3.2.4 stages: - test - eslint - deploy before_script: - echo 'REDIS_HOST=redis' >> .env - echo 'DB_HOST=mysql' >> .env - yarn install test_service: stage: test script: - npm run build - npm test eslint_src: stage: eslint script: - npm run lint allow_failure: true deploy: stage: deploy script: - echo 'deployd!' only: - master
這裏使用了nodejs項目做爲例子,其餘語言相似語法。
執行結果
這是我最近對於Gitlab CI的實驗記錄,對於Gitlab CI的使用體驗我給82分。雖然在實驗過程當中踩了不少坑,真的踩到差點放棄了,因此記錄一下個人實驗過程,但願對他人有幫助。
關於在這個過程當中踩到的坑以及構建速度優化請關注我下期文章。