Jenkins部署与基础配置(1)

news2024/11/28 6:28:51

5 Jenkins 部署与基础配置

IP地址角色
172.18.8.19jenkins-master
172.18.8.29jenkins-node1
172.18.8.39jenkins-node2
[root@jenkins-master ~]# tail -n1 .bashrc
PS1='\[\e[1;32m\][\[\e[0m\]\[\e[1;32m\]\[\e[1;33m\]\u\[\e[34m\]@\h\[\e[1;31m\] \w\[\e[1;32m\]]\[\e[0m\]# '
[root@jenkins-master ~]#

5.1 配置 java 环境并部署 jenkins

5.1.1 java 环境配置

tar zxvf jdk-8u291-linux-x64.tar.gz -C /usr/local/src
ln -sv /usr/local/src/jdk1.8.0_291/ /usr/local/jdk
ln -sv /usr/local/jdk/bin/java /usr/bin/

vim /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/local/jdk 
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar


[root@jenkins-master ~]# source /etc/profile.d/tomcat.sh
[root@jenkins-master ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@jenkins-master ~]# 

5.1.2 启动 jenkins

https://jenkins.io/zh/
5.1.2.1 通过 jar 包直接启动 jenkins
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.289.3/jenkins.war

java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="172.18.8.216" \ 
-jar jenkins.war &

# 访问
http://172.18.8.216:8080
5.1.2.2 把 jenkins 放到 tomcat 启动
mkdir /apps
cd  /apps
tar zxvf apache-tomcat-8.5.69.tar.gz
mv jenkins.war apache-tomcat-8.5.69/webapps
cd /apps/apache-tomcat-8.5.69
./bin/catalina.sh run

# 访问
http://172.18.8.216:8080/jenkins/
5.1.2.3 deb 包安装 jenkins 配置
# Ubuntu
https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/
# 下载 jenkins 安装包
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.289.3_all.deb

# 安装 jenkins
apt-cache madison daemon
apt install daemon
dpkg  -c  jenkins_2.289.3_all.deb
dpkg  -i  jenkins_2.289.3_all.deb

# Ubuntu 配置文件
[root@jenkins-master ~]# grep -Ev "#|^$" /etc/default/jenkins
NAME=jenkins
JAVA_ARGS="-Djava.awt.headless=true"
PIDFILE=/var/run/$NAME/$NAME.pid
JENKINS_USER=root
JENKINS_GROUP=root
JENKINS_WAR=/usr/share/$NAME/$NAME.war
JENKINS_HOME=/var/lib/$NAME
RUN_STANDALONE=true
JENKINS_LOG=/var/log/$NAME/$NAME.log
JENKINS_ENABLE_ACCESS_LOG="no"
MAXOPENFILES=8192
HTTP_PORT=8080
PREFIX=/$NAME
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"
[root@jenkins-master ~]# 
[root@jenkins-master ~]# systemctl restart jenkins.service 
[root@jenkins-master ~]# systemctl status jenkins.service 
● jenkins.service - LSB: Start Jenkins at boot time
     Loaded: loaded (/etc/init.d/jenkins; generated)
     Active: active (exited) since Sun 2021-08-08 17:06:26 CST; 7s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 3887 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

8月 08 17:06:25 jenkins systemd[1]: jenkins.service: Succeeded.
8月 08 17:06:25 jenkins systemd[1]: Stopped LSB: Start Jenkins at boot time.
8月 08 17:06:25 jenkins systemd[1]: Starting LSB: Start Jenkins at boot time...
8月 08 17:06:25 jenkins jenkins[3887]: Correct java version found
8月 08 17:06:25 jenkins jenkins[3887]:  * Starting Jenkins Automation Server jenkins
8月 08 17:06:25 jenkins su[3920]: (to root) root on none
8月 08 17:06:25 jenkins su[3920]: pam_unix(su-l:session): session opened for user root by (uid=0)
8月 08 17:06:25 jenkins su[3920]: pam_unix(su-l:session): session closed for user root
8月 08 17:06:26 jenkins jenkins[3887]:    ...done.
8月 08 17:06:26 jenkins systemd[1]: Started LSB: Start Jenkins at boot time.
[root@jenkins ~]# 

# 访问 
http://172.18.8.19:8080

# 登录密码
[root@jenkins-master ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
5efd0ff49fb144f0a163bd568a47d833
[root@jenkins-master ~]# 
5.1.2.4 rpm 包安装 jenkins 配置
# Centos
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/

grep -Ev "#|^$" /etc/sysconfig/jenkins
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD="" 
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="172.18.8.216" \ 
"

JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT="" 
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20" 
JENKINS_ARGS=""

# 可选启动参数
JENKINS_JAVA_OPTIONS="--server -Xms1g -Xmx1g -Xss512k -Xmn1g
-XX:CMSInitiatingOccupancyFraction=65
-XX:+UseFastAccessorMethods 
-XX:+AggressiveOpts -XX:+UseBiasedLocking
-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 
-XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2 
-XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5
-XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -Djava.awt.headless=true
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname="172.18.8.216"

5.1.3 访问 Jenkins 页面:

在这里插入图片描述

5.1.4 选择安装 jenkins 插件

解决插件安装慢的解决方式,通过 Nginx 进行 rewrite 或者反向代理,如下:

127.0.0.1 updates.jenkins-ci.org 

location /download/plugins { 
    proxy_set_header Host mirrors.tuna.tsinghua.edu.cn;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    rewrite /download/plugins(.*) /jenkins/plugins/$1 break; 
    proxy_pass http://mirrors.tuna.tsinghua.edu.cn; 
}

在这里插入图片描述

如果现实 jenkins 已离线,将以下文件中的更新检查地址改成国内清华大学地址,然后重启 jenkins 即可:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

# cat /var/lib/jenkins/hudson.model.UpdateCenter.xml 
<?xml version='1.1' encoding='UTF-8'?> 
<sites> 
    <site> 
        <id>default</id>
        <url>https://updates.jenkins.io/update-center.json</url> 
    </site>

5.1.5 插件安装过程中

# 插件下载地址
http://updates.jenkins-ci.org/download/plugins/ 

插件安装过程中。。,如果因为某种原因导致有有安装失败的插件,没有关系,可以后期再单独安装,

在这里插入图片描述

5.1.6 创建 jenkins 管理员

在这里插入图片描述

5.1.7 配置 jenkins URL

在这里插入图片描述

5.1.8 配置完成并登陆 jenkins

在这里插入图片描述

在这里插入图片描述

5.1.9 jenkins 插件管理及安装

5.1.9.1 插件安装目录

# 插件下载地址
http://updates.jenkins-ci.org/download/plugins/

ll .jenkins/plugins/

5.1.9.2 安装插件

搜索需要 gitlab 的插件并安装 gitlab 和 Blue Ocean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

将 jenkins 启动用户(jenkins-master、jenkins-slave1、jenkins-slave2)的公钥放到 gitlab 上,这样 jenkins 就可以登录 gitlab 已非交互方式进行克隆代码了,克隆要用 ssh 协议,而不是用 http 协议

在这里插入图片描述

新建一个任务

在这里插入图片描述

方法1:在源码管理中选择 git

在这里插入图片描述

提示无法连接仓库,此时需要将 jenkins 的私钥添加到 jenkins 的配置中

在这里插入图片描述

选择添加的私钥,没有提示无法连接仓库,表示正常

在这里插入图片描述

构建后登录 Jenkins Master 查看

[root@jenkins-master /var/lib/jenkins/workspace]# ll
total 24
drwxr-xr-x  6 root    root    4096 Aug 12 01:57  ./
drwxr-xr-x 14 jenkins jenkins 4096 Aug 12 01:58  ../
drwxr-xr-x  3 root    root    4096 Aug 10 12:35  baichuan_web_app1/
drwxr-xr-x  2 root    root    4096 Aug 12 01:43 'baichuan_web_app1@tmp'/
drwxr-xr-x  3 root    root    4096 Aug 12 01:57  baichuan_web_app2/
drwxr-xr-x  2 root    root    4096 Aug 12 01:57 'baichuan_web_app2@tmp'/
[root@jenkins-master /var/lib/jenkins/workspace]# cat baichuan_web_app1/index.html
<h1>V111111111111111</h1>
<h1>V222222222222222</h1>
<h1>V333333333333333</h1>
<h1>V444444444444444</h1>
<h1>V555555555555555</h1>
<h1>V666666666666666</h1>
[root@jenkins-master /var/lib/jenkins/workspace]# cat baichuan_web_app2/index.html
<h1>v1111111111111-app2</h1>
[root@jenkins-master /var/lib/jenkins/workspace]#

方法2:自定义脚本

[root@jenkins-master ~]# mkdir -p /data/gitdata/baichuan
[root@jenkins-master ~]# cat /data/script/baichuan-app1-deploy.sh
#!/bin/bash
#
cd /data/gitdata/baichuan && rm -rf app1
git clone git@172.18.8.9:baichuan/app1.git
[root@jenkins-master ~]#

在这里插入图片描述

构建后登录 Jenkins Master 查看结果

[root@jenkins-master ~]# ls /data/gitdata/baichuan/
app1
[root@jenkins-master ~]# cat /data/gitdata/baichuan/app1/index.html
<h1>V111111111111111</h1>
<h1>V222222222222222</h1>
<h1>V333333333333333</h1>
<h1>V444444444444444</h1>
<h1>V555555555555555</h1>
<h1>V666666666666666</h1>
<h1>V777777777777777</h1>
[root@jenkins-master ~]#

发布项目

首先做免密登录

# 将 Jenkins Master 的公钥拷贝到三台web机器 172.18.8.49  172.18.8.59 172.18.8.69 的 song 目录下

# Jenkins-master 上操作
[root@jenkins-master ~]# ssh-copy-id song@172.18.8.49
[root@jenkins-master ~]# ssh-copy-id song@172.18.8.59
[root@jenkins-master ~]# ssh-copy-id song@172.18.8.69

# 将 Jenkins Master 的公钥拷贝到两台Haproxy机器 
[root@jenkins-master ~]# ssh-copy-id root@172.18.8.79
[root@jenkins-master ~]# ssh-copy-id root@172.18.8.89

# 验证免密登录是否可用
[root@jenkins-master ~]# ssh song@172.18.8.49 "whoami;pwd"
song
/home/song
[root@jenkins-master ~]# ssh song@172.18.8.59 "whoami;pwd"
song
/home/song
[root@jenkins-master ~]# ssh song@172.18.8.69 "whoami;pwd"
song
/home/song
[root@jenkins-master ~]#

# 普通用户使用 sudo 的权限
root@web1:~# grep song /etc/sudoers
song	ALL=(ALL:ALL) NOPASSWD:ALL
root@web1:~#

root@web2:~# grep song /etc/sudoers
song	ALL=(ALL:ALL) NOPASSWD:ALL
root@web2:~#

root@web3:~# grep song /etc/sudoers
song	ALL=(ALL:ALL) NOPASSWD:ALL
root@web3:~#

编写脚本

[root@jenkins-master ~]# cat /data/script/baichuan-app1-deploy.sh
#!/bin/bash
#
ipList="172.18.8.49 172.18.8.59 172.18.8.69"
fileName="app1.tar.gz"
remoteDir="/data/tomcat/tomcat_appdir/"
remoteApp="/data/tomcat/tomcat_webapps/myapp"

cd /data/gitdata/baichuan && rm -rf app1
git clone git@172.18.8.9:baichuan/app1.git

cd /data/gitdata/baichuan/app1
tar czvf $fileName ./index.html
for ip in $ipList
do
  rsync -aP $fileName song@$ip:$remoteDir
  if [ $? -ne 0 ];then
    exit 1
  fi
  ssh song@$ip "sudo systemctl stop tomcat"
  ssh song@$ip "rm -rf $remoteApp && mkdir -p $remoteApp && cd $remoteDir && tar zxvf $fileName -C $remoteApp"
  ssh song@$ip "sudo systemctl start tomcat"
done
[root@jenkins-master ~]#

构建结果
在这里插入图片描述

分布式构建

Jenkins-node1

# apt -y install openjdk-8-jdk 或者编译安装

tar zxvf jdk-8u291-linux-x64.tar.gz -C /usr/local/src
ln -sv /usr/local/src/jdk1.8.0_291/ /usr/local/jdk
ln -sv /usr/local/jdk/bin/java /usr/bin/

vim /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/local/jdk 
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

[root@jenkins-slave1 ~]# source /etc/profile.d/tomcat.sh
[root@jenkins-slave1 ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@jenkins-slave1 ~]# mkdir -p  /var/lib/jenkins/
[root@jenkins-slave1 ~]# ssh-keygen
[root@jenkins-slave1 ~]# ssh-copy-id song@172.18.8.49
[root@jenkins-slave1 ~]# ssh-copy-id song@172.18.8.59
[root@jenkins-slave1 ~]# ssh-copy-id song@172.18.8.69

# 将 Jenkins Slave1 的公钥拷贝到两台Haproxy机器 
[root@jenkins-slave1 ~]# ssh-copy-id root@172.18.8.79
[root@jenkins-slave1 ~]# ssh-copy-id root@172.18.8.89

Jenkins-node2

tar zxvf jdk-8u291-linux-x64.tar.gz -C /usr/local/src
ln -sv /usr/local/src/jdk1.8.0_291/ /usr/local/jdk
ln -sv /usr/local/jdk/bin/java /usr/bin/

vim /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/local/jdk 
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

[root@jenkins-slave2 ~]# source /etc/profile.d/tomcat.sh
[root@jenkins-slave2 ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@jenkins-slave2 ~]# mkdir -p  /var/lib/jenkins/
[root@jenkins-slave2 ~]# mkdir -p  /var/lib/jenkins/
[root@jenkins-slave2 ~]# ssh-keygen
[root@jenkins-slave2 ~]# ssh-copy-id song@172.18.8.49
[root@jenkins-slave2 ~]# ssh-copy-id song@172.18.8.59
[root@jenkins-slave2 ~]# ssh-copy-id song@172.18.8.69

# 将 Jenkins Slave2 的公钥拷贝到两台Haproxy机器 
[root@jenkins-slave2 ~]# ssh-copy-id root@172.18.8.79
[root@jenkins-slave2 ~]# ssh-copy-id root@172.18.8.89

Dashboard--->Manage Jenkins--->Manage Nodes and Clouds

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看 Jenkins slave1 日志

java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[08/12/21 07:27:12] [SSH] Checking java version of /var/lib/jenkins/jdk/bin/java
Couldn't figure out the Java version of /var/lib/jenkins/jdk/bin/java
bash: /var/lib/jenkins/jdk/bin/java: No such file or directory

[08/12/21 07:27:12] [SSH] Checking java version of java
[08/12/21 07:27:12] [SSH] java -version returned 1.8.0_291.
[08/12/21 07:27:12] [SSH] Starting sftp client.
[08/12/21 07:27:13] [SSH] Copying latest remoting.jar...
[08/12/21 07:27:13] [SSH] Copied 1,502,119 bytes.
Expanded the channel window size to 4MB
# 从 jenkins master 向 jenkins slave 拷贝 jar 包
[08/12/21 07:27:13] [SSH] Starting agent process: cd "/var/lib/jenkins" && java  -jar remoting.jar -workDir /var/lib/jenkins -jar-cache /var/lib/jenkins/remoting/jarCache
Aug 12, 2021 7:27:13 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /var/lib/jenkins/remoting as a remoting work directory
Aug 12, 2021 7:27:13 AM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to /var/lib/jenkins/remoting
<===[JENKINS REMOTING CAPACITY]===>channel started
Remoting version: 4.7
This is a Unix agent
Evacuated stdout
Agent successfully connected and online

pipline

在这里插入图片描述

生成 token

在这里插入图片描述

脚本式

在这里插入图片描述

node("jenkins-slave1") {
    stage("clone 代码"){
        //sh 'rm -rf /var/lib/jenkins/workspace/baichuan_web_pipline_app1_The_script_style/*'
        echo 'clone 代码'
        deleteDir()
        git branch: 'main', credentialsId: '57e7aa52-d7d4-46f1-bd2f-687f5b94323f', url: 'git@172.18.8.9:baichuan/app1.git'
        echo 'clone 代码完成' 
    } 
    stage("代码构建"){
       sh 'cd /var/lib/jenkins/workspace/baichuan_web_pipline_app1_The_script_style/ && tar czvf app1.tar.gz ./index.html'
    }
    stage("代码复制"){
       sh '''localDir="/var/lib/jenkins/workspace/baichuan_web_pipline_app1_The_script_style/"
        remoteDir="/data/tomcat/tomcat_appdir/"
        IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
        for ip in $IPLIST
        do
            cd $localDir && scp app1.tar.gz song@$ip:$remoteDir
        done'''
    }
    stage("停止 tomcat 服务"){
       sh '''IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
       for ip in $IPLIST
       do
        ssh song@$ip "sudo systemctl stop tomcat"
       done'''
       
    } 
    stage("代码部署"){
       sh '''remoteAppDir="/data/tomcat/tomcat_webdir/myapp"
        remoteDir="/data/tomcat/tomcat_appdir/"
        IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
        for ip in $IPLIST
        do
            ssh song@$ip "rm -rf $remoteAppDir && mkdir -p $remoteAppDir && cd $remoteDir && tar xvf app1.tar.gz -C $remoteAppDir"
        done'''
    } 
    stage("启动 tomcat 服务"){
       sh '''IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
       for ip in $IPLIST
       do
        ssh song@$ip "sudo systemctl start tomcat"
       done'''
    }
}

更新到 V11 版本测试

在这里插入图片描述

声明式

在这里插入图片描述

https://www.jenkins.io/zh/doc/book/pipeline/
pipeline { 
    //agent any
    agent { label 'jenkins-slave1' }
    stages {
        stage('clone 代码') { 
            steps { 
                echo 'clone 代码'
       			deleteDir()
       			git branch: 'main', credentialsId: '57e7aa52-d7d4-46f1-bd2f-687f5b94323f', url: 'git@172.18.8.9:baichuan/app1.git'
       			echo 'clone 代码完成' 
            }
        }
        stage('代码构建'){
            steps {
                sh 'cd /var/lib/jenkins/workspace/baichuan_web_pipline_app1_The_statement_style/ && tar czvf  app1.tar.gz ./index.html' 
            }
        }
        stage('代码复制') {
            steps {
                sh '''localDir="/var/lib/jenkins/workspace/baichuan_web_pipline_app1_The_statement_style/"
                remoteDir="/data/tomcat/tomcat_appdir/"
                IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
                for ip in $IPLIST
                do
                    cd $localDir && scp app1.tar.gz song@$ip:$remoteDir
                done'''
            }
        }
        stage("停止 tomcat 服务"){
        	steps {
        		sh '''IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
        		for ip in $IPLIST
        		do
        		    ssh song@$ip "sudo systemctl stop tomcat"
        		done'''
        		}
        }
        stage("代码部署") {
        	steps {
        		sh '''remoteAppDir="/data/tomcat/tomcat_webdir/myapp"
        		remoteDir="/data/tomcat/tomcat_appdir/"
        		IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
        		for ip in $IPLIST
        		do
            	    ssh song@$ip "rm -rf $remoteAppDir && mkdir -p $remoteAppDir && cd $remoteDir && tar xvf app1.tar.gz -C $remoteAppDir"
        		done'''
        		}
        }
        stage("启动 tomcat 服务") {
            agent { label 'jenkins-slave2' }
        	steps {
        		sh '''IPLIST="172.18.8.49 172.18.8.59 172.18.8.69"
       			for ip in $IPLIST
       			do
        			ssh song@$ip "sudo systemctl start tomcat"
       			done'''
        		}
        }
    }
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41968.html

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

相关文章

ISCTF新生赛(引用传递简单社工)

猫和老鼠 反序列化题目&#xff1a; <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0);class mouse { public $v;public function __toString(){echo "Good. You caught the mouse:";include($this->v);}}class cat {public $a;p…

05 Pod:如何理解这个Kubernetes里最核心的概念?

文章目录1 为什么要有pod?2. 为什么Pod 是 Kubernetes 的核心对象&#xff1f;3. 如何用YAML描述Pod?3.1 Pod的基本组成部分3.1.1 最重要的 spec.containers 字段使用3.1.1.1为什么要定义容器启动时要执行的命令&#xff1f;4. 如何使用kubectl 操作Pod?4.1 创建pod4.2 删除…

数据结构与算法之查找算法

数据结构与算法——查找算法 本文将不断更新查找有关算法&#xff0c;由于精力有限&#xff0c;因此本博文将分多次更新&#xff0c;感谢您的关注 文章目录数据结构与算法——查找算法1. 二分法查找&#xff08;折半查找&#xff09;1.1 算法叙述1.2 实例说明2. 插值查找&#…

【ML特征工程】第 8 章 :自动化特征化器:图像特征提取和深度学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

[2022-11-26]神经网络与深度学习第5章 - 循环神经网络(part 2)

contents循环神经网络(part 2) - 梯度爆炸实验写在开头解决方式概览梯度爆炸实验梯度打印函数思考&#xff1a;什么是范数、L2范数、为什么要打印梯度范数复现梯度爆炸现象使用梯度截断解决梯度爆炸问题思考&#xff1a;梯度截断解决梯度爆炸问题的原理&#xff1f;写在最后循环…

搭建MinIO容器

文章目录1 问题背景2 资源准备3 安装Docker服务4 关闭防火墙5 以Docker方式安装MinIO6 访问MinIO1 问题背景 玩一个前后端的项目&#xff0c;需要用到对象存储器&#xff0c;于是使用开源的MinIO。期间以Docker方式搭建遇到某些坑&#xff0c;此处仅以博客的方式记录下来 2 资源…

【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】Simulink的使用介绍以及在本实验中的使用

目录 Simulink的简要介绍 Simulink的使用流程 进入Simulink 进入模型编辑窗口 ​ 建立一个新的文件 根据求需建立模型 对选择的模块进行参数设置 本次课程设计需要使用Simulink做ASK的仿真处理&#xff0c;那么下面就一起学习了解一下Simulink吧&#xff01; Simuli…

全球经济自由度1995-2021最新版绿色金融指数2001-2020

&#xff08;1&#xff09;全球经济自由度指数 1995-2021 1、数据来源&#xff1a;美国传统基金会 2、时间跨度&#xff1a;1995-2021 3、区域范围&#xff1a;全球 4、指标说明&#xff1a; 经济自由度指数&#xff0c;是由《华尔街日报》和美国传统基金会发布的年度报告…

爱站网关键词挖掘工具-长尾关键词挖掘站长工具

长尾词挖掘免费工具&#xff0c;为什么我们要使用长尾词挖掘免费工具&#xff0c;我们只要找准关键词就等于掌握了流量。 关键词可应用于任何平台&#xff1a;不管是网站、短视频、自媒体等&#xff01; 比如说用户A经常看体育领域的内容&#xff0c;平台就会给A打上体育领域标…

LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)

文章目录一、编程题&#xff1a;142. 环形链表 II&#xff08;双指针-快慢指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.进阶&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结…

[附源码]计算机毕业设计springboot班级事务管理论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MQTT协议

1.MQTT基础知识学习 MQTT协议基础知识视频学习资源:太极创客 太极创客的MQTT基础篇博文目录链接:零基础入门学用物联网 – MQTT基础篇 – 目录 备注:建议先学习一下MQTT的基础知识后再学习下面章节部分的内容。 2.MQTT服务器的搭建 MQTT服务器的搭建步骤如下: 使用docker pull…

【vue + echarts】图表自适应缩放(跟随浏览器的窗口缩放,项目侧边栏折叠后的窗口缩放),图表重绘

效果图: 先清楚两个东西,浏览器窗口的缩放和项目侧边栏折叠后窗口的缩放,这两个是不一样的 第一种,浏览器窗口缩放后,当前窗口会放大了或者缩小了,这时会走浏览器缩放的代码部分, 第二种,而项目侧边栏折叠后窗口的缩放,虽然项目里面的窗口缩放了,但是,浏览器的窗口并没有发生…

tACS恢复老年人认知控制能力的EEG功能和DTI结构网络机制

认知控制能力是大多数日常任务中的关键能力&#xff0c;与年龄相关的认知控制能力下降威胁到个人的独立性。作者之前在老年人和年轻人中都发现&#xff0c;经颅交流电刺激&#xff08;tACS&#xff09;可以改善认知控制&#xff0c;在远离受刺激部位和频率之外的神经区域观察到…

使用python玩转二维码!速学速用!⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; Python3◉技能提升系列&#xff1a;https://www.showmeai.tech/tutorials/56 &#x1f4d8; 本文地址&#xff1a;https://showmeai.tech/article-detail/398 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;…

前端开发如何做新手引导

通常&#xff0c;在产品发布新版本或者有新功能上线时&#xff0c;都会开发一个新手引导功能来引导用户了解应用的功能。在前端开发中&#xff0c;如何快速地开发新手引导功能呢&#xff0c;下面介绍几个开箱即用的新手引导组件库。 1&#xff0c;Intro.js Intro.js是一个使用…

外汇天眼:外汇杠杆的“诱惑”到底有多大,为何做外汇的人都那么上瘾?

近些年随着外汇保证金在中国的持续发展&#xff0c;中国的外汇保证金交易就像当初的股票市场一样&#xff0c;从无到有&#xff0c;不断的发展壮大&#xff0c;再加上国内金融市场对外开放步伐加快&#xff0c;在中国国内参与外汇市场的投资者也是连年上升&#xff0c;那么这个…

【EI会议2023】12.20之后ddl

csdn 摘出来上文中的一些ddl ICET 2023(成都 5月12日-5月15日) http://www.icet.net/track9.html 截稿时间2022.12.20 通知录用:2023.1.20 SEGRE 2023(长沙 4月21日-4月23日) http://www.icsegre.org/ 截稿时间2023.2.26 通知录用:2023.4.3 ICIBA 2023(重庆 5月26日-…

全同态加密:GSW

参考文献&#xff1a; Micciancio D, Peikert C. Trapdoors for lattices: Simpler, tighter, faster, smaller[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2012: 700-718.Gentry C, S…

Mysql-解决Truncated incorrect DOUBLE value xxx

问题 出现这种问题一般来说就是多表操作的时候, 使用的字段类型不一致导致的(查询除外),我们来看下真实案例 在hd_user表中parentId是binint类型 而在hd_user_increment_copy1表中parentId是varchar类型, 如果只是查询的话那么是不会报错的,我把查询sql提出了运行是可以的 …