CICD Jenkins实现Pipline

news/2024/12/21 21:17:23/

一、安装

1、由于 Jenkins 是基于 Java 的,首先需要确保你的系统中安装了 Java。推荐使用 OpenJDK 11。可以通过以下命令安装:

apt update
apt install openjdk-11-jdk

2、在安装 Jenkins 之前,你需要将其仓库添加到你的系统中。首先,导入 Jenkins 仓库的密钥:

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

3、然后,将 Jenkins 仓库添加到系统的软件源列表:

sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

4、安装jenkins

apt update
apt-get install jenkins

5、配置清华源
image
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

6、安装中文插件
Localization: Chines
安装后需要重启

systemctl restart jenkins

jenkins_30">二、配置jenkins

1、安装Git、Git client插件、Docker Pipeline、Pipeline、Blue Ocean、Pipeline: Stage View、user build vars
Pipeline: Stage View这个插件我很推荐,感觉比Blue好用
user build vars pipline调用内置变量,用户名和分支较为常用
2、生成公钥免密拉取代码

# 运行jenkins的用户执行
ssh-keygen -t rsa -b 4096 -C "baga@baga.com"
公钥添加到jenkins用户中(服务运行账户就是jenkins)
私钥添加到jenkins凭据中,jenkins任务需要指定凭据运行

3、测试jenkins

运行jenkins的用户执行
$ ssh -p 2222 git@192.168.31.20
PTY allocation request failed on channel 0
Welcome to GitLab, @jenkins!
# 到这里基本可以确定jenkins ssh gitlab没问题

4、添加凭据,选择ssh用户名和私钥
image

5、选择凭据登录git仓库
image

6、修改jenkins目录

# 启动脚本必须修改
vim /lib/systemd/system/jenkins.service
Environment="JENKINS_HOME=/data/jenkins"
WorkingDirectory=/data/jenkins
vim /etc/default/jenkins
JENKINS_HOME=/data/$NAME
# 拷贝文件
rsync -avzh /var/lib/jenkins/ /data/jenkins/
# 然后重启jenkins

三、Jenkins DOCKERFILE

文件/data/Dockerfile-tmp,给容器一个基础的Dockerfile去构建镜像

FROM golang:1.19-alpine AS builder
WORKDIR /app
# 设置代理
ENV HTTP_PROXY http://192.168.31.115:1070
ENV HTTPS_PROXY http://192.168.31.115:1070
COPY . /app
# 只有当 go.mod 不存在时才初始化模块
RUN if [ ! -f go.mod ]; then go mod init yourmodule.com/m; fi
RUN go mod tidy
# 构建应用程序
RUN go build -o {{APP_NAME}}# 使用 alpine 镜像作为运行环境
FROM alpine:latest# 设置工作目录
WORKDIR /app# 从构建器镜像中复制编译好的应用程序
COPY --from=builder /app/{{APP_NAME}} .# 暴露端口
EXPOSE 8080# 设置启动命令
CMD ["./{{APP_NAME}}"]

四、Pipline测试

控制台可以看到构建人和分支
image

由于是jenkins用户运行的jenkins服务,所以需要用jenkins用户去docker login baga仓库,这样pipeline中就不需要再配置用户名密码了

pipeline {agent any  // 在任何可用的代理上运行environment {APP_NAME = "${env.JOB_NAME}"  // 应用名称设置为当前 Jenkins 作业的名称GIT_REPO = "ssh://git@192.168.31.20:2222/root/${APP_NAME}.git"  // Git 仓库地址STAGE_SUCCESS = "true"  // 跟踪整个 Pipeline 的成功状态IMAGE_TAG = "${APP_NAME}:${sh(returnStdout: true, script: 'date +%Y%m%d-%H%M').trim()}"  // 创建镜像标签,包含日期和时间SKIP_PUSH = "false"  // 动态控制是否推送镜像到仓库CONTAINER_PORT = "8080"  // 定义容器端口HOST_PORT = "8888"  // 定义宿主机映射端口PUSH_URL = "harbor.baga.live/base"  // 推送的仓库URL}stages {stage('Setup') {steps {script {// 使用插件提供的变量设置构建描述wrap([$class: 'BuildUser']) {env.BUILD_USER_ID_SAFE = BUILD_USER_IDcurrentBuild.displayName = "Build #${BUILD_NUMBER} by ${BUILD_USER_ID}"currentBuild.description = "Initiated by ${BUILD_USER_ID} on branch ${BRANCH}"echo "Build initiated by ${BUILD_USER_ID} on ${BRANCH}"}}}}stage('Clean Workspace') {  // 清理工作区阶段steps {deleteDir()  // 删除工作目录中的所有文件}post {failure { script { env.STAGE_SUCCESS = "false" } }  // 如果失败,更新 STAGE_SUCCESS 环境变量}}stage('Prepare Environment') {  // 准备环境阶段steps {script { echo "IMAGE_TAG: ${env.IMAGE_TAG}" }  // 输出当前的镜像标签}post {failure { script { env.STAGE_SUCCESS = "false" } }  // 如果失败,更新 STAGE_SUCCESS 环境变量}}stage('拉取代码') {  // 拉取代码阶段steps {script {checkout scm: [$class: 'GitSCM',branches: [[name: "${BRANCH}"]],userRemoteConfigs: [[url: "${env.GIT_REPO}"]]]}}post {failure { script { env.STAGE_SUCCESS = "false" } }  // 如果失败,更新 STAGE_SUCCESS 环境变量}}stage('Prepare Dockerfile') {  // 准备 Dockerfile 阶段steps {sh "sed 's/{{APP_NAME}}/${APP_NAME}/g' /data/Dockerfile-tmp > Dockerfile"}post {failure { script { env.STAGE_SUCCESS = "false" } }  // 如果失败,更新 STAGE_SUCCESS 环境变量}}stage('构建镜像') {  // 构建镜像阶段steps {script { docker.build("${env.IMAGE_TAG}") }  // 使用 Docker 插件构建镜像}post {failure { script { env.STAGE_SUCCESS = "false" } }  // 如果失败,更新 STAGE_SUCCESS 环境变量}}stage('推送镜像') {when { expression { env.STAGE_SUCCESS == "true" && env.SKIP_PUSH == "false" } }steps {script {sh "docker tag ${IMAGE_TAG} ${PUSH_URL}/${IMAGE_TAG}"sh "docker push ${PUSH_URL}/${IMAGE_TAG}"}}post {success {echo "Image pushed successfully to ${PUSH_URL}/${IMAGE_TAG}"}failure {script { env.STAGE_SUCCESS = "false" }echo "Failed to push the image to ${PUSH_URL}/${IMAGE_TAG}"}}}stage('部署测试') {  // 部署测试阶段steps {sh "docker run -d -p ${HOST_PORT}:${CONTAINER_PORT} --name ${APP_NAME} ${IMAGE_TAG}"}}}post {always {script {def buildStatus = (currentBuild.currentResult == 'SUCCESS') ? '成功' : '失败'sh "/bin/bash /data/ops/send_lark.sh 'Production' '${JOB_NAME}' '${BRANCH}' '${env.BUILD_USER_ID_SAFE}' '${buildStatus}' '${env.BUILD_URL}'"}}}
}

http://www.ppmy.cn/news/1534921.html

相关文章

蛋白质结构中原子坐标转换

在蛋白质结构分析中,原子坐标经过旋转矩阵和平移向量的转换是常见操作。一般情况下,假设一个原子在结构 A 中的坐标为 (x, y, z),在经过旋转矩阵 u 和平移向量 t 的变换后,得到新的坐标 (X, Y, Z)。然后,再将新的坐标反向映射回原始坐标系。 基本数学公式 1. 变换公式:…

scrapy爬取汽车、车评数据【中】

这个爬虫我想分三期来写: ✅ 第一期写如何爬取汽车的车型信息; ✅ 第二期写如何爬取汽车的车评; ✅ 第三期写如何对车评嵌入情感分析结果,以及用简单的方法把数据插入mysql中; 技术基于scrapy框架、BERT语言模型、mysq…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…

增强现实中的物体识别与跟踪

增强现实(AR)中的物体识别与跟踪是实现虚拟内容与现实世界无缝融合的关键技术。以下是该领域的主要技术和方法概述: 1. 物体识别 1.1 特征提取 SIFT、SURF、ORB:传统的特征提取算法用于识别图像中的关键点并生成描述符&#xf…

STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28

目录 一、教程简介 二、驱动原理讲解 (一)通信4步骤 (二)传感器数据解析 三、CubeMX生成底层代码 (一)基础配置 (二)配置DHT11的驱动引脚 (三)配置串口 四…

选择网络安全模式启动Windows系统,解决PC无法连接网络问题

目录 1、电脑无法连接网络 2、发现C:\Windows\System32\drivers路径下的很多文件不见了 3、使用360安全卫士中的断网急救箱工具修复,也就解决不了问题 4、重启系统,以网络安全模式启动系统,修复系统网络模块,完美解决问题 5、…

Java中的数据格式转换:JSON、XML与Protobuf的应用与选择

Java中的数据格式转换:JSON、XML与Protobuf的应用与选择 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们要聊的主题是Java开发中经常涉及到的一个重要问题——数据格式转换。…

【GEE学习第二期】GEE数据类型、语法

【GEE学习第二期】GEE数据类型、语法 GEE基本数据类型基本语法循环条件判断累加 可视化影像与波段影像集数据导出数值与绘图保存影像 参考 GEE基本数据类型 GEE 中使用的主要数据类型是栅格,涵盖从本地到全球范围的图像,可从数百个卫星和航空资源获得图…