CICD Jenkins实现Pipline

一、安装

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

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.xdnf.cn/news/1550931.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DotNetty ChannelRead接收数据为null

问题:C#使用Dotnetty和Java netty服务器通讯,结果能正确发送数据到服务器,却始终接收不到服务器返回的数据。 解决:一定一定要注意服务器和客户端使用的编码一定要完全一样才行 我先前在客户端添加了StringDecoder,服务器却没有…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域,Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸,为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程,让开发者能够专注于业务逻辑的实现。无论是构建小型的…

8.12 矢量图层面要素单一符号使用八(随机标记填充)

8.12 矢量图层面要素单一符号使用八(随机标记填充)_qgis随机填充-CSDN博客 目录 前言 随机标记填充(Random Marker Fill) QGis设置面符号为随机标记填充(Random Marker Fill) 二次开发代码实现随机标记填充(Rando…

《低空经济:文旅行业的新引擎 》

《低空经济:文旅行业的新引擎 》 一、低空经济与文旅行业的融合态势 低空经济作为新兴经济形态,正与文旅行业深度融合,为文旅发展带来新机遇。 近年来,随着科技的不断进步和人们对旅游体验的不断追求,低空经济与文旅…

Java面试常见问题总结

Java基础 Java 中的⼏种基本数据类型是什么?对应的包装类型是什么?各⾃占⽤多少字节呢? Java 中有 8 种基本数据类型,分别为: 6 种数字类型: 4 种整数型:byte、short、int、long2 种浮点型&a…

elasticsearch基础知识、go如何操作elasticsearch

【单元目标】 什么是elasticsearch? elasticsearch Analysis(分词器)概念及使用 go实现elasticsearch 搜索封装 【教学内容】 1. 什么是elasticsearch? Elasticsearch 是一个实时的分布式存储、搜索、分析的引擎。 Elasticsearch is a real-time, …

在Windows上使用谷歌浏览器的安全支付功能

在使用谷歌浏览器进行在线支付时,确保您的交易安全至关重要。本文将为您提供详细的步骤,帮助您在Windows系统上启用和使用谷歌浏览器的安全支付功能。 (本文由https://www.chromexz.com.cn/站点的作者进行编写,转载时请进行标注。…

Unity 代码裁剪(Strip Engine Code)

文章目录 0.IL2CPP 打包运行闪退问题1.什么是代码裁剪2.为什么要使用代码裁剪3.代码裁剪设置与级别4.强制保留代码4.1 使用[Preserve]标签4.2 使用Link.xml文件 5.Strip中遇到的问题及解决方法6.注意事项 0.IL2CPP 打包运行闪退问题 Google Play要求从2019年8月1日起apk必须支…

《后端程序猿 · Spring事务失效场景》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术?二、项目内容1.整体介绍(示范)2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,记账本小…

MBSE和刚亮相的B-21“突袭者”隐形轰炸机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 12月2日,B-21“突袭者”隐形轰炸机举行揭幕仪式。 摘译一篇来自制造商Northrop Grumman公司(诺斯罗普格鲁曼公司)网站上的文章片段。 利…

HashMap的实现

Hash的最大容量为什么是2的30次方 问题 static final int *MAXIMUM_CAPACITY* 1 << 30; 回到题目&#xff0c;为什么会是2的30次幂&#xff0c;而不是2的31次幂呢&#xff1f; 首先&#xff1a;JAVA规定了该static final 类型的静态变量为int类型&#xff0c;至于为什…

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…

跨学科数字教学知识库的建设挑战与解决方案

随着知识经济的不断发展和教育改革的深入&#xff0c;跨学科教学逐渐成为培养具有综合素质和创新能力的关键途径。在这一背景下&#xff0c;搭建跨学科数字教学知识库显得尤为重要。然而&#xff0c;跨学科知识的复杂性和多样性给知识库的建设带来了诸多挑战。本文旨在探讨这些…

8621 二分查找

**思路&#xff1a;** 1. 读取输入的元素个数 n。 2. 读取有序数组 ST。 3. 读取要查找的关键字 key。 4. 使用折半查找法&#xff08;即二分查找&#xff09;在数组 ST 中查找 key 的位置。 5. 如果找到 key&#xff0c;输出其位置&#xff1b;如果未找到&#xff0c;输出 &qu…

django的模型层介绍与配置

1 Django的Model模型介绍 模型是我们项目中的的数据信息源&#xff0c;它包含着储存数据的必要字段和行为。 通常&#xff0c;每个模型对应数据库中的一张表&#xff0c;每个属性对应一个字段 每个模型都是django.db.models.Model的一个Python 子类。 Django 提供一套自动生成…

Servlet 3.0新特征

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServlet 3.0概述 Servlet 3.0规范是在2009年随着Java EE 6的发布而推出的。它引入了一系列新特性和改进,旨在简化Web应用的开发和部署过程,并提高Web应用的性能和可扩展性。Servlet 3.0的发布标…

Linux下驱动开发实例

驱动开发 驱动与硬件的分离 在传统的嵌入式系统开发中&#xff0c;硬件信息往往是直接硬编码在驱动代码中的。这样做的问题是&#xff0c;当硬件发生变化时&#xff0c;比如增加或更换设备&#xff0c;就需要修改驱动程序的代码&#xff0c;这会导致维护成本非常高。因此&…

Windows:win11旗舰版连接无线显示器,连接失败

摘要&#xff1a;win11系统通过 miracast 无线连接到长虹电视的时候&#xff0c;一直连接不上。查看电脑又是支持 miracast 协议&#xff0c;后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视&#xff0c;打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…

Ps:将画板导出到 PDF

菜单&#xff1a;文件/导出/将画板导出到 PDF Export/Artboards to PDF 将画板导出到 PDF Artboards to PDF命令用于将 Photoshop 的画板导出为 PDF 文件&#xff0c;提供了多种导出选项&#xff0c;可以控制文件的压缩、是否嵌入颜色配置文件、文件命名以及页面顺序等。它适用…