centos8 jenkins 搭建和使用

一、安装jenkins

  1. 直接war包搭建下载地址:https://get.jenkins.io/war-stable/
    下载稳定长期版本

二、jenkins 启动依赖java, 安装java sdk ,好像支持java 11和17版本,21版本不支持会报错

  1. 下载sdk地址,https://www.oracle.com/java/technologies/downloads/#java17
  2. 解压并且添加环境变量
tar -xzf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
在/etc/profile 添加
export JAVA_HOME=/usr/local/jdk-17.0.8
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile
java -version

三、启动jenkins

1.启动命令
java -jar jenkins.war --httpPort=9090

启动完成后,会生成首次登录的秘钥,一般会在
cat /root/.jenkins/secrets/initialAdminPassword

我使用的github ,在github 配置 ssh 公钥 ,位置setting ssh,在jenkins 配置全局私钥
服务器生成密钥

ssh-keygen -t rsa

注意在页面拉取代码的时候Are you sure you want to continue connecting (yes/no/[fingerprint])? yes,需要点击确认

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.添加到system 守护进程去运行 ,指定工作目录

sudo vim /etc/systemd/system/jenkins.service

[Unit]
Description=Jenkins Daemon
After=network.target

[Service]
Type=simple
User=ec2-user
Group=ec2-user
Environment="JENKINS_HOME=/home/ec2-user/data/jenkins_home"
ExecStart=/usr/local/jdk-17.0.9/bin/java -jar /home/ec2-user/data/jenkins.war --httpPort=9090
Restart=always

[Install]
WantedBy=multi-user.target

需要改下所属目录和权限

sudo chown -R ec2-user:ec2-user /home/ec2-user/data/jenkins_home

用命令表示,Are you sure you want to continue connecting (yes/no)? yes ,拉取仓库的时候需要确认下
JENKINS_HOME=/home/ec2-user/data/jenkins_home /home/ec2-user/data/jdk-17.0.9/bin/java -jar /home/ec2-user/data/jenkins.war --httpPort=9090

设置启动和开启启动

sudo systemctl daemon-reload
启动 Jenkins: sudo systemctl restart jenkins
停止 Jenkins: sudo systemctl stop jenkins
开机启动 Jenkins: sudo systemctl enable jenkins
查看 Jenkins 服务状态: sudo systemctl status jenkins
日志 sudo journalctl -u jenkins -f
3.配置pipeline 仓库

在jenkins 里面设置库
在这里插入图片描述
上面标红的相当于 Jenkins 里面的这个变量

@Library('pipeline_libraries') _

def tools = new org.devops.tools()

在这里插入图片描述

四、继续安装docker

yum remove docker  docker-common docker-selinux docker-engine

yum install -y yum-utils device-mapper-persistent-data lvm2

选择镜像
阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
源镜像
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
调试容器出错原因
docker run -it --rm -p 8062:8062 \
-v $(pwd)/config.yaml:/app/conf/config.yaml \
-v $(pwd)/logs:/app/logs \
gitxuzan/weather_api:v0.0.1 /bin/sh
查看服务端:
yum list docker-ce --showduplicates | sort -r
选择版本安装

查看客户端,下载对应版本
yum list docker-ce-cli --showduplicates | sort -r

yum install -y docker-ce-3:20.10.9-3.el8 docker-ce-cli-1:20.10.9-3.el8
最后开启启动查看
systemctl start docker
systemctl enable docker docker version

五、设置跳板机登录

.ssh/config文件配置
执行 ssh target 可以跳板机登录

# 定义跳板机 (a) 的配置
Host bastion
    # 跳板机的IP地址或主机名
    HostName 16.xxx.xxx.xx
    # 用于登录跳板机的用户名
    User xuzan
    # Jenkins 服务器上的SSH私钥路径,用于身份验证
    IdentityFile /var/lib/jenkins/.ssh/bastonhost_16.xxx.xxx.pem

# 定义目标服务器 (b) 的配置
Host target
    # 目标服务器的IP地址或主机名
    HostName 52.xxx.xxx.xxx
    # 用于登录目标服务器的用户名
    User ec2-user
    # Jenkins 服务器上的SSH私钥路径,用于身份验证
    IdentityFile /home/xuzan/.ssh/news_app.pem
    # 使用ProxyCommand来指定通过跳板机连接到目标服务器
    # 这里使用ssh命令通过跳板机连接到目标服务器
    ProxyCommand ssh -q -W %h:%p bastion

六、jenkins 流水线,监听到push,然后根据commit 信息打包

pipeline {
    agent any
    options {
        disableConcurrentBuilds()  // 确保流水线不会并行执行
        timeout(time: 5, unit: 'MINUTES')  // 设置整个流水线的超时为 5 分钟
    }

    environment {
        CRAWLER_API = "weather_api"
        DIR_RUN = "cd /home/ec2-user/data/docker/services/weather && ./secrets.sh"
        CREDENTIALSID = "f2b9ffa0-89d4-41bd-b3b4-9d5fd3cfac06"
        VERSION_FILE = 'deployed_version.txt'
    }

    stages {

        stage('Retrieve Latest Successful Version') {
            steps {
                script {
                    if (fileExists(env.VERSION_FILE)) {
                        def versions = readFile(file: env.VERSION_FILE).trim().split("\n")
                        env.LATEST_VERSION = versions[-1] // Last line is the latest version
                        env.PREVIOUS_VERSION = versions.size() > 1 ? versions[-2] : "v0.0.1" // Second last line is the previous version
                    } else {
                        env.LATEST_VERSION = "v0.0.1"
                        env.PREVIOUS_VERSION = "v0.0.1"
                    }
                }
            }
        }


        stage('Checkout Code from GitHub') {
            steps {
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: '*/main']],
                    extensions: [],
                    userRemoteConfigs: [[url: "git@github.com:xxxxx/${CRAWLER_API}.git", credentialsId: "${CREDENTIALSID}"]]
                ])
            }
        }

        stage('Decide Operation Based on Commit Message') {
            steps {
                script {
                    def lastCommitMessage = sh(script: "git log -1 --pretty=%B", returnStdout: true).trim()
                    env.CommitMessage = lastCommitMessage
                    if (lastCommitMessage.startsWith("#pro")) {
                        env.OPERATION = "deploy"
                        env.VERSION = "v0.0.${env.BUILD_NUMBER}"
                    } else if (lastCommitMessage.startsWith("#pre")) {
                        env.OPERATION = "rollback"
                        env.VERSION = env.PREVIOUS_VERSION
                    } else {
                        currentBuild.result = 'ABORTED'
                        error("Invalid commit message. Either start with #pro for deploy or #pre for rollback!")
                    }
                }
            }
        }

        stage('Build Docker Image and Push') {
            when {
                expression { env.OPERATION == "deploy" }
            }
            steps {
                script {
                    sh 'docker build --platform linux/amd64 -t xxxx/${CRAWLER_API}:${VERSION} -f Dockerfile_amd64_arm64 .'
                    sh 'docker push xxxx/${CRAWLER_API}:${VERSION}'
                }
            }
        }

        stage('登录服务器Deploy/Rollback on Production Server') {
            steps {
                script {
                    sh 'ssh -t target "${DIR_RUN} ${VERSION}"'
                }
            }
        }

        stage('验证接口Verify Deployment') {
            steps {
                script {
                    sleep 5
                    sh """
                        status_code=\$(curl -o /dev/null -s -w "%{http_code}" https://xxxxx/weather/v1/app/test)
                        if [ "\$status_code" != "200" ]; then
                            echo "API check failed! Received status code: \$status_code"
                            exit 1
                        fi
                    """
                }
            }
        }
    }

    post {
        success {
            echo 'Build was successful!'
            script {
                if (env.OPERATION == "deploy") {
                // 如果文件存在且最后一个字符不是换行符,则追加一个换行符
                if (fileExists(env.VERSION_FILE) && sh(script: "tail -c 1 ${env.VERSION_FILE} | wc -l", returnStdout: true).trim() != "1") {
                    sh "echo '' >> ${env.VERSION_FILE}"
                }
                // 追加版本号
                    sh "echo '${VERSION}' >> ${env.VERSION_FILE}"
                }
                currentBuild.description = "构建成功!"
                def projectName = sh(script: "basename `git rev-parse --show-toplevel`", returnStdout: true).trim()
                def messageToSend = "${projectName}: ${VERSION} ${env.CommitMessage}"
                sh "ssh target '/home/ec2-user/data/docker/services/tg.sh \"构建成功 ${messageToSend}\"'"
                emailext subject: "执行成功 ${messageToSend}",
                  body: """
                  <div id="content">
                  <h2>Jenkins 运行结果</h2>
                  <h3>${messageToSend}</h3>
                  </div>
                  """,
                  mimeType: 'text/html',
                  from: "${env.USER_MY_EMAIL}",
                  to: "${env.USER_MY_EMAIL}"
            }
        }

        failure {
            echo 'Build failed!'
            script {
                currentBuild.description = "构建失败!"
                def projectName = sh(script: "basename `git rev-parse --show-toplevel`", returnStdout: true).trim()
                def messageToSend = "${projectName}: ${VERSION} ${env.CommitMessage}"
                sh "ssh target '/home/ec2-user/data/docker/services/tg.sh \"构建失败 ${messageToSend}\"'"
                // jenkins 邮件配置
                    emailext subject: "执行失败 ${messageToSend}",
                    body: """
                    <div id="content">
                    <h2>Jenkins 运行结果</h2>
                    <h3>${messageToSend}</h3>
                    </div>
                    """,
                    mimeType: 'text/html',
                    from: "${env.USER_MY_EMAIL}",
                    to: "${env.USER_MY_EMAIL}"
            }
        }

        aborted {
            echo '构建取消拉aborted!'
            script {
                currentBuild.description = "构建取消拉!"
            }
        }
    }
}

获取构建方式,例如是push 的还是手动构建的,还是定时构建的
 environment {
    CAUSE = "${currentBuild.getBuildCauses()[0].shortDescription}"
}

jenkins 日志

journalctl -u jenkins -f

七、jenkins webhooks 配置

7.1 设置了pipeline 全局仓库

在这里插入图片描述
jenkinsfile文件引入这个库直接调用

#!groovy

@Library('pipeline_libraries') _

def tools = new org.devops.tools()

// 测试
restartServicePostPipeline()

7.2 webhook插件配置 Generic Webhook Trigger

下载地址: https://plugins.jenkins.io/generic-webhook-trigger/

上面接收了post json 数据
在这里插入图片描述

7.3 在pipeline中获取该值,这样就直接获取了全部json了
 println("所有body数据 --> ${webhookPayload}")
7.4 邮件配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.权限配置

role-based-authorization strategy插件安装和使用
一.安装插件
1.点击系统管理-插件管理,搜索role,选择需要下载的版本,点击下载

在这里插入图片描述

或者插件手动下载,注意看当前版本号

在这里插入图片描述

服务器找到 JENKINS_HOME , /home/ec2-user/data/jenkins_home/plugins 文件,把hpi复制拷贝过去,再重启jenkins

二.新建用户
1.点击系统管理,管理用户

在这里插入图片描述

2.点击新建用户,输入用户信息

在这里插入图片描述

三.创建任务
1.在控制台点击,新建任务

在这里插入图片描述

2.填写任务信息

在这里插入图片描述

四.全局安全配置
1.点击系统管理,全局安全配置

在这里插入图片描述

2.设置权限方式

安全域:jenkins专有用户数据库

授权策略:Role-Based-Strategy
在这里插入图片描述

五.管理和分配角色
1.点击系统设置-安全-manage and assign roles

在这里插入图片描述

2.管理角色

点击manage roles

Global roles:全局角色,一般设置登录权限即可
在这里插入图片描述
在这里插入图片描述
这pattern 就是匹配你的流水线名称,正则匹配的

在这里插入图片描述

应用保存后,查看验证权限效果

其他

用户git设置,这个配合插件使用
在这里插入图片描述

github clone不下来


https://ping.chinaz.com/github.com

选择可用的ip ,在/etc/hosts 修改
20.205.243.166 github.com
20.205.243.166 raw.githubusercontent.com

卡主的情况

sudo systemctl stop jenkins
# 这个编号就是你的流水线编号
rm -rf /root/.jenkins/jobs/widgets_api/builds/123
sudo systemctl start jenkins

nohup问题 新增 JENKINS_NODE_COOKIE=dontKillMe

cd /home/ec2-user/data/weather/ && JENKINS_NODE_COOKIE=dontKillMe ./admin.sh restart

关于jenkins 没有执行docker权限的问题

这个地方一定要加入docker 组 里面,
sudo usermod -aG docker ec2-user
查看组
groups ec2-user

最后重启jenkins
sudo systemctl restart jenkins



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gitxuzan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值