Devops:它强调开发(Development)和运维(Operations)团队之间的协作.实现更快,更可靠的软件交付部署.
JenKins是一个开源的自动化服务器,广泛用于构建,测试和部署软件项目.它是持续集成(CI)和持续交付/部署(CD)的工具.JenKins是实现DevOps实践的重要工具.
前端项目部署一般流程:
1.npm install安装依赖
2.npm run build打包
3.上传到服务器比如Nginx的html目录下
后端项目部署一般流程
1.mven下载依赖
2.mvn打成jar
3.上传服务器
4.java -jar命令运行
那么Jenkins干了什么呢? 当我们把项目提交到gitee或者github时候
Jenkins从代码仓库拉取代码之后 就是帮我们做了这些事情,好比你写了一个脚本去完成这些事

也有很多企业,给项目中放一个deploy.sh脚本

另外Jenkins有很多插件,可以邮件通知等等

大致流程:我们将项目推送到gitee或者github,gitee或者github通知JenKins服务,JenKins服务拉取代码,完成打包部署到服务器的方案

因为JenKin需要自己打包,因此前端项目需要Node环境,Java需要JDK环境,PHP需要PHP的环境
试想,你在打包前端项目,打包后端项目时候,自己电脑是不是需要这样环境,一样道理
下面就以这个前端项目为例
VitePress+Docker+jenkins构建个人网站-CSDN博客
将项目上传到gitee之后,让该项目自动部署
在这个例子中我们使用Docker来拉取Node环境,因此JenKins需要内嵌Docker
而本身JenKins是java写的,因此还需要Docker拉取JDK环境
这里由于自己比较菜,Docker不是很了解 因此选择用Docker安装Jenkins选用宿主机上安装JDK和Node环境的方式
JenKins中文官网
JenkinsJenkins 是一个开源自动化服务器
https://www.jenkins.io/zh/



安装JDK
mkdir /usr/local/develop
cd /usr/local/develop
把JDK拖进去

解压
tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /usr/local/develop/
改名
mv /usr/local/develop/jdk1.8.0_191 /usr/local/develop/jdk8
配置JAVA_HOME
系统环境
vim /etc/profile
到最下面
export JAVA_HOME=/usr/local/develop/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
让环境变量生效
source /etc/profile
java -version 查看jdk版本 至此JDK安装完成
安装Maven
注意Maven和JDK还是有关系的最好安装你自己本地对应JDK版本常用的
Maven – Download Apache Maven
https://maven.apache.org/download.cgi


解压
tar -zxvf apache-maven-3.9.7-bin.tar.gz
vim /etc/profile
在最后面追加
export MAVEN_HOME=/usr/local/develop/apache-maven-3.9.7
export PATH=${PATH}:${MAVEN_HOME}/bin
使环境变量生效
source /etc/profile
mvn -v

安装Nodejs环境

解压
tar -zxvf node-v20.14.0-linux-x64.tar.gz
vim /etc/profile
在最后面追加
export NODE_HOME=/usr/local/develop/node-v20.14.0-linux-x64
export PATH=$PATH:${NODE_HOME}/bin
使环境变量生效
source /etc/profile
node -v 原因是系统版本太久了 怎么办呢

下载了个16的版本试试

tar -xvf node-v16.20.2-linux-x64.tar.xz

yum install xz(如果上面没报错这个不需要 可能是我命令敲错了)
vim /etc/profile
export NODE_HOME=/usr/local/develop/node-v16.20.2-linux-x64
export PATH=${PATH}:${NODE_HOME}/bin
source /etc/profile
![]()
其实不需要这样
将三个包拖进去之后 可以用dockerfile构建

- FROM jenkins/jenkins:2.346.1-lts
-
- USER root
-
- # 安装JDK
- COPY jdk-8u191-linux-x64.tar.gz /tmp/
- RUN mkdir -p /usr/local/jdk8 && \
- tar -xzf /tmp/jdk-8u191-linux-x64.tar.gz -C /usr/local/jdk8 --strip-components=1 && \
- rm /tmp/jdk-8u191-linux-x64.tar.gz
-
- ENV JAVA_HOME /usr/local/jdk8
- ENV PATH $PATH:$JAVA_HOME/bin
-
- # 安装Maven
- COPY apache-maven-3.9.7-bin.tar.gz /tmp/
- RUN mkdir -p /usr/local/apache-maven && \
- tar -xzf /tmp/apache-maven-3.9.7-bin.tar.gz -C /usr/local/apache-maven --strip-components=1 && \
- rm /tmp/apache-maven-3.9.7-bin.tar.gz
-
- ENV MAVEN_HOME /usr/local/apache-maven
- ENV PATH $PATH:$MAVEN_HOME/bin
-
- # 安装xz工具
- RUN apt-get update && apt-get install -y xz-utils
-
- # 安装Node.js
- COPY node-v16.20.2-linux-x64.tar.xz /tmp/
- RUN mkdir -p /usr/local/node && \
- tar -xJf /tmp/node-v16.20.2-linux-x64.tar.xz -C /usr/local/node --strip-components=1 && \
- rm /tmp/node-v16.20.2-linux-x64.tar.xz
-
- ENV NODE_HOME /usr/local/node
- ENV PATH $PATH:$NODE_HOME/bin
-
- USER jenkins
-
- # 暴露Jenkins端口
- EXPOSE 8080
- EXPOSE 50000
在dockerfile所在目录执行
docker build -t hrui-jenkins:2.346.1-lts .

docker run -d \
-u root \
--privileged \
--name jenkins \
--restart=always \
-v /usr/local/develop/docker/jenkins/home:/var/jenkins_home \
-v /usr/local/develop/docker/jenkins/logs:/var/jenkins_home/logs \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime:ro \
-p 8080:8080 \
-p 50000:50000 \
hrui-jenkins:2.346.1-lts

docker exec -it jenkins /bin/bash
# 检查 JDK
java -version
# 检查 Maven
mvn -version
# 检查 Node.js
node -v
npm -v
exit

可以通过docker logs 容器名 查看日志
如果你计划在Jenkins中使用分布式构建,并且需要添加多个代理节点,那么你需要开放端口50000,以便这些代理节点能够连接到Jenkins主服务器。如果你只打算在单个节点上运行Jenkins(不使用代理节点),那么可以选择不开放这个端口。
8080端口:用于访问Jenkins Web界面。
我的nginx也是通过docker安装的

- #server {
- # listen 80;
- # server_name xxx.xxx.xxx;
-
- #charset koi8-r;
-
- #access_log logs/host.access.log main;
-
- # location / {
- # root /etc/nginx/ssl;
- # index index.html index.htm;
- # }
- #}
docker restart nginx
certbot certonly --webroot -w /usr/local/develop/docker/nginx/ssl -d 你的域名
注释掉 添加https

/sbin/ip route|awk '/default/ { print $3 }' 查看宿主机ip docker没学好 可以用网络连通

- server {
- listen 443 ssl;
- server_name xxx.xxx.xxx;
-
- ssl_certificate /etc/letsencrypt/live/xxx.xxx.xxx/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/xxx.xxx.xxx/privkey.pem;
-
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 5m;
-
- ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!eNULL:!MD5:!ADH:!RC4';
- ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
- ssl_prefer_server_ciphers on;
-
- location / {
- # 代理到宿主机8080端口
- proxy_pass http://xxx.xxx.xxx:8080;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
-
- # 处理长时间运行的请求
- proxy_connect_timeout 3600;
- proxy_send_timeout 3600;
- proxy_read_timeout 3600;
- send_timeout 3600;
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
docker restart nginx
尝试https访问
失败
直接删除镜像

怀疑是宿主机和内部网络没有连通
创建网桥的方式
docker network create jenkins-network
让两个容器实例在同一个网桥内
docker run -d \
-u root \
--privileged \
--name jenkins \
--restart=always \
--network jenkins-network \
-v /usr/local/develop/docker/jenkins/home:/var/jenkins_home \
-v /usr/local/develop/docker/jenkins/logs:/var/jenkins_home/logs \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime:ro \
-p 8080:8080 \
-p 50000:50000 \
hrui-jenkins:2.346.1-lts
docker run -d -p 80:80 -p 443:443 --name nginx \
--network jenkins-network \
-v /usr/local/develop/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/develop/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/local/develop/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/develop/docker/nginx/logs:/var/log/nginx \
-v /usr/local/develop/docker/nginx/ssl:/etc/nginx/ssl \
-v /etc/letsencrypt:/etc/letsencrypt \
--restart always \
nginx
重新配置https
- upstream jenkins {
- keepalive 32; # keepalive connections
- server jenkins:8080; # 使用Jenkins容器名称和端口
- }
-
- # Required for Jenkins websocket agents
- map $http_upgrade $connection_upgrade {
- default upgrade;
- '' close;
- }
-
- server {
- listen 443 ssl;
- server_name xxx.xxx.xxx;
-
- ssl_certificate /etc/letsencrypt/live/xxx.xxx.xxx/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/xxx.xxx.xxx/privkey.pem;
-
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 5m;
-
- ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!eNULL:!MD5:!ADH:!RC4';
- ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
- ssl_prefer_server_ciphers on;
-
- access_log /var/log/nginx/jenkins.access.log;
- error_log /var/log/nginx/jenkins.error.log;
-
- ignore_invalid_headers off;
-
- location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
- rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
- }
-
- location /userContent {
- root /var/lib/jenkins/;
- if (!-f $request_filename){
- rewrite (.*) /$1 last;
- break;
- }
- sendfile on;
- }
-
- location / {
- sendfile off;
- proxy_pass http://jenkins; # 使用上游块
- proxy_redirect default;
- proxy_http_version 1.1;
-
- # Required for Jenkins websocket agents
- proxy_set_header Connection $connection_upgrade;
- proxy_set_header Upgrade $http_upgrade;
-
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_max_temp_file_size 0;
-
- client_max_body_size 10m;
- client_body_buffer_size 128k;
-
- proxy_connect_timeout 3600;
- proxy_send_timeout 3600;
- proxy_read_timeout 3600;
- send_timeout 3600;
- proxy_request_buffering off; # Required for HTTP CLI commands
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
-
- server {
- listen 80;
- server_name devops.opensdk.xyz;
-
- location / {
- return 301 https://$host$request_uri;
- }
- }


查看里面密码


漂亮 原因是Jenkins版本太旧 插件已经更新 没办法 继续就好

保存并完成

保存并完成\

反正啥插件也装不了
看着难受
docker rm -f jenkins删了

删了 不然还是会保留配置

docker run -d -u root --privileged --name jenkins --restart=always --network jenkins-network -v /usr/local/develop/docker/jenkins/home:/var/jenkins_home -v /usr/local/develop/docker/jenkins/logs:/var/jenkins_home/logs -v /var/run/docker.sock:/var/run/docker.sock -v /etc/localtime:/etc/localtime:ro -p 8080:8080 -p 50000:50000 hrui-jenkins:2.346.1-lts
重新开始



看样子也不行 重删 继续重来
dockerfile修改

docker rm -f jenkins 删除原来的
删除镜像
docker rmi id
docker build -t hrui-jenkins:2.452.2-lts .
或者 docker build -t hrui-jenkins:2.452.2-lts -f /path/to/your/dockerfile/Dockerfile .
docker run -d \
-u root \
--privileged \
--name jenkins \
--restart=always \
--network jenkins-network \
-v /usr/local/develop/docker/jenkins/home:/var/jenkins_home \
-v /usr/local/develop/docker/jenkins/logs:/var/jenkins_home/logs \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime:ro \
-p 8080:8080 \
-p 50000:50000 \
hrui-jenkins:2.452.2-lts




这个配置可能是为了Docker in Docker


安装完成之后再装一个

等待完成
docker restart jenkins






/var/run/docker.sock 是 Docker 守护进程(daemon)在 Unix 系统上的默认通信套接字。它是一个文件,用于客户端与 Docker 守护进程之间的通信。通过将这个套接字挂载到容器中,可以使容器内的 Docker 客户端命令与宿主机上的 Docker 守护进程进行通信。
这样容器内就可以使用docker



流水线的意思


还可以写sh 脚本 例如 sh "npm -v"

可以安装JDK Maven

在流水线中也可以配置环境



