一、? ? ?為了優(yōu)化公司服務(wù)部署流程, 減少不必要的登錄服務(wù)器操作木西, 實(shí)現(xiàn)提交代碼直接部署最短部署路徑, 我們選擇了gitlab的ci/cd随静。
? ? 當(dāng)前公司的部署流程繁瑣八千, 以我負(fù)責(zé)的項(xiàng)目來說, 上線的步驟是:? ?
? ? 1. 提交代碼到gitlab
? ? 2. 登錄服務(wù)器燎猛, 到項(xiàng)目文件夾下拉取代碼
? ? 3. 使用supervisorctl 重啟項(xiàng)目
使用gitlab的ci/cd之后就可以恋捆, 節(jié)省后兩步的操作,把它們交給gitlab 的ci/cd執(zhí)行重绷, 這樣就可以“少做少錯(cuò)”
二沸停、我們使用的工具:
? ? 1. gitlab代碼倉庫
? ? 2.docker容器技術(shù)
? ? 3.gitlab-runner應(yīng)該屬于gitlab的一個(gè)配套插件
? ? 4. 我們的項(xiàng)目
自動(dòng)化部署的流程:
? ? 1.提交代碼gitlab, 觸發(fā)ci/cd邏輯
? ? 2.gitlab 根據(jù)gitlab-ci.yml中的命令昭卓,通知gitlab-runner進(jìn)行構(gòu)建部署
三愤钾、工具安裝(注意:gitlab和gitlab-runner是兩臺(tái)不同的服務(wù)器)
? ? 1、gitlab 安裝:??https://about.gitlab.com/installation/(官網(wǎng)文檔)
? ? 2候醒、docker安裝:?https://docs.docker.com/install/#releases(官網(wǎng)文檔能颁, 英語不好的注意左側(cè)導(dǎo)航條, 選擇對(duì)應(yīng)操作系統(tǒng))
? ? 3倒淫、gitlab-runner安裝:?https://docs.gitlab.com/runner/install/(官網(wǎng)文檔伙菊, 注意圖片中的位置)
這里是各個(gè)操作系統(tǒng)安裝gitlab-runner教程
四、對(duì)于工具的安裝教程敌土,都是其官網(wǎng)提供的镜硕, 我們就不做過多的演示,這里我演示一下gitlab-runner注冊(cè)的過程
? ? 1纯赎、我們需要找到gitlab中某個(gè)項(xiàng)目的ci/cd的設(shè)置界面
然后點(diǎn)擊展開runner找到圈出來的url和token谦疾,在gitlab-runner注冊(cè)時(shí)需要使用南蹂, 如圖4
然后我們?nèi)ピ趃itlab-runner中注冊(cè):
zm@zmdeMacBook-Pro: ~$ gitlab-runner register? ?# 開始注冊(cè)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
WARNING: Running in user-mode.? # 提示可以不管
WARNING: Use sudo for system-mode:?
WARNING: $ sudo gitlab-runner...
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):??# 輸入我們?cè)趃itlab中獲取的url
http://wechatservers.com/
Please enter the gitlab-ci token for this runner:? # 輸入token
5KUa3rVrYsRmPzp7CoeL
Please enter the gitlab-ci description for this runner: # 描述
[zmdeMacBook-Pro.local]: cs
Please enter the gitlab-ci tags for this runner (comma separated): # tag犬金,可以不填寫直接回車;這個(gè)是用來標(biāo)記runner六剥, 可以指定使用哪個(gè)runner進(jìn)行構(gòu)建部署
cs? # 我們輸入的是cs
Registering runner... succeeded? ? ? ? ? ? ? ? ? ? runner=5KUa3rVr
Please enter the executor: docker, parallels, shell, virtualbox, docker+machine, docker-ssh, ssh, docker-ssh+machine, kubernetes:
shell? ?# 執(zhí)行器選擇shell晚顷, 一開始選擇了docker,在部署完之后我找不到container放在哪里了疗疟, 這塊以后再補(bǔ)
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
這樣我們就完成了gitlab-runner的注冊(cè)该默, 我可以回到gitlab頁面看一下
這樣我們有了個(gè)gitlab-runner, tag為cs策彤, 狀態(tài)為不可用
因?yàn)槲覀儧]有運(yùn)行g(shù)itlab-runner栓袖, 我們可以使用
gitlab-runner run
這樣就運(yùn)行正常了
五匣摘、.gitlab-ci.yml和dockerfile
.gitlab-ci.yml文件和dockerfile文件需要放在項(xiàng)目中,在第一層目錄切勿深藏裹刮。
.gitlab-ci.yml是gitlab-runner管理項(xiàng)目的配置文件音榜,告訴gitlab-runner怎么做
主要用到了這個(gè)幾個(gè)關(guān)鍵字
stages
before_script
variable
script
tags
stages:階段
定義使用的階段和使用順序, 比如有兩個(gè)階段捧弃, 一個(gè)是構(gòu)建docker images赠叼,另一個(gè)是運(yùn)行docker container, 這樣我們就需要定義這個(gè)兩個(gè)階段里每個(gè)階段都需要干什么违霞, 那個(gè)階段在前那個(gè)階段在后
variable:變量
我們可以定義變量以供在整個(gè)job(每次自動(dòng)部署gitlab runner都會(huì)啟動(dòng)一個(gè)job)工作期間使用
script:腳本
這個(gè)gitlal-runner執(zhí)行的腳本
before_script: 腳本前
在執(zhí)行腳本前執(zhí)行什么嘴办, 可以這么理解但是看了文檔之后好像不是這個(gè)意思, 留坑买鸽;
tags:標(biāo)簽
用來指定某個(gè)gitlab-runner運(yùn)行項(xiàng)目
olny:?
用來表明將要運(yùn)行的分支和標(biāo)記名稱
.gitlab-ci.yml內(nèi)容:
variables:
? PROJECT_NAME: cs? # 文件名
DOCKER_REGISTRY: wechatservers.com:5000? # docker私有倉庫
IMAGE_NAME: "${DOCKER_REGISTRY}/${PROJECT_NAME}"? # 鏡像名
? LOG_DIR: "/data/logs/"? # 日志地址
stages:? # 階段設(shè)置
? - build
? ?- deploy
build:?
? stage: build # 階段build
script: # 腳本
? ? - docker build -t "${IMAGE_NAME}:lastest" .
- docker image tag "${IMAGE_NAME}:lastest" "${IMAGE_NAME}:$CI_COMMIT_SHA"
- docker push "${IMAGE_NAME}:lastest"
- docker push "${IMAGE_NAME}:$CI_COMMIT_SHA"
dev_deploy:
? stage: deploy
tags:
? ? - dev
variables:
? ? profile_path: "/data/profile.env"? # 存放環(huán)境變量的文件
? ? port: "503"
? before_script:
? ? - docker stop "${PROJECT_NAME}_1" && docker rm "${PROJECT_NAME}_1" || true? ?# 嘗試停止并刪除容器
script:
? ? - sleep 2
- docker run --rm -v $LOG_DIR:$LOG_DIR? --env-file ${profile_path} "${IMAGE_NAME}:${CI_COMMIT_SHA}" python manage.py migrate --settings=settings.settings? ?#?
- docker run -d -p "${port}:8000" -v $LOG_DIR:$LOG_DIR --name "${PROJECT_NAME}_1" --env-file "${profile_path}" "${IMAGE_NAME}:${CI_COMMIT_SHA}"? # 創(chuàng)建容器
only:
refs:
? ? ? - /^feature\/dev-.*$/? ?# 使用正則匹配要部署分支
tags:
? ? - dev-runner? # 指定gitlab-run
這時(shí)候就可以提交代碼了
如果成功則會(huì)看到這樣的界面
你也可以在左側(cè)的列表中job看到涧郊,執(zhí)行情況
對(duì)于私有http倉庫, 需要加入insecure-registries到/etc/docker/daemon.json(因系統(tǒng)而異)
"insecure-registries": [
? ? ? ? "wechatservers:5000"
? ? ]
對(duì)于docker權(quán)限問題眼五,你可以使用 https://docs.docker.com/install/linux/linux-postinstall/ 解決
到此結(jié)束