一、部署jenkins
参考本站链接:Jenkins部署与使用方法
二、部署gitlab
参考本站链接:GitLab部署与使用方法
三、部署harbor仓库
参考本站链接:harbor镜像仓库搭建&使用教程
四、DevOps示例全程
4.1 devops的概念
DevOps(开发运维)是一个结合了文化理念、自动化工具和流程实践的集合,旨在促进开发团队(Dev)和运维团队(Ops)之间的沟通、协作、集成与协作,以实现软件开发、交付和运营的效率。其核心目标是让软件从开发到测试再到生产的整个生命周期都能更加高效、可靠和快速。
核心事件:
- 持续集成 (CI): 开发人员频繁地将代码集成到共享仓库中,每次集成都通过自动化构建和测试来验证。
- 持续交付 (CD): 扩展了持续集成,确保代码在任何时间都可以部署到生产环境,或者至少是接近生产可用状态,通常需要手动触发
4.2 Jenkinsfile
Jenkinsfile 是一个文本文件,它用于定义 Jenkins Pipeline(流水线)。
- Pipeline: 将软件开发的各个阶段(如代码编译、测试、打包、部署等)组织成一个线性的或有分支的工作流程。它让你能够自动化整个应用程序的交付和部署过程。
- Jenkinsfile: 代码形式的 Pipeline 定义: 它将原本存储在 Jenkins 主节点上的配置(例如,为一个自由风格的软件项目定义构建步骤、触发器等)转化为代码。
- 存储位置: 这个文件通常存储在与项目代码版本控制(如 Git、 SVN)在一起的仓库中。
- 语法: Jenkinsfile 使用 Jenkins 官方的声明式 DSL (Domain Specific Language,领域特定语言) 来编写,这是当前推荐的标准写法。它定义了流水线的整体结构、各个阶段、环境变量、工具、参数等。
4.3 创建流水线
4.3.1 新建流水线项目
描述:可写可不写
往下拉到【流水线】,选择【Pipeline script from SCM】。
官方推荐使用 “Pipeline script from SCM”(即把 pipeline script 放在 SCM 中),原因如下:
- 标准化与一致性:
pipeline 跟代码一起管理,确保每次部署的环境、依赖和流程配置都是最新且一致的。- 可追溯性:
所有 pipeline 修改都可以像代码一样被版本控制,谁改的、何时改的、改了什么,一目了然。- 更好的协作流程:
团队成员可以像协作代码一样协作 pipeline,避免“配置漂移”问题。- 与 DevOps 最佳实践接轨:
现代 DevOps 环境中,pipeline 作为代码的一部分,已经是非常常见的做法。
【SCM】选择Git,依次填好【Repository URL】地址,选自创建好的仓库;【Credentials】选择对应仓库的成员账号密码
【指定分支】选择master,但视具体情况而定,脚本路径【Jenkinsfile】,需和仓库实际脚本名称一致
4.3.2 Jenkinsfile样例
pipeline {
agent any
// 看这里,导入maven,名字就是在全局工作配置中配置了的
//tools{
// maven 'maven_3.8.4'
//}
environment {
DOCKER_HOST = "tcp://172.16.10.141:2375" // Docker服务器IP
}
stages {
stage('设置全局变量'){
steps {
script {
def registry_Url = "myharbor.com"
def image_reg = "testreg"
def image_name = "micro"
def image_tag = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
//env.image_tag = IMAGE_TAG
def image = "${registry_Url}/${image_reg}/${image_name}:${image_tag}"
env.IMAGE = image
}
}
}
stage('拉取项目代码') {
steps {
script {
git credentialsId: 'fb3c45ec-de3d-4a3d-8550-a77dc30947b4', url: 'http://172.16.10.142/jamking/microcommunity.git'
echo '拉取代码成功'
}
}
}
stage('执行镜像构建') {
steps {
script {
echo '构建完成'
// 使用withCredentials注入Harbor的登录凭据
withCredentials([usernamePassword(credentialsId: 'ca1eb1ba-0f5d-4089-b369-237f56aaddfd',
passwordVariable: 'HARBOR_PASSWORD',
usernameVariable: 'HARBOR_USER')])
{
sh """
docker build -t ${env.IMAGE} .
docker login myharbor.com -u ${HARBOR_USER} -p ${HARBOR_PASSWORD}
docker push ${env.IMAGE}
"""
}
}
}
}
}
}
4.3.3 Dockerfile样例
FROM dockerproxy.net/library/maven:3.6.0-jdk-8-alpine AS builder
WORKDIR /app
# 先单独复制pom.xml(利用Docker缓存层)
COPY . .
RUN --mount=type=cache,target=/root/.m2 \
mvn clean install -DskipTests
FROM dockerproxy.net/library/openjdk:8-jre-alpine
WORKDIR /app
COPY --from=builder /app/springboot/target/*.jar /app/app.jar
# 启动命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
4.4 运行流水线
流水线内执行【Build Now】,出现了报错,我们可以点击【#1】的【Console Output】也就是控制台输出来查看报错内容
发现是jenkinsfile未上传到项目仓库,在gitlab仓库内新建文件或从本地推送即可。其余执行流水线报错都会终止,均可以在【Console Output】查看报错,然后对症下药。
上传完Jenkinsfile,再次运行【Build Now】,耐心等待出现【Finished SUCCESS】才代表整个流程运行成功
4.5 查看阶段运行情况
此模块可以查看当前流水线阶段的运行情况、时间等
4.6 示例总结
以上仅是一些简单的示例构建docker镜像并推送到harbor仓库场景,实际上jenkins可以实现更多复杂的场景,如jenkinsfile运行过程可以定义input和 Parameter来进行不同的【代码分支】构建,不同的【环境】部署,一键构建镜像并进行k8s部署,代码提交触发器立即构建,也可以利用Jenkins去做一些相对传统的运维,如批量发布多节点服务,省去多次的人工步骤等等等等,持续探索...
五、试运行docker镜像
5.1 检查docker镜像
发现镜像已经构建成功
检查harbor仓库推送情况
5.2 试运行容器
docker run -itd --name testrun myharbor.com/testreg/micro:59761cf
docker ps |grep testrun
docker logs --tail=100 testrun
容器已经正常运行并打印日志
评论区