整體介紹
磐舟作為一個devops產品,它具備基礎的CI流水線功能。同時磐舟的流水線是完全基于云原生架構設計的,在使用時會有一些注意事項。這里首先我們要了解磐舟整體的流水線打包邏輯。
文檔結構說明
一般來說,磐舟推薦單個業務的標準git庫使用方法。如下圖:
這是一個標準前端項目,代碼直接位于項目根目錄層級下。磐舟在使用的時候,需要幾個專屬文件。
1. 用于磐舟流水線部署的yml文件。上圖示例中是cmit-docker-ci.yml。這個文件作用是告訴磐舟ci流水線應該按照什么樣的步驟啟動流水線流程。后面會詳細講解。
2. Dockerfile。這個是用來完成最終打包鏡像的文件。可以理解為傳統的Dockerfile。區別在于他是基于ci.yml的流程被執行,所以在執行一些文件復制,即COPY操作的時候,需要確認好執行路徑。后面也會詳細說明。
流程邏輯
? ? ? ? 1. 執行git clone,把代碼庫拉倒鏡像本地目錄。拉去分支就是uses:的配置,不需要改,對應ci流水線創建時選擇的分支變量。該步驟會默認執行,不會再ci.yml文件中體現。
? ? ? ? 2. 定義docker image的tag。這里需要根據需要調整下,對應到harbor鏡像倉庫中。env.TAG為磐舟默認的版本號,會根據構建自動生成。建議保留。
? ? ? ? 3. docker login。登陸到鏡像庫。如果是使用的磐舟的鏡像庫,可以使用env.USER_NAME和PASSWORD進行登陸。磐舟會自動吧當前用戶對應的鏡像庫用戶創建出來并添加到對應的鏡像倉庫項目中去。如果是使用外部倉庫,需要確認網絡能夠通,然后可以手動指定用戶名和密碼進行登陸。
? ? ? ? 4. cd到workdir目錄下。env.PROJECT_PATH這個環境變量,就是第一步執行git clone的項目根目錄。然后在workdir的目錄下執行docker build。會使用當前目錄下的Dockerfile。需要確保文件存在。ps:如果目錄有調整,例如前后臺項目傳到了一起,則需要根據具體情況調整cd的路徑,確保執行docker build的目錄結構準確。
? ? ? ? 5. 會根據Dockerfile的配置,執行鏡像打包工作。一般來說,會再啟動一個鏡像進行項目編譯打包(Java的需要制作一個帶java對應jdk環境和maven/gradle等包管理器的鏡像;前端需要制作一個帶對應nodejs環境的鏡像。這倆鏡像用來跑代碼編譯過程,進行項目打包),然后再配置一個鏡像(運行時鏡像。前端準備一個nginx/nodeJS的鏡像,后臺準備對應的java或者其他運行時鏡像),將最終打包輸出文件復制到運行環境的鏡像中,將必要配置文件copy進去,然后設置鏡像啟動參數。
? ? ? ? 6. docker push。推送打包完成的鏡像到鏡像倉庫。完成ci流程。
所以,一般來說說,磐舟的CI過程會涉及到3個鏡像。其中第一個鏡像無需我們關注。后面兩個鏡像,根據部署項目,需要獨立準備基礎鏡像包,并且根據項目具體情況編寫Dockerfile配置,完成編譯,復制文件到運行包,最后推送到制品庫過程。
對于一些特殊的項目,例如uniapp的項目,如果使用npm的uniapp cli開發還好,可以使用磐舟ci進行打包,如果使用了HbuildX的cli,由于不提供linux的cli程序,無法使用磐舟進行編譯打包。只能本地打包后,將發布文件上傳git,然后基于發布文件直接打包。(省略了編譯鏡像部分內容)
?標準ci.yml
#變量介紹☆☆☆☆☆
#${{env.PROJECT_PATH}}:代碼根目錄
#${{env.TAG}}:$(date +%s):從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)#名稱:Docker鏡像持續交付
name: Docker Image CI#獲取代碼
on:push:branches: [ main ]pull_request:branches: [ main ]#開始工作
jobs:
#獲取鏡像build:
#鏡像名稱:cmit-docker-ciname: cmit-docker-ci
#鏡像版本:ubuntu-latestruns-on: ubuntu-latest
#執行步驟steps:
#切換分支- uses: actions/checkout@v2
#設置鏡像倉庫☆☆☆☆☆☆☆☆☆☆修改cicd-test/cicd_test為當前工程使用的'鏡像庫/工程名'☆☆☆☆☆☆☆☆☆☆- name: set image repository run: echo "IMAGE_REPO=image.sd001.cn:30003/images_5gx/h5-videoplayer-feature_newfeature_boss:${{env.TAG}}" | tee -a $GITHUB_ENV ${{env.PROJECT_PATH}}/env
#登錄鏡像庫- name: docker loginrun: docker login image.sd001.cn:30003 -u ${{env.USER_NAME}} -p ${{env.PASSWORD}}
#制作鏡像☆☆☆☆☆☆☆☆☆☆進入代碼倉庫根目錄制作鏡像Dockerfile需要根據項目工程進行修改☆☆☆☆☆☆☆☆☆☆- name: Build the Docker imagerun: cd ${{env.PROJECT_PATH}} && docker build . --file Dockerfile --tag ${{env.IMAGE_REPO}}
#推送鏡像- name: docker pushrun: docker push ${{env.IMAGE_REPO}}
標準Dockerfile
前端項目
#設置構建鏡像☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置帶有相應環境的構建用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/tools/base-images/node:14.15.4 AS builder
#配置工作目錄
WORKDIR /webapp
#將代碼倉庫中前端包文件拷貝至工作目錄
COPY ./package*.json ./
#設置前端依賴庫
RUN npm config set registry http://nexus.sd001.cn:32766/repository/npm-group/
RUN npm config set sass_binary_site=http://nexus.sd001.cn:32766/repository/npm-group/
RUN npm config set disturl=http://nexus.sd001.cn:32766/repository/npm-group/
#RUN npm install -g node-gyp --registry=http://nexus.sd001.cn:32766/repository/npm-group/
#下載依賴包
#下載依賴包
RUN curl -k -o node-v14.15.4-headers.tar.gz -L http://nexus.sd001.cn:32766/repository/npm_node_raw/node/v14.15.4/node-v14.15.4-headers.tar.gz && TARBALL_PATH=$(pwd) && npm config set tarball ${TARBALL_PATH}/node-v14.15.4-headers.tar.gz && npm install
RUN npm install
#將代碼倉庫拷貝至工作目錄
COPY . .
#配置構建命令☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置相應的構建命令☆☆☆☆☆☆☆☆☆☆
#執行構建命令
RUN npm run build#設置基礎鏡像☆☆☆☆☆☆☆☆☆☆根據工程運行需要配置帶有相應環境的運行用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM nginx:1.21.6 AS final
#將構建鏡像中代碼的nginx配置文件拷貝至運行鏡像nginx目錄(默認不開啟,nginx有特殊配置注意開啟)
#COPY --from=builder /webapp/default.conf/ /etc/nginx/conf.d/
#☆☆☆☆☆☆☆☆☆☆將構建鏡像中打好的dist目錄拷貝至運行鏡像nginx目錄☆☆☆☆☆☆☆☆☆☆
#COPY --from=builder /webapp/dist/ /usr/share/nginx/html
COPY --from=builder /webapp/h5/ /usr/share/nginx/html
#設置容器端口
EXPOSE 80
#設置CMD命令前臺運行nginx
CMD nginx -g 'daemon off;'
java后臺項目
#設置構建鏡像☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置帶有相應環境的構建用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/devops-release/maven:3-jdk-8 AS builder#配置工作目錄
WORKDIR /build
#將代碼倉庫拷貝至工作目錄
COPY . .
#配置構建命令☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置相應的構建命令☆☆☆☆☆☆☆☆☆☆
RUN mvn clean install -e -U -Dmaven.test.skip=true --settings ./setting_5G.xml#設置基礎鏡像☆☆☆☆☆☆☆☆☆☆根據工程運行需要配置帶有相應環境的運行用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/devops-release/base-images/openjdk:alpine AS final
#配置工作目錄
#WORKDIR /app#將構建鏡像中打好的制品包拷貝至運行鏡像工作目錄
#☆☆☆☆☆☆☆☆☆☆/build/target/為默認目錄,需要根據工程配置進行修改☆☆☆☆☆☆☆☆☆☆
RUN mkdir -p /data/jar/
COPY --from=builder /build/cloudxr-web/target/cloudxr-web-0.0.1-SNAPSHOT.tar.gz /data/jar/
RUN cd /data/jar/ && tar -xvf /data/jar/cloudxr-web-0.0.1-SNAPSHOT.tar.gz && mv cloudxr-web-0.0.1-SNAPSHOT cloudxrRUN cp /data/jar/cloudxr/cloudxr-web-0.0.1-SNAPSHOT.jar \/data/jar/cloudxr/cloudxr-web.jar \&& chmod +x /data/jar/cloudxr/docker-run.sh
WORKDIR /data/jar/cloudxr
CMD /data/jar/cloudxr/docker-run.shEXPOSE 5556
#設置容器端口
#EXPOSE 8080
#更改時區
#RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#設置CMD命令☆☆☆☆☆☆☆☆☆☆根據工程運行對應的程序☆☆☆☆☆☆☆☆☆☆
#CMD java -jar /app/cloudxr-web-0.0.1-SNAPSHOT.jar
案例
這里搞一個相對復雜的案例。
目錄
這里前后臺項目,研發為了方便,創建在一個工程下面,提交到Git上,也保留了改項目目錄結構。
Java項目
ci配置文件
cmit-docker-ci.yml
#變量介紹☆☆☆☆☆
#${{env.PROJECT_PATH}}:代碼根目錄
#${{env.TAG}}:$(date +%s):從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)#名稱:Docker鏡像持續交付
name: Docker Image CI#獲取代碼
on:push:branches: [ main ]pull_request:branches: [ main ]#開始工作
jobs:#獲取鏡像build:#鏡像名稱:cmit-docker-ciname: cmit-docker-ci#鏡像版本:ubuntu-latestruns-on: ubuntu-latest#執行步驟steps:#切換分支- uses: actions/checkout@v2#設置鏡像倉庫☆☆☆☆☆☆☆☆☆☆修改cicd-test/cicd_test為當前工程使用的'鏡像庫/工程名'☆☆☆☆☆☆☆☆☆☆- name: set image repositoryrun: echo "IMAGE_REPO=image.sd001.cn:30003/sdvillage/app:${{env.TAG}}" | tee -a $GITHUB_ENV ${{env.PROJECT_PATH}}/env#登錄鏡像庫- name: docker loginrun: docker login image.sd001.cn:30003 -u ${{env.USER_NAME}} -p ${{env.PASSWORD}}#制作鏡像☆☆☆☆☆☆☆☆☆☆進入代碼倉庫根目錄制作鏡像Dockerfile需要根據項目工程進行修改☆☆☆☆☆☆☆☆☆☆- name: Build the Docker imagerun: cd ${{env.PROJECT_PATH}}/shucun && docker build . --file Dockerfile --tag ${{env.IMAGE_REPO}} --network=host#推送鏡像- name: docker pushrun: docker push ${{env.IMAGE_REPO}}
這里重點是docker build步驟中的目錄調整。因為上傳了跟項目路徑,所以默認是在git根目錄下:
但是顯然,我們的項目代碼在shucun目錄下,所以這里要調整docker build的目錄到/shucun下面,否則會找不到Dockerfile。
Dockerfile
#設置構建鏡像☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置帶有相應環境的構建用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/devops-release/maven:3-jdk-8 AS builder#RUN rm -f /usr/share/maven/conf/*.xml && ls /usr/share/maven/conf
#將代碼倉庫拷貝至工作目錄
#配置工作目錄
WORKDIR /build
#將代碼倉庫拷貝至工作目錄
COPY . .
#配置構建命令☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置相應的構建命令☆☆☆☆☆☆☆☆☆☆
#RUN mvn clean install -e -U -Dmaven.test.skip=true --settings ./setting_5G.xml
RUN mvn clean package -Dmaven.test.skip=true --settings ./setting_maven.xml#設置基礎鏡像☆☆☆☆☆☆☆☆☆☆根據工程運行需要配置帶有相應環境的運行用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/apaas/openeuler_jdk8_arthas:V1 AS final
MAINTAINER wang.robin
#配置工作目錄
#WORKDIR /app#將構建鏡像中打好的制品包拷貝至運行鏡像工作目錄
#☆☆☆☆☆☆☆☆☆☆/build/target/為默認目錄,需要根據工程配置進行修改☆☆☆☆☆☆☆☆☆☆
#RUN mkdir -p /data/jar/
COPY --from=builder /build/shucun-admin/target/asiainfo-admin.jar /app/app.jar
#COPY conf/ /app/conf
COPY --from=builder /build/shucun-admin/src/main/resources/application.yml /app/conf/application.yml
COPY --from=builder /build/shucun-admin/src/main/resources/application-druid.yml /app/conf/application-druid.yml
COPY --from=builder /build/shucun-admin/src/main/resources/banner.txt /app/conf/banner.txt
COPY --from=builder /build/shucun-admin/src/main/resources/logback.xml /app/conf/logback.xmlEXPOSE 8080WORKDIR /app# 啟動命令
ENTRYPOINT ["bash", "-c", "java -jar $JAVA_OPTS /app/app.jar --logging.config=/app/conf/logback.xml --server.port=8080 --spring.config.location=/app/conf/application.yml,/app/conf/application-druid.yml"]
1. maven:3-jdk-8是提前準備好的,已經安裝了jdk8和maven3的默認鏡像底包。用來完成項目編譯工作。
2. workdir,設置工程根目錄。相當于mkdir /build? ; cd /build;
3. COPY .? .? 將當前鏡像包中當前目錄下(/shucun)的文件,考到當前maven底包的當前目錄下(/build目錄下)。這里就沒有數村目錄了,注意。
4. 執行mvn命令,進行打包。mvn命令其實和本地模擬執行類似。需要提前準備好maven的setting.xml文件等配置信息。示例中是提前打包到基礎鏡像底包中去,然后手動指定。打包完成后輸出目錄和本地項目編譯輸出目錄是一致的。
所以上面jar包目錄是/build/shucun-admin/target/asiainfo.jar;對應的配置文件在/build/shucun-admin/src/main/resources/目錄下。shucun-java和shucun目錄,由于前面兩部操作,已經去除了。
5. 配置運行時的鏡像文件“FROM?image.sd001.cn:30003/apaas/openeuler_jdk8_arthas:V1?AS?final”。這是根據最新要求,使用國產化操作系統openeuler為基礎,安裝了jdk8和arthas的一個運行時底包。arthas主要是為了后續定位故障打進去的。
6. 將第一個編譯包中的輸出的項目jar包和配置文件復制到運行時鏡像包中。
7. 設置容器端口8080.這里需要和java監聽端口一致。
8. 切換工作目錄到/app目錄下
9. 啟動jar包。這里有個默認java環境變量配置$JAVA_OPTS,該部分在openeuler_jdk8_arthas的底包中已經定義好了。然后就是java -jar運行時,手動指定了配置文件的路徑。
磐舟配置
yml文件由于目錄層級不同,需要手動設置。
Dockerfile也是同理,需要手動指定。
執行效果
中間ci構建過程如果報錯,需要根據錯誤調整配置文件或者鏡像底包中配置。
前端項目
這里yml配置文件和java項目丟在一個目錄下了。
Dockerfile丟到了前端項目的目錄下(shucun-ui)。
ci配置文件
#變量介紹☆☆☆☆☆
#${{env.PROJECT_PATH}}:代碼根目錄
#${{env.TAG}}:$(date +%s):從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)#名稱:Docker鏡像持續交付
name: Docker Image CI#獲取代碼
on:push:branches: [ main ]pull_request:branches: [ main ]#開始工作
jobs:#獲取鏡像build:#鏡像名稱:cmit-docker-ciname: cmit-docker-ci#鏡像版本:ubuntu-latestruns-on: ubuntu-latest#執行步驟steps:#切換分支- uses: actions/checkout@v2#設置鏡像倉庫☆☆☆☆☆☆☆☆☆☆修改cicd-test/cicd_test為當前工程使用的'鏡像庫/工程名'☆☆☆☆☆☆☆☆☆☆- name: set image repositoryrun: echo "IMAGE_REPO=image.sd001.cn:30003/sdvillage/ui:${{env.TAG}}" | tee -a $GITHUB_ENV ${{env.PROJECT_PATH}}/env#登錄鏡像庫- name: docker loginrun: docker login image.sd001.cn:30003 -u ${{env.USER_NAME}} -p ${{env.PASSWORD}}#制作鏡像☆☆☆☆☆☆☆☆☆☆進入代碼倉庫根目錄制作鏡像Dockerfile需要根據項目工程進行修改☆☆☆☆☆☆☆☆☆☆切換到ui項目目錄下- name: Build the Docker imagerun: cd ${{env.PROJECT_PATH}}/shucun/shucun-ui && docker build . --file Dockerfile --tag ${{env.IMAGE_REPO}} --network=host#推送鏡像- name: docker pushrun: docker push ${{env.IMAGE_REPO}}
這里由于目錄層級比較深,同樣需要手動調整到/shucun/shucun-ui目錄下運行docker build
因為Dockerfile在這個目錄下。
Dockerfile
#設置構建鏡像☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置帶有相應環境的構建用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/tools/base-images/node:14.15.4 AS builder
#配置工作目錄
WORKDIR /webapp
#將代碼倉庫中前端包文件拷貝至工作目錄
COPY ./package*.json ./
#設置前端依賴庫
RUN npm config set registry http://nexus.sd001.cn:32766/repository/npm-group/
RUN npm config set sass_binary_site=http://nexus.sd001.cn:32766/repository/npm-group/
RUN npm config set disturl=http://nexus.sd001.cn:32766/repository/npm-group/
#RUN npm install -g node-gyp --registry=http://nexus.sd001.cn:32766/repository/npm-group/
#下載依賴包
#下載依賴包
RUN curl -k -o node-v14.15.4-headers.tar.gz -L http://nexus.sd001.cn:32766/repository/npm_node_raw/node/v14.15.4/node-v14.15.4-headers.tar.gz && TARBALL_PATH=$(pwd) && npm config set tarball ${TARBALL_PATH}/node-v14.15.4-headers.tar.gz && npm install
#RUN npm install
#將代碼倉庫拷貝至工作目錄
COPY . .
#配置構建命令☆☆☆☆☆☆☆☆☆☆根據工程構建需要配置相應的構建命令z☆☆☆☆☆☆☆☆☆☆
#執行構建命令
RUN npm run build:prod#設置基礎鏡像☆☆☆☆☆☆☆☆☆☆根據工程運行需要配置帶有相應環境的運行用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/apaas/base-openeular22-nginx-1.25.1:V1 AS final
#將構建鏡像中代碼的nginx配置文件拷貝至運行鏡像nginx目錄(默認不開啟,nginx有特殊配置注意開啟)
#COPY --from=builder /webapp/default.conf/ /etc/nginx/conf.d/
#☆☆☆☆☆☆☆☆☆☆將構建鏡像中打好的dist目錄拷貝至運行鏡像nginx目錄☆☆☆☆☆☆☆☆☆☆
#COPY --from=builder /webapp/dist/ /usr/share/nginx/html
COPY --from=builder /webapp/dist/ /webapp/dist
COPY --from=builder /webapp/ui.conf /usr/local/nginx/conf.d/
#設置容器端口
EXPOSE 8080
#設置CMD命令前臺運行nginx
CMD nginx -g 'daemon off;'
1. 選擇編譯時鏡像mode:14.15.4。該鏡像需要提前準備。需要根據前端項目使用的中間件版本定制。本項目使用的vue2,本地開發環境是node14,所以這里采用node14的鏡像底包進行編譯。底包需要提前準備好,并完成node14安裝。
2. 設置工作目錄/webapp
3. 復制當前目錄下的./package*.json到 當前目錄下。主要是為了復制package.json過來。用于執行后面npm install。這個取決于項目。一般npm的項目,node_modules是不會提交到git上去的,因為目錄碎文件很多,也很大。所以需要在服務器端拿到package.json后執行npm install進行拉取。
4. 設置npm的鏡像庫。改為本地源。如果沒有本地私庫,也可以直接用淘寶源或者官方源。官方源可能被墻,不建議使用。
5. 執行打包操作。這里這一行,其實分了4個命令。核心是執行npm install,做node包獲取。
RUN
curl -k -o node-v14.15.4-headers.tar.gz -L http://nexus.sd001.cn:32766/repository/npm_node_raw/node/v14.15.4/node-v14.15.4-headers.tar.gz
&& TARBALL_PATH=$(pwd)
&& npm config set tarball ${TARBALL_PATH}/node-v14.15.4-headers.tar.gz
&& npm install
6. COPY .? .? 。這里是從基礎CI鏡像中,獲取所有源碼到本地目錄。其實第三步執行這個全量復制也可以。不過可能由于文件比較多,會比較慢。如果中間出錯,可能會耽誤時間。所以這里拆開兩部分編寫。
7. 執行npm run build進行編譯。這邊同樣要跟項目中的編譯腳本相匹配。這里執行的是npm run build:prod,是因為項目中的配置是這樣的。所以這里仍然需要研發側確認好編譯時的命令腳本。
8. 設置運行時鏡像。“FROM image.sd001.cn:30003/apaas/base-openeular22-nginx-1.25.1:V1 AS final”這里是使用openeular22版本系統底包,安裝了nginx1.25制作的運行時底包。其中對nginx做了初始化配置,加載了conf.d目錄下的配置文件。
9. 復制前端編譯后的文件到運行時鏡像的目錄下。同時復制nginx的配置文件ui.conf到nginx的conf.d目錄下。這里需要吧ui.conf目錄也提交帶git庫里面,不然無法獲取。同時ui.conf要配置好nginx運行解析。需要配置nginx的location路徑,以及項目的目錄和解析。try_files是vue項目需要做的配置。這塊需要研發在單機測試通過,把配置拿過來。
server {listen 8080;server_name localhost;location /ui {alias /webapp/dist;try_files $uri $uri/ /ui/index.html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
10. 設置容器監聽端口。這里需要和nginx監聽端口一致。
?11. 啟動nginx服務。
磐舟配置
這里由于前段代碼和后端代碼在一個庫里面,所以代碼倉庫選擇一個。
同樣CI的配置文件和Dockerfile需要單獨指定目錄。
構建成功提示,推送鏡像版本信息。
如果提示構建錯誤,需要根據提示調整配置文件及基礎鏡像。
uniapp項目
uniapp項目如果采用的uni cli構建,是能夠支持npm打包的。流程可以參考前端項目。這里由于是使用的HbuilderX進行的開發,用的Hbuild cli進行的構建,所以由于沒有linux的cli,無法使用磐舟進行編譯。采用的是線下打包發布,將發布后文件包含到git庫方式拉取。
ci配置文件
#變量介紹☆☆☆☆☆
#${{env.PROJECT_PATH}}:代碼根目錄
#${{env.TAG}}:$(date +%s):從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)#名稱:Docker鏡像持續交付
name: Docker Image CI#獲取代碼
on:push:branches: [ main ]pull_request:branches: [ main ]#開始工作
jobs:
#獲取鏡像build:
#鏡像名稱:cmit-docker-ciname: cmit-docker-ci
#鏡像版本:ubuntu-latestruns-on: ubuntu-latest
#執行步驟steps:
#切換分支- uses: actions/checkout@v2
#設置鏡像倉庫☆☆☆☆☆☆☆☆☆☆修改cicd-test/cicd_test為當前工程使用的'鏡像庫/工程名'☆☆☆☆☆☆☆☆☆☆- name: set image repository run: echo "IMAGE_REPO=image.sd001.cn:30003/sdvillage/h5:${{env.TAG}}" | tee -a $GITHUB_ENV ${{env.PROJECT_PATH}}/env
#登錄鏡像庫- name: docker loginrun: docker login image.sd001.cn:30003 -u ${{env.USER_NAME}} -p ${{env.PASSWORD}}
#制作鏡像☆☆☆☆☆☆☆☆☆☆進入代碼倉庫根目錄制作鏡像Dockerfile需要根據項目工程進行修改☆☆☆☆☆☆☆☆☆☆- name: Build the Docker imagerun: cd ${{env.PROJECT_PATH}} && docker build . --file Dockerfile --tag ${{env.IMAGE_REPO}}
#推送鏡像- name: docker pushrun: docker push ${{env.IMAGE_REPO}}
注意,這里由于是單項目目錄,沒有做根目錄調整。
Dockerfile
由于不用在線編譯,所以Dockerfile也簡化不少。
# 改為本地編譯后,提交編譯后代碼到git,使用編譯后代碼直接打包鏡像#設置基礎鏡像☆☆☆☆☆☆☆☆☆☆根據工程運行需要配置帶有相應環境的運行用途鏡像☆☆☆☆☆☆☆☆☆☆
FROM image.sd001.cn:30003/apaas/base-openeular22-nginx-1.25.1:V1 AS final
MAINTAINER wang.robin# 復制web應用到根目錄
COPY /unpackage/dist/build/h5/ /web/h5/# 復制nginx配置文件到conf.d
COPY h5.conf /usr/local/nginx/conf.d/#設置容器端口
EXPOSE 8080
#設置CMD命令前臺運行nginx
CMD nginx -g 'daemon off;'
1. 直接拉去前端運行鏡像包openerlar22-nginx-1.25.1。
2. 復制當前項目代碼提交的打包后文件目錄。/unpackage/dist/build/h5/目錄到/web/h5/目錄下。
3. 復制h5.conf的nginx配置文件到conf.d目錄下。
server {listen 8080;server_name localhost;location /h5 {alias /web/h5; try_files $uri $uri/ /h5/index.html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
4. 配置容器端口8080
5. 啟動nginx服務。
磐舟配置
由于是線下打包編譯,所以整體變得簡單了很多。
總結
? ? ? ? 磐舟只是一個Devops工具,他提供了CI的基礎流程引擎,需要你在理解他CI流程設計的基礎上,遵循他的設計原則進行CI配置。其實和Jenkins的方式也差不多。只不過減少了sh腳本的編寫,改為了yml的編寫,同時是基于容器化方式實現ci。本身他的架構是相對靈活的,可以通過不同呢的底包Image和不通的ci.yml的step的設計靈活的實現自己的流水線。但是目前可視化配置這塊還在完善中,對于流程配置這塊,還是需要懂一些研發,能夠和研發團隊進行良好溝通,才能夠快速完成配置工作。一次配置完成后,如果項目沒有增加新的配置文件,或者修改配置項,理論上是不需要進行修改的。但是如果研發添加了新的配置文件,那么就需要同步修改Dockerfile的文件了。這塊需要兩邊做好協同。