該過程中用到的技術(shù)棧git
gitlab
shell
需要提前準(zhǔn)備的內(nèi)容
一個(gè)項(xiàng)目myweb
本機(jī)安裝Git
一個(gè)Gitlab倉(cāng)庫(kù)
docker私有倉(cāng)庫(kù)
gitlab runner(Gitlab-runner)
公司的代碼一般都保存在私有化部署的Gitlab,要使用Gitlab的CI/CD,需要Gitlab版本>8.0.0
CI/CD雖然不難,但配置過程中有很多坑,而且有些要了解的概念也比較多,可以分成多個(gè)步驟,逐一攻破。
gitlab-runner
需要提前進(jìn)行安裝和注冊(cè),詳情
進(jìn)入Gitlab->CICD->Runner 當(dāng)前可用的runner有
如圖所示,該項(xiàng)目可用的runner
左邊runner僅可以為當(dāng)前項(xiàng)目使用,但需要激活一下。
右邊為共享的runner, 可以直接使用
.gitlab-ci.yml中以tags和runner的tags關(guān)聯(lián)
首先在項(xiàng)目的根目錄下新建.gitlab-ci.yml
,然后在該文件中配置pipeline的任務(wù),這些任務(wù)將會(huì)跑在gitlab-runner
中。
一個(gè)最簡(jiǎn)單的.gitlab-ci.yml
文件,其中CI_COMMIT_BRANCH、GITLAB_USER_LOGIN是一些gitlab定義好的變量,可以直接使用,你也可以定義自己的變量
image: "node" stages: - BuildImage before_script: - echo "before_script" - echo "This job deploys something from the $CI_COMMIT_BRANCH branch." - echo "Hello, $GITLAB_USER_LOGIN!" build: tags: - test stage: BuildImage image: "node" script: - node -v 復(fù)制代碼
推送Git倉(cāng)庫(kù)
git add .gitlab-ci.yml git commit -m "commit ci" git push 復(fù)制代碼
進(jìn)入gitlab-> CI/CD頁(yè)面,可以看到一個(gè)pipeline狀態(tài)是stuck
,這是因?yàn)闆]有Gitlab-runner。
修改.gitlab-ci.yml
,僅展示部分
build: # tags,代表要使用的runner,這里改成uaek-c1 tags: - uaek-c1 stage: BuildImage image: "node" script: - node -v 復(fù)制代碼
提交代碼,進(jìn)入CI/CD頁(yè)面看到新增了一條pipeline執(zhí)行完成
點(diǎn)擊新的記錄,可以看到對(duì)應(yīng)的Stage,點(diǎn)擊當(dāng)前任務(wù)
可以看到Gitlab-runner執(zhí)行.gitlab-ci.yml
的具體信息。
到目前為止,已經(jīng)看到了.gitlab-ci.yml
觸發(fā)到執(zhí)行的過程,接下來,看看針對(duì)這個(gè)項(xiàng)目怎樣去具體跑CI
構(gòu)建Docker鏡像參考詳情
(1)、根目錄中添加配置文件Dockerfile
FROM node:10-alpine as builder WORKDIR /data/myweb COPY . . RUN npm install --registry=https://registry.npm.taobao.org --no-package-lock --no-save RUN yarn publish:prod FROM nginx:alpine as myweb RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone WORKDIR /data/production COPY ./nginx /etc/nginx/conf.d COPY --from=builder /data/myweb/build /data/production EXPOSE 80, 443 復(fù)制代碼
(2)、在項(xiàng)目根目錄中新建nginx/default.conf
,我們用外掛的nginx配置文件覆蓋原來Nginx鏡像中的配置文件
server { listen 80; listen [::]:80; server_name localhost; location / { root /data/production; index index.html; try_files $uri /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 復(fù)制代碼
# 定義全局變量,鏡像名稱,命名空間,鏡像拉取的密碼的變量名 variables: IMAGE_HUB: "lvpf/myweb" DOCKER_HUB_URL: "hub.docker.com/r/lvpf/myweb" # 這里打印一些變量,僅僅為了展示,看下這些gitlab預(yù)設(shè)的變量值,可以去掉 before_script: - echo "VARIABLE CI_COMMIT_SHA IS $CI_COMMIT_SHA!" - echo "VARIABLE CI_COMMIT_TAG IS $CI_COMMIT_TAG!" - echo "VARIABLE CI_PROJECT_DIR IS $CI_PROJECT_DIR!" # stages順序運(yùn)行, 同一個(gè)stage的所有job并行 stages: - BuildImage # 任務(wù)1,構(gòu)建docker鏡像 docker-image-master: # 使用的Gitlab Runner標(biāo)簽 tags: - uaek-c1 # 任務(wù)名稱 stage: BuildImage # 由于當(dāng)前runner為k8s構(gòu)建的,所以這里執(zhí)行docker構(gòu)建和上傳需要通過kaniko鏡像,具體可以看下面參考文檔() image: gcr.io/kaniko-project/executor script: # 首先我們需要為我們的鏡像生成一個(gè)tag,規(guī)則是:如果有 git tag,就使用 git tag,如果沒有的話,就使用 git commit sha - IMAGE_TAG=$CI_COMMIT_SHA && if [[ -n "$CI_COMMIT_TAG" ]]; then IMAGE_TAG=$CI_COMMIT_TAG; fi - echo $IMAGE_HUB:$IMAGE_TAG - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $DOCKER_HUB_URL:$IMAGE_TAG # 使用 only 來限制這個(gè) job 什么情況下會(huì)運(yùn)行,下面的設(shè)置標(biāo)識(shí)只有新的 tag 被創(chuàng)建時(shí)才觸發(fā)CI,如果去掉,每次推送分支都會(huì)觸發(fā)CI only: - tags 復(fù)制代碼
一般公司安全性考慮,不會(huì)將鏡像推送到hub,公司內(nèi)網(wǎng)一般也不通,要考慮自建私有鏡像倉(cāng)庫(kù)
gitlab-runner可以使用的宿主機(jī)類型很多,包括云主機(jī)、docker、k8s等,構(gòu)建鏡像的解決方式略有不同,可以參考文檔
其中一些涉及密碼的變量,可以通過Gitlab->Setting->CI/CD->Variables
來設(shè)置,直接在.gitlab-ci.yml中使用
作者:前端中后臺(tái)
鏈接:https://juejin.cn/post/6967570299336261646
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/127954.html
摘要:什么是持續(xù)集成持續(xù)集成,簡(jiǎn)稱指的是,頻繁地一天多次將代碼集成到主干。如圖什么是一次其實(shí)相當(dāng)于一次構(gòu)建任務(wù),里面可以包含多個(gè)流程,如安裝依賴運(yùn)行測(cè)試編譯部署測(cè)試服務(wù)器部署生產(chǎn)服務(wù)器等流程。參考鏈接用進(jìn)行持續(xù)集成 什么是持續(xù)集成 ? 持續(xù)集成(Continuous integration,簡(jiǎn)稱CI)指的是,頻繁地(一天多次)將代碼集成到主干。 GitLab CI 什么是 GitLab CI...
摘要:所以在此給大家分享一下不使用構(gòu)建工具實(shí)現(xiàn)項(xiàng)目自動(dòng)化打包發(fā)布的思路。對(duì)于一個(gè)前端項(xiàng)目來說,自動(dòng)化的構(gòu)建是很有必要的,同時(shí)我們也可以通過實(shí)現(xiàn)更多的功能比如代碼檢測(cè),單元測(cè)試等等。另外這種思路同樣適用于其他項(xiàng)目等前端項(xiàng)目,等移動(dòng)端項(xiàng)目。 今天這篇文章的目的是在rn項(xiàng)目的構(gòu)建,并不會(huì)涉及到rn框架或者使用的講解,說起構(gòu)建,特別是前端構(gòu)建大家應(yīng)該很快會(huì)想到webpack、Grunt、 Gulp等...
一、什么是CI/CDCI 持續(xù)集成CD 持續(xù)交付CI/CD就是在開發(fā)階段,通過自動(dòng)化發(fā)布,來頻繁部署應(yīng)用的一種方式二、為什么要配置CI/CD想象一下,一個(gè)項(xiàng)目的發(fā)布如果手動(dòng)部署,需要的操作有:?jiǎn)卧獪y(cè)試打包文件上傳服務(wù)器等等如果每個(gè)過程都需要手動(dòng)執(zhí)行,每次都要保證不出錯(cuò),這個(gè)已經(jīng)很繁瑣了。而現(xiàn)在大的前端項(xiàng)目多達(dá)10+的人開發(fā),而且人員流動(dòng)大。如果每個(gè)人都這么發(fā)布,快速迭代就容易出錯(cuò)。這時(shí)候就需要CI...
摘要:只要的項(xiàng)目有提交,相關(guān)就根據(jù)來決定是否跑自動(dòng)部署的命令。項(xiàng)目的自動(dòng)部署添加執(zhí)行的注冊(cè)命令,按照說明進(jìn)行參數(shù)配置。至此,和服務(wù)都已經(jīng)自動(dòng)部署完成。 準(zhǔn)備工作 說明 公司最近準(zhǔn)備了一臺(tái)新的開發(fā)服務(wù)器,正好用以實(shí)踐docker的基本應(yīng)用。docker的好處不再贅述,詳情可參考阮一峰的這篇入門。(關(guān)于Docker最好的中文介紹,沒有之一)。 公司目前主要使用了EggJs + ReactJS的技...
摘要:本文的目的最主要是備忘其次是分享療效并不能讓你一下子掌握這只是一個(gè)比較完整的解決方案其他基礎(chǔ)知識(shí)自行補(bǔ)充基調(diào)首先這不是屠龍刀不要奢望一篇文章可以走遍天下這里只是提供一個(gè)具體的落地方案一個(gè)具體的技術(shù)選型階段代碼倉(cāng)庫(kù)關(guān)于代碼倉(cāng)庫(kù)本文選取的方案是 本文的目的:最主要是備忘, 其次是分享 療效: 并不能讓你一下子掌握CI/CD, 這只是一個(gè)比較完整的解決方案,其他基礎(chǔ)知識(shí),自行補(bǔ)充. 基調(diào)...
閱讀 2160·2025-02-07 13:29
閱讀 1376·2024-11-07 18:25
閱讀 132058·2024-02-01 10:43
閱讀 2140·2024-01-31 14:58
閱讀 1262·2024-01-31 14:54
閱讀 83886·2024-01-29 17:11
閱讀 4133·2024-01-25 14:55
閱讀 2524·2023-06-02 13:36