Docker Jenkins(改错版本)

06-23 1554阅读

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从代码仓库拉取代码之后  就是帮我们做了这些事情,好比你写了一个脚本去完成这些事

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

因为JenKin需要自己打包,因此前端项目需要Node环境,Java需要JDK环境,PHP需要PHP的环境

试想,你在打包前端项目,打包后端项目时候,自己电脑是不是需要这样环境,一样道理

下面就以这个前端项目为例

VitePress+Docker+jenkins构建个人网站-CSDN博客

Docker Nginx-CSDN博客

将项目上传到gitee之后,让该项目自动部署

在这个例子中我们使用Docker来拉取Node环境,因此JenKins需要内嵌Docker

而本身JenKins是java写的,因此还需要Docker拉取JDK环境

这里由于自己比较菜,Docker不是很了解  因此选择用Docker安装Jenkins选用宿主机上安装JDK和Node环境的方式

JenKins官网JenkinsJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their softwareDocker Jenkins(改错版本)https://www.jenkins.io/

JenKins中文官网

JenkinsJenkins 是一个开源自动化服务器Docker Jenkins(改错版本)https://www.jenkins.io/zh/

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)Docker Jenkins(改错版本)

安装JDK

mkdir /usr/local/develop

cd /usr/local/develop

把JDK拖进去

Docker Jenkins(改错版本)

解压

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 MavenDocker Jenkins(改错版本)https://maven.apache.org/download.cgi

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

解压

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

 Docker Jenkins(改错版本)

安装Nodejs环境

Index of /dist/v20.14.0/

Docker Jenkins(改错版本)

解压

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                     原因是系统版本太久了  怎么办呢

Docker Jenkins(改错版本)

Node.js — Download Node.js®Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.Docker Jenkins(改错版本)https://nodejs.org/en/download/source-code

下载了个16的版本试试

Docker Jenkins(改错版本)

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

 

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

其实不需要这样  

将三个包拖进去之后  可以用dockerfile构建

Docker Jenkins(改错版本)

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 Jenkins(改错版本)

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 Jenkins(改错版本)

docker exec -it jenkins /bin/bash

# 检查 JDK

java -version

# 检查 Maven

mvn -version

# 检查 Node.js

node -v

npm -v

exit
Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

可以通过docker logs 容器名   查看日志

是否需要开放端口50000

如果你计划在Jenkins中使用分布式构建,并且需要添加多个代理节点,那么你需要开放端口50000,以便这些代理节点能够连接到Jenkins主服务器。如果你只打算在单个节点上运行Jenkins(不使用代理节点),那么可以选择不开放这个端口。

8080端口:用于访问Jenkins Web界面。

我的nginx也是通过docker安装的

Docker Nginx-CSDN博客

Docker Jenkins(改错版本)

    #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

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

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 Jenkins(改错版本)

怀疑是宿主机和内部网络没有连通

创建网桥的方式

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;
  }
}

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

查看里面密码

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

保存并完成

Docker Jenkins(改错版本)

保存并完成\Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

反正啥插件也装不了

看着难受

docker rm -f jenkins删了

Docker Jenkins(改错版本)

删了  不然还是会保留配置

Docker 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

重新开始


Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

看样子也不行   重删  继续重来

dockerfile修改

Docker Jenkins(改错版本)

 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 Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

安装完成之后再装一个

Docker Jenkins(改错版本)

等待完成

docker restart jenkins

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

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

这样容器内就可以使用docker

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

流水线的意思

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

可以安装JDK  Maven

Docker Jenkins(改错版本)

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

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

Docker Jenkins(改错版本)

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]