• Docker Jenkins(改错版本)


    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博客

    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 softwareicon-default.png?t=N7T8https://www.jenkins.io/

    JenKins中文官网

    JenkinsJenkins 是一个开源自动化服务器icon-default.png?t=N7T8https://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 Mavenicon-default.png?t=N7T8https://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环境

    Index of /dist/v20.14.0/

    解压

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

    Node.js — Download Node.js®Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.icon-default.png?t=N7T8https://nodejs.org/en/download/source-code

    下载了个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构建

    1. FROM jenkins/jenkins:2.346.1-lts
    2. USER root
    3. # 安装JDK
    4. COPY jdk-8u191-linux-x64.tar.gz /tmp/
    5. RUN mkdir -p /usr/local/jdk8 && \
    6. tar -xzf /tmp/jdk-8u191-linux-x64.tar.gz -C /usr/local/jdk8 --strip-components=1 && \
    7. rm /tmp/jdk-8u191-linux-x64.tar.gz
    8. ENV JAVA_HOME /usr/local/jdk8
    9. ENV PATH $PATH:$JAVA_HOME/bin
    10. # 安装Maven
    11. COPY apache-maven-3.9.7-bin.tar.gz /tmp/
    12. RUN mkdir -p /usr/local/apache-maven && \
    13. tar -xzf /tmp/apache-maven-3.9.7-bin.tar.gz -C /usr/local/apache-maven --strip-components=1 && \
    14. rm /tmp/apache-maven-3.9.7-bin.tar.gz
    15. ENV MAVEN_HOME /usr/local/apache-maven
    16. ENV PATH $PATH:$MAVEN_HOME/bin
    17. # 安装xz工具
    18. RUN apt-get update && apt-get install -y xz-utils
    19. # 安装Node.js
    20. COPY node-v16.20.2-linux-x64.tar.xz /tmp/
    21. RUN mkdir -p /usr/local/node && \
    22. tar -xJf /tmp/node-v16.20.2-linux-x64.tar.xz -C /usr/local/node --strip-components=1 && \
    23. rm /tmp/node-v16.20.2-linux-x64.tar.xz
    24. ENV NODE_HOME /usr/local/node
    25. ENV PATH $PATH:$NODE_HOME/bin
    26. USER jenkins
    27. # 暴露Jenkins端口
    28. EXPOSE 8080
    29. 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 容器名   查看日志

    是否需要开放端口50000

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

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

    我的nginx也是通过docker安装的

    Docker Nginx-CSDN博客

    1. #server {
    2. # listen 80;
    3. # server_name xxx.xxx.xxx;
    4. #charset koi8-r;
    5. #access_log logs/host.access.log main;
    6. # location / {
    7. # root /etc/nginx/ssl;
    8. # index index.html index.htm;
    9. # }
    10. #}

    docker restart nginx

    certbot certonly --webroot -w /usr/local/develop/docker/nginx/ssl -d 你的域名

    注释掉  添加https

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

    1. server {
    2. listen 443 ssl;
    3. server_name xxx.xxx.xxx;
    4. ssl_certificate /etc/letsencrypt/live/xxx.xxx.xxx/fullchain.pem;
    5. ssl_certificate_key /etc/letsencrypt/live/xxx.xxx.xxx/privkey.pem;
    6. ssl_session_cache shared:SSL:1m;
    7. ssl_session_timeout 5m;
    8. ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!eNULL:!MD5:!ADH:!RC4';
    9. ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    10. ssl_prefer_server_ciphers on;
    11. location / {
    12. # 代理到宿主机8080端口
    13. proxy_pass http://xxx.xxx.xxx:8080;
    14. proxy_set_header Host $host;
    15. proxy_set_header X-Real-IP $remote_addr;
    16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    17. proxy_set_header X-Forwarded-Proto $scheme;
    18. # 处理长时间运行的请求
    19. proxy_connect_timeout 3600;
    20. proxy_send_timeout 3600;
    21. proxy_read_timeout 3600;
    22. send_timeout 3600;
    23. }
    24. error_page 500 502 503 504 /50x.html;
    25. location = /50x.html {
    26. root html;
    27. }
    28. }

    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

    1. upstream jenkins {
    2. keepalive 32; # keepalive connections
    3. server jenkins:8080; # 使用Jenkins容器名称和端口
    4. }
    5. # Required for Jenkins websocket agents
    6. map $http_upgrade $connection_upgrade {
    7. default upgrade;
    8. '' close;
    9. }
    10. server {
    11. listen 443 ssl;
    12. server_name xxx.xxx.xxx;
    13. ssl_certificate /etc/letsencrypt/live/xxx.xxx.xxx/fullchain.pem;
    14. ssl_certificate_key /etc/letsencrypt/live/xxx.xxx.xxx/privkey.pem;
    15. ssl_session_cache shared:SSL:1m;
    16. ssl_session_timeout 5m;
    17. ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!eNULL:!MD5:!ADH:!RC4';
    18. ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    19. ssl_prefer_server_ciphers on;
    20. access_log /var/log/nginx/jenkins.access.log;
    21. error_log /var/log/nginx/jenkins.error.log;
    22. ignore_invalid_headers off;
    23. location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
    24. rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
    25. }
    26. location /userContent {
    27. root /var/lib/jenkins/;
    28. if (!-f $request_filename){
    29. rewrite (.*) /$1 last;
    30. break;
    31. }
    32. sendfile on;
    33. }
    34. location / {
    35. sendfile off;
    36. proxy_pass http://jenkins; # 使用上游块
    37. proxy_redirect default;
    38. proxy_http_version 1.1;
    39. # Required for Jenkins websocket agents
    40. proxy_set_header Connection $connection_upgrade;
    41. proxy_set_header Upgrade $http_upgrade;
    42. proxy_set_header Host $http_host;
    43. proxy_set_header X-Real-IP $remote_addr;
    44. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    45. proxy_set_header X-Forwarded-Proto $scheme;
    46. proxy_max_temp_file_size 0;
    47. client_max_body_size 10m;
    48. client_body_buffer_size 128k;
    49. proxy_connect_timeout 3600;
    50. proxy_send_timeout 3600;
    51. proxy_read_timeout 3600;
    52. send_timeout 3600;
    53. proxy_request_buffering off; # Required for HTTP CLI commands
    54. }
    55. error_page 500 502 503 504 /50x.html;
    56. location = /50x.html {
    57. root html;
    58. }
    59. }
    60. server {
    61. listen 80;
    62. server_name devops.opensdk.xyz;
    63. location / {
    64. return 301 https://$host$request_uri;
    65. }
    66. }

    查看里面密码

    漂亮   原因是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

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

  • 相关阅读:
    每天五分钟机器学习:神经网络和支持向量机的基础——感知机模型
    Python中Pandas常用函数及案例详解
    经典伴读_GOF设计模式_行为模式(下)
    前端学习案例-viewer.js实现预览效果
    读取不同格式文件中的内容(xlsx,csv,txt,npz,yaml)
    网络编程一些问题总结
    Java案例找素数(三种方法)
    【微服务】Sentinel 适配网关进行流量控制
    蓝桥杯嵌入式第二篇配置按键
    你还不知道吗?新一代隐私保护技术已被应用到笔记本电脑中!
  • 原文地址:https://blog.csdn.net/tiantiantbtb/article/details/139711912