jenkins pipeline實現CI/CD

在企業級的架構中,CI/CD是必不可少的一個環節,它可以讓開發人員只關注于開發,而不必去關注項目的構建和部署,從而提高開發人員的效率。

本文我們來介紹一下使用jenkins 的pipeline來進行java項目的自動構建以及部署。我們通過腳本來生成docker鏡像,并推送到鏡像倉庫,供k8s使用。

整體思路是先通過maven構建項目,然后通過build_docker.sh腳本來打包生成鏡像,該腳本接收3個參數,-j 需要執行的jar包的名字,-F 項目文件名 -p ,鏡像需要推送的環境

根據參數會打包成相應的鏡像,并且推送到鏡像倉庫。

一?基礎鏡像環境

1 因為是基于springboot的java項目啟動項目需要java環境,我們構建一個自己的jdk環境,使用jdk8。

Dockerfile 如下

FROM ubuntu
WORKDIR /usr/local/jdk1.8.0_301
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=$JAVA_HOME/bin:$PATH
CMD ["java","-version"]

構建自己的jdk8鏡像

docker build -f Dockerfile -t jdk8img .

2 Jenkins我們也通過docker的方式來運行,基于官方jenkins鏡像我們加進去自己的jdk版本(因為目前項目大部分使用jdk8,而最新jenkins官方鏡像為jdk11),以及使用宿主機的maven,docker環境,來制作一個jenkins鏡像。

這里基于官方鏡像,這里安裝libltdl7是為了運行宿主機docker環境需要。

FROM jenkins/jenkins
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=/usr/local/maven/bin:$JAVA_HOME/bin:$PATH
USER root
RUN apt-get update && apt-get install -y libltdl7

? ??

這里的前提是宿主機提前安裝好maven和docker環境,具體安裝方式這里就不詳細講述了。

啟動jenkins

這里啟動命令掛載了宿主機的docker,以及maven目錄

docker run --name jenkins -d -v /etc/localtime:/etc/localtime:ro -v /data1/services/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /usr/local/maven:/usr/local/maven  -p 8080:8080 -p 50000:50000 --dns=8.8.8.8 jenkins

二 腳本編寫

前面我們制作好了各個基礎鏡像,現在需要編寫腳本來將鏡像編譯打包以及鏡像生成,并推送到鏡像倉庫

我們有4個腳本要編寫

1 jenkins pipeline的配置文件Jenkinsfile,這個是jenkins多分支流水線作業必須的配置文件

2 Dockerfile:構建應用鏡像的描述文件

3 build_docker.sh:打包鏡像的腳本,我們的項目通過maven打包以后,需要按一定規范存放文件,并且執行啟動應用的腳本

4 start.sh項目啟動的腳本,用于在鏡像啟動時執行

Jenkinsfile

pipeline {agent anystages {stage('package') {steps {sh 'mvn -Dmaven.test.skip=true -Dmaven.source.skip=true  -am clean package -U'}}stage('Test') {steps {sh './build_docker.sh -j smart4-api-1.0-SNAPSHOT.jar -F smart4-api'sh './build_docker.sh -j smart4-web-1.0-SNAPSHOT.jar -F smart4-web'}}}
}

? ?Dockerfile

FROM jdk8img
ARG jarfile
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezoneWORKDIR /data/app/smart4ENV DWPROJECTNO=smart4
ENV EXECJAR=$jarfileADD workspace /data/app/smart4EXPOSE 8081CMD ["sh","-c","shell/start.sh $EXECJAR"]

? ??build_docker.sh

#!/bin/bash
DOCKER_REGISTRY="harbor.udblogin.87yy.com:4443"
NAMESPACE="yygame"
BASEDIR=$(pwd)
PRONAME=`basename $BASEDIR`
DIRNAME=`dirname  $BASEDIR`
folder=`basename $DIRNAME`
dockerfile="Dockerfile"
product="test"
jarfile=""while getopts "f:F:p:j:" option
docase "$option" inf)dockerfile="$OPTARG";;F)folder="$OPTARG";;p)product="$OPTARG";;j)jarfile="$OPTARG";;\?)usageexit 1;;esac
doneecho "begin copy workspace"
rm -rf $BASEDIR/workspace
mkdir -p $BASEDIR/workspace/web
mkdir -p $BASEDIR/workspace/lib
mkdir -p $BASEDIR/workspace/shell
mkdir -p $BASEDIR/workspace/configfind . -maxdepth 4 -regex ".*/target/[^\/]*.war"  -exec cp -f {} $BASEDIR/workspace/web/ \;
find . -maxdepth 4 -regex ".*/target/[^\/]*.jar"  -exec cp -f {} $BASEDIR/workspace/lib/ \;
cp -Rf  config/* $BASEDIR/workspace/config/
cp ./start.sh $BASEDIR/workspace/shellecho "workspace is ready"echo "begin build docker"timestamp=$(date "+%Y%m%d%H%M%S")echo "build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfile"docker build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfileecho "docker build done"echo "start push to registry"
docker login --username=yygame harbor.udblogin.87yy.com:4443 -p xxxxxx
if [[ $product == "test" ]];thendocker push ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp
fi
echo "folder $folder"
echo "product $product"
echo "exec jarfile $jarfile"

start.sh?

#!/bin/bash
jarfile=$1
echo "exec $jarfile"
echo "start app"
echo "java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher"
java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher

? ?

三 jenkins新建多分支流水線

新建任務,選擇多分支流水線。主要配置git地址,憑據。配置發現分支策略,這里可以按項目代碼規范來配置,比如開發版本就過濾掉,因為每次構建都會去打包生成鏡像,如果不過濾會構建所有分支的鏡像,比較耗時,耗費資源。配置好以后,運行構建,會自動打包并推送鏡像到鏡像倉庫了。

四 構建

我們在jenkins后臺選擇smart4項目的master分支,點擊構建

然后查看構建日志

待構建完成以后,去鏡像倉庫后臺查看鏡像倉庫是否生成

我們看到已經生成了新的鏡像了。整個流程完成。??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81530.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物聯網數據平臺

一、 引言:為什么選擇InfluxDB 3? 項目背景: 在我們的隧道風機監控系統中,實時數據的采集、存儲和高效查詢是至關重要的核心需求。風機運行產生的振動、傾角、電流、溫度等參數是典型的時序數據,具有高并發寫入、數據…

泰國SAP ERP實施如何應對挑戰?工博科技賦能中企出海EEC戰略

泰國正依托"東部經濟走廊(EEC)"與RCEP協定疊加優勢,為中國企業提供面向亞太市場的戰略機遇。作為2022年泰國主要外資來源國之一,中國企業通過電子制造、智能家電、數據中心及新能源車等領域的投資深度參與泰國"4.0…

【設計模式】- 創建者模式

單例模型 餓漢式 靜態方法創建對象 public class Singleton {// 私有構造方法private Singleton(){}private static Singleton instance new Singleton();// 提供一個外界獲取的方法public static Singleton getInstance(){return instance;} }靜態代碼塊創建對象 public …

邏輯與非邏輯的彌聚

非邏輯彌聚與邏輯彌聚是復雜系統中兩種不同的信息整合方式。邏輯彌聚側重于通過明確的規則、規律和結構化方法,將分散的信息或功能進行有序的組織和集中處理,強調理性和確定性。而非邏輯彌聚則更多地涉及情感、直覺、經驗等非線性、非結構化的因素&#…

Linux進程信號(三)之信號產生2

文章目錄 4. 由軟件條件產生信號5. 硬件異常產生信號模擬一下除0錯誤和野指針異常除0錯誤野指針錯誤 總結思考一下 4. 由軟件條件產生信號 SIGPIPE是一種由軟件條件產生的信號,在“管道”中已經介紹過了。 軟件條件不就緒,很明顯這個軟件條件沒有直接報錯&#xff…

讀取18B20的問題,時鐘太慢了

使用MSP430,1M時鐘,在讀取18B20數據時,一直存在問題,使用邏輯分析儀讀取的數據也是莫名其妙,查看電路圖和器件也沒有發現問題,就這樣斷斷續續的卡了一周多。 今天忽然想把時鐘升一下試試,原來1…

第12章 Java多線程機制

12.1 進程與線程 4種狀態:新建、運行、中斷和死亡。 (新建、運行、中斷和死亡) 建立線程的兩種方法:用Thread類或其子類。 線程新建后,必須調用 start () 方法使其進入就緒隊列,才有機會獲得 CPU 資源&a…

利用 Amazon Bedrock Data Automation(BDA)對視頻數據進行自動化處理與檢索

當前點播視頻平臺搜索功能主要是基于視頻標題的關鍵字檢索。對于點播平臺而言,我們希望可以通過優化視頻搜索體驗滿足用戶通過模糊描述查找視頻的需求,從而提高用戶的搜索體驗。借助 Amazon Bedrock Data Automation(BDA)技術&…

React 19版本refs也支持清理函數了。

文章目錄 前言一、refs 支持清理函數二、案例演示1.useEffect寫法2.React 19改進 的ref寫法 總結 前言 React 19版本發布了ref支持清理函數了,這樣就可以達到useEffect一樣的效果了。為啥需要清理函數呢,這是因為節約內存。 清理事件監聽(避…

城市內澇監測預警系統守護城市安全

一、系統背景 城市內澇是指由于強降水或連續性降水超過城市排水能力,導致城市內產生積水災害的現象。隨著氣候變化和城市化進程的加快,城市內澇現象愈發頻繁和嚴重。傳統的城市排水系統已難以滿足當前的城市排水需求,特別是在暴雨等極端天氣條…

Flink 作業提交流程

Apache Flink 的 作業提交流程(Job Submission Process) 是指從用戶編寫完 Flink 應用程序,到最終在 Flink 集群上運行并執行任務的整個過程。它涉及多個組件之間的交互,包括客戶端、JobManager、TaskManager 和 ResourceManager。…

ctr查看鏡像

# 拉取鏡像到 k8s.io 命名空間 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 驗證鏡像是否已下載 sudo nerdctl --namespace k8s.io images 下載鏡像到k8s.io名稱空間下 nerdctl --namespace k8s.io pull zookeeper:3.6.2 sudo ctr image pull --namespace k8s.io …

中科院自動化研究所通用空中任務無人機!基于大模型的通用任務執行與自主飛行

作者: Ji Zhao and Xiao Lin 單位:中科院自動化研究所 論文標題:General-Purpose Aerial Intelligent Agents Empowered by Large Language Models 論文鏈接:https://arxiv.org/pdf/2503.08302 主要貢獻 硬件-軟件協同設計框…

數據結構 -- 樹形查找(三)紅黑樹

紅黑樹 為什么要發明紅黑樹 平衡二叉樹AVL:插入/刪除很容易破壞平衡性,需要頻繁調整樹的形態。如:插入操作導致不平衡,則需要先計算平衡因子,找到最小不平衡子樹(時間開銷大),在進行…

容器化-k8s-使用和部署

一、K8s 使用 1、基本概念 集群: 由 master 節點和多個 slaver 節點組成,是 K8s 的運行基礎。節點: 可以是物理機或虛擬機,是 K8s 集群的工作單元,運行容器化應用。Pod: K8s 中最小的部署單元,一個 Pod 可以包含一個或多個緊密相關的容器,這些容器共享網絡和存儲資源。…

力扣-283-移動零

1.題目描述 2.題目鏈接 283. 移動零 - 力扣&#xff08;LeetCode&#xff09; 3.題目代碼 class Solution {public void moveZeroes(int[] nums) {int dest-1;int cur0;while(cur<nums.length){if(nums[cur]0){cur;}else if(nums[cur]!0){swap(nums,cur,dest1);cur;dest…

前端開發筆記與實踐

一、Vue 開發規范與響應式機制 1. 組件命名規范 自定義組件使用大駝峰命名法&#xff08;如 MyComponent&#xff09;&#xff0c;符合 Vue 官方推薦&#xff0c;便于與原生 HTML 元素區分。 2. Proxy vs defineProperty 特性Proxy&#xff08;Vue3&#xff09;Object.defi…

如何給PSCAD添加庫文件

1、點擊Options 2、選擇藍色的選項 3、查看Intel(R) Visual Fortran Compiler XE 的版本 4、打開原文件的Library 5、打開 6、點擊這個文件的右鍵 7、然后選擇第一項project setting 9、先把第8步中link里面原有的路徑刪除&#xff0c;再點browes[A1] &#xff0c;然后選擇 [A…

milvus+flask山寨《從零構建向量數據庫》第7章case2

繼續流水賬完這本書&#xff0c;這個案例是打造文字形式的個人知識庫雛形。 create_context_db: # Milvus Setup Arguments COLLECTION_NAME text_content_search DIMENSION 2048 MILVUS_HOST "localhost" MILVUS_PORT "19530"# Inference Arguments…

【第一篇】 創建SpringBoot工程的四種方式

簡介&#xff1a; 通過此篇博客你可以使用任何方式進行創建 SpringBoot 項目&#xff0c;并且在文章的最后附上答疑解惑一節&#xff0c;為你排除在使用過程中發生的常見問題。文章內容若存在錯誤或需改進的地方&#xff0c;歡迎大家指正&#xff01;若對操作有任何疑問歡迎留言…