配置详细的Jenkins,并进行CICD

前言

最近项目需要进行CICD部署项目,

编写脚本启动Jenkins

Linux 编写sh脚本,直接启动脚本,去查看服务器是否正在运行Jenkins.war,如果没有启动jenkins.war就启动,如果启动了就kill 掉重新启动jenkins.war,然后并提供怎么启动这个脚本的命令。

#!/bin/bash
# 检查Jenkins是否运行
if ! pgrep -f jenkins.war > /dev/null; then
  # 没有运行,启动Jenkins
  nohup java -jar /path/to/jenkins.war > /dev/null 2>&1 &
  echo "Jenkins started"
else
  # 正在运行,kill掉Jenkins进程
  pkill -f jenkins.war
  # 等待Jenkins停止
  while pgrep -f jenkins.war > /dev/null; do sleep 1; done
  # 重新启动Jenkins
  nohup java -jar /path/to/jenkins.war > /dev/null 2>&1 &  
  echo "Jenkins restarted"
fi

要运行这个脚本,使其可执行后直接执行:

chmod +x jenkins.sh
./jenkins.sh

或者不需要使可执行,用bash解释器执行:

bash jenkins.sh

对脚本进行优化,指定Jenkins的安装目录并记录日志:

#!/bin/bash
# Jenkins安装目录
JENKINS_HOME=/usr/local/jenkins
# Jenkins日志文件
LOG_FILE=$JENKINS_HOME/jenkins.log
# 检查Jenkins是否运行
if ! pgrep -f jenkins.war > /dev/null; then
  # 启动Jenkins,日志输出到指定文件
  nohup java -jar $JENKINS_HOME/jenkins.war > $LOG_FILE 2>&1 &
  echo "Jenkins started" >> $LOG_FILE
else
  # kill旧进程
  pkill -f jenkins.war
  # 等待进程结束
  while pgrep -f jenkins.war > /dev/null; do sleep 1; done  
  # 重新启动,日志写入指定文件  
  nohup java -jar $JENKINS_HOME/jenkins.war > $LOG_FILE 2>&1 &
  echo "Jenkins restarted" >> $LOG_FILE
fi

目前Jenkins已经安装好了,我想从Git(http://192.167.154.193:4567/aaaaaaaa/after_ssssssss.git)上面获取代码,并进行构建发送到服务器134.341.312.343上面,需要免密发送,然后需要使用流水线,流水线先看看服务器上面是否有此jar包,如果没有就直接发送,如果有就开始查看是否启动,启动中直接kill掉,并进行通过年月日进行备份到当前目录,如果发送当前版本没有启动成功,再进行把上面的备份的jar包重新改为jar包,并进行启动,把Jenkins包改名为错误的.jar包,请提供详细的配置步骤和pipline的脚本

node {
  stage('Checkout') {
    git url: 'http://192.167.143.265:4567/fffg-vgfdfgdf/after_dddd.git' 
  }
  stage('Build') {
    // 这里编译打包生成jar包
  }
  stage('Deploy') {
    sshPublisher(
      continueOnError: false, 
      failOnError: true, 
      publishers: [
        sshPublisherDesc(
          configName: 'ssh_server',  
          transfers: [
            sshTransfer(
              sourceFiles: 'target/*.jar',
              removePrefix: 'target/',
              remoteDirectory: '/app/jar'
            )
          ], 
          usePromotionTimestamp: false, 
          useWorkspaceInPromotion: false,
          verbose: true
        )
      ]
    )
    // 检查远程服务器是否已存在jar包
    def remoteFileExists = sh(
      script: "ssh ubuntu@134.4545.3454.44545 test -f /app/jar/app.jar",
      returnStatus: true
    )
    if (remoteFileExists == 0) {
      // 文件存在,进行重启  
      sh "ssh ubuntu@134.4545.3454.44545 systemctl restart app.service"
    } else {
      // 文件不存在,首次部署 
      sh "ssh ubuntu@134.4545.3454.44545 systemctl start app.service" 
    }
  }
}

Maven构建Spring Boot项目并部署的完整Jenkinsfile Pipeline脚本示例:

pipeline {
  agent any
  tools {
    maven 'Maven 3.6.1'
  }
  stages {
    stage('Build') {
      steps {
        sh 'mvn clean package'
      }
    }
    stage('Test') {
      steps {
        sh 'mvn test' 
      }
    }
    stage('Deliver') {
      steps { 
        script {
          def server = '192.168.1.100'
          def appName = 'myapp'
          // 检查旧版本是否运行
          sh "ssh $server ps -ef | grep ${appName} | grep -v grep"
          def isRunning = env.EXIT_CODE == 0
          if (isRunning) {
            echo "$appName is running on $server, stopping it..."
            // 停止旧版本
            sh "ssh $server pkill -f ${appName}"
          }
          // 上传并备份新版本
          sh "scp target/${appName}-*.jar $server:/opt/apps"
          sh "ssh $server mv /opt/apps/${appName}.jar /opt/apps/${appName}-\$(date +%Y%m%d).jar"
          // 启动新版本 
          try {
            sh "ssh $server nohup java -jar /opt/apps/${appName}-*.jar > /opt/apps/${appName}.log 2>&1 &"
            echo "Started new version successfully."  
          } catch (exc) {
            // 新版本启动失败,回滚 
            echo "Failed to start new version, rolling back..."
            sh "ssh $server mv /opt/apps/${appName}-*.jar /opt/apps/${appName}-failed-\$(date +%Y%m%d).jar" 
            sh "ssh $server mv /opt/apps/${appName}-\$(date +%Y%m%d).jar ${appName}.jar"
            sh "ssh $server nohup java -jar /opt/apps/${appName}.jar > /opt/apps/${appName}.log 2>&1 &"
            throw exc
          }
        }
      }
    }
  }
}
配置详细的Jenkins,并进行CICD

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

滚动到顶部