Repository: PingCAP-QE/ci
Pull request #3423: feat(br): add daily br it pipeline on lts branch
Author: login: purelind
Labels: name: approved
name: lgtm
name: size/XXL
name: area/jobs/jenkins-DSL
name: area/jenkins-pipelines
name: area/jobs/prow
Created: 2025-03-12T09:20:56Z | Merged: 2025-03-12T09:38:25Z

Add periodic br integration jobs for release branches 6.1, 6.5, 7.1, 7.5, and 8.1.


Diff:
diff --git a/jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy b/jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..40bb090cea
--- /dev/null
+++ b/jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
@@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-6.1'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jobs/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy b/jobs/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..aa22d4f6e5
--- /dev/null
+++ b/jobs/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
@@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-6.5'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jobs/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy b/jobs/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..16591d4b9c
--- /dev/null
+++ b/jobs/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
@@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-7.1'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jobs/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy b/jobs/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..1dc0cc75a6
--- /dev/null
+++ b/jobs/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
@@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-7.5'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy b/jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..db5e12a68f
--- /dev/null
+++ b/jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
@@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-8.1'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy b/pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..6871eaa1d9
--- /dev/null
+++ b/pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
@@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-6.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-6.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-6.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-6.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || make
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9', 'G10', 'G11', 'G12', 'G13', 'G14', 'G15'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        environment { CODECOV_TOKEN = credentials('codecov-token-tidb') }
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """
+                                        #!/usr/bin/env bash
+                                        cp ${WORKSPACE}/scripts/pingcap/tidb/br-lightning_run_group_v2.sh br/tests/run_group.sh
+                                        chmod +x br/tests/*.sh
+                                        ln -s ${WORKSPACE}/tidb/bin ${WORKSPACE}/tidb/br/bin
+                                        cd br/
+                                        ./tests/run_group.sh ${TEST_GROUP}
+                                    """  
+                                }
+                            }
+                        }
+                        post{
+                            failure {
+                                sh label: "collect logs", script: """
+                                    ls /tmp/backup_restore_test
+                                    tar -cvzf log-${TEST_GROUP}.tar.gz \$(find /tmp/backup_restore_test/ -type f -name "*.log")    
+                                    ls -alh  log-${TEST_GROUP}.tar.gz  
+                                """
+                                archiveArtifacts artifacts: "log-${TEST_GROUP}.tar.gz", fingerprint: true 
+                            }
+                        }
+                    }
+                }
+            }        
+        }
+    }
+}
diff --git a/pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy b/pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..b8eb79d97f
--- /dev/null
+++ b/pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
@@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-6.5 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-6.5/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-6.5"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-6.5
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || make
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9', 'G10', 'G11', 'G12', 'G13', 'G14', 'G15'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        environment { CODECOV_TOKEN = credentials('codecov-token-tidb') }
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """
+                                        #!/usr/bin/env bash
+                                        cp ${WORKSPACE}/scripts/pingcap/tidb/br-lightning_run_group_v2.sh br/tests/run_group.sh
+                                        chmod +x br/tests/*.sh
+                                        ln -s ${WORKSPACE}/tidb/bin ${WORKSPACE}/tidb/br/bin
+                                        cd br/
+                                        ./tests/run_group.sh ${TEST_GROUP}
+                                    """  
+                                }
+                            }
+                        }
+                        post{
+                            failure {
+                                sh label: "collect logs", script: """
+                                    ls /tmp/backup_restore_test
+                                    tar -cvzf log-${TEST_GROUP}.tar.gz \$(find /tmp/backup_restore_test/ -type f -name "*.log")    
+                                    ls -alh  log-${TEST_GROUP}.tar.gz  
+                                """
+                                archiveArtifacts artifacts: "log-${TEST_GROUP}.tar.gz", fingerprint: true 
+                            }
+                        }
+                    }
+                }
+            }        
+        }
+    }
+}
diff --git a/pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy b/pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..c9f64f3a3a
--- /dev/null
+++ b/pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
@@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-7.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-7.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-7.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-7.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9', 'G10', 'G11', 'G12', 'G13', 'G14', 'G15'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        environment { CODECOV_TOKEN = credentials('codecov-token-tidb') }
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """
+                                        #!/usr/bin/env bash
+                                        cp ${WORKSPACE}/scripts/pingcap/tidb/br-lightning_run_group_v2.sh br/tests/run_group.sh
+                                        chmod +x br/tests/*.sh
+                                        ln -s ${WORKSPACE}/tidb/bin ${WORKSPACE}/tidb/br/bin
+                                        cd br/
+                                        ./tests/run_group.sh ${TEST_GROUP}
+                                    """  
+                                }
+                            }
+                        }
+                        post{
+                            failure {
+                                sh label: "collect logs", script: """
+                                    ls /tmp/backup_restore_test
+                                    tar -cvzf log-${TEST_GROUP}.tar.gz \$(find /tmp/backup_restore_test/ -type f -name "*.log")    
+                                    ls -alh  log-${TEST_GROUP}.tar.gz  
+                                """
+                                archiveArtifacts artifacts: "log-${TEST_GROUP}.tar.gz", fingerprint: true 
+                            }
+                        }
+                    }
+                }
+            }        
+        }
+    }
+}
diff --git a/pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy b/pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..9819d28611
--- /dev/null
+++ b/pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
@@ -0,0 +1,139 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for master and latest release branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-7.5/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-7.5"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-7.5
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """
+                        #!/usr/bin/env bash
+                        chmod +x br/tests/*.sh
+                        ./br/tests/run_group.sh others
+                    """
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G00', 'G01', 'G02', 'G03', 'G04', 'G05', 'G06',  'G07', 'G08', 'G09', 'G10', 'G11', 'G12', 'G13', 
+                            'G14', 'G15', 'G16', 'G17'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """
+                                        #!/usr/bin/env bash
+                                        chmod +x br/tests/*.sh
+                                        ./br/tests/run_group.sh ${TEST_GROUP}
+                                    """  
+                                }
+                            }
+                        }
+                        post{
+                            failure {
+                                sh label: "collect logs", script: """
+                                    ls /tmp/backup_restore_test
+                                    tar -cvzf log-${TEST_GROUP}.tar.gz \$(find /tmp/backup_restore_test/ -type f -name "*.log")    
+                                    ls -alh  log-${TEST_GROUP}.tar.gz  
+                                """
+                                archiveArtifacts artifacts: "log-${TEST_GROUP}.tar.gz", fingerprint: true 
+                            }
+                        }
+                    }
+                }
+            }        
+        }
+    }
+}
diff --git a/pipelines/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy b/pipelines/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
new file mode 100644
index 0000000000..ebd90cb44b
--- /dev/null
+++ b/pipelines/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
@@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
+                        chmod +x br/tests/*.sh
+                        ./br/tests/run_group_br_tests.sh others
+                    """
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G00', 'G01', 'G02', 'G03', 'G04', 'G05', 'G06',  'G07', 'G08'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """#!/usr/bin/env bash
+                                        chmod +x br/tests/*.sh
+                                        ./br/tests/run_group_br_tests.sh ${TEST_GROUP}
+                                    """  
+                                }
+                            }
+                        }
+                        post{
+                            failure {
+                                sh label: "collect logs", script: """
+                                    ls /tmp/backup_restore_test
+                                    tar -cvzf log-${TEST_GROUP}.tar.gz \$(find /tmp/backup_restore_test/ -type f -name "*.log")    
+                                    ls -alh  log-${TEST_GROUP}.tar.gz  
+                                """
+                                archiveArtifacts artifacts: "log-${TEST_GROUP}.tar.gz", fingerprint: true 
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/prow-jobs/kustomization.yaml b/prow-jobs/kustomization.yaml
index bc39461dee..5c05de6001 100644
--- a/prow-jobs/kustomization.yaml
+++ b/prow-jobs/kustomization.yaml
@@ -37,23 +37,28 @@ configMapGenerator:
       - pingcap_tidb_latest-postsubmits.yaml=pingcap/tidb/latest-postsubmits.yaml
       - pingcap_tidb_latest-presubmits-canary.yaml=pingcap/tidb/latest-presubmits-canary.yaml
       - pingcap_tidb_latest-presubmits.yaml=pingcap/tidb/latest-presubmits.yaml
+      - pingcap_tidb_release-6.1-periodics.yaml=pingcap/tidb/release-6.1-periodics.yaml
       - pingcap_tidb_release-6.1-presubmits.yaml=pingcap/tidb/release-6.1-presubmits.yaml
       - pingcap_tidb_release-6.2-presubmits.yaml=pingcap/tidb/release-6.2-presubmits.yaml
       - pingcap_tidb_release-6.3-presubmits.yaml=pingcap/tidb/release-6.3-presubmits.yaml
       - pingcap_tidb_release-6.4-presubmits.yaml=pingcap/tidb/release-6.4-presubmits.yaml
       - pingcap_tidb_release-6.5-20241101-v6.5.7-presubits.yaml=pingcap/tidb/release-6.5-20241101-v6.5.7-presubits.yaml
       - pingcap_tidb_release-6.5-fips-presubmits.yaml=pingcap/tidb/release-6.5-fips-presubmits.yaml
+      - pingcap_tidb_release-6.5-periodics.yaml=pingcap/tidb/release-6.5-periodics.yaml
       - pingcap_tidb_release-6.5-presubmits.yaml=pingcap/tidb/release-6.5-presubmits.yaml
       - pingcap_tidb_release-6.5-with-kv-timeout-feature-presubmits.yaml=pingcap/tidb/release-6.5-with-kv-timeout-feature-presubmits.yaml
       - pingcap_tidb_release-6.6-presubmits.yaml=pingcap/tidb/release-6.6-presubmits.yaml
       - pingcap_tidb_release-7.0-presubmits.yaml=pingcap/tidb/release-7.0-presubmits.yaml
+      - pingcap_tidb_release-7.1-periodics.yaml=pingcap/tidb/release-7.1-periodics.yaml
       - pingcap_tidb_release-7.1-presubmits.yaml=pingcap/tidb/release-7.1-presubmits.yaml
       - pingcap_tidb_release-7.2-presubmits.yaml=pingcap/tidb/release-7.2-presubmits.yaml
       - pingcap_tidb_release-7.3-presubmits.yaml=pingcap/tidb/release-7.3-presubmits.yaml
       - pingcap_tidb_release-7.4-presubmits.yaml=pingcap/tidb/release-7.4-presubmits.yaml
+      - pingcap_tidb_release-7.5-periodics.yaml=pingcap/tidb/release-7.5-periodics.yaml
       - pingcap_tidb_release-7.5-presubmits.yaml=pingcap/tidb/release-7.5-presubmits.yaml
       - pingcap_tidb_release-7.6-presubmits.yaml=pingcap/tidb/release-7.6-presubmits.yaml
       - pingcap_tidb_release-8.0-presubmits.yaml=pingcap/tidb/release-8.0-presubmits.yaml
+      - pingcap_tidb_release-8.1-periodics.yaml=pingcap/tidb/release-8.1-periodics.yaml
       - pingcap_tidb_release-8.1-presubmits.yaml=pingcap/tidb/release-8.1-presubmits.yaml
       - pingcap_tidb_release-8.2-presubmits.yaml=pingcap/tidb/release-8.2-presubmits.yaml
       - pingcap_tidb_release-8.3-presubmits.yaml=pingcap/tidb/release-8.3-presubmits.yaml
diff --git a/prow-jobs/pingcap/tidb/release-6.1-periodics.yaml b/prow-jobs/pingcap/tidb/release-6.1-periodics.yaml
new file mode 100644
index 0000000000..5f807e3824
--- /dev/null
+++ b/prow-jobs/pingcap/tidb/release-6.1-periodics.yaml
@@ -0,0 +1,10 @@
+# struct ref: https://pkg.go.dev/k8s.io/test-infra/prow/config#Periodic
+periodics:
+  - name: pingcap/tidb/release-6.1/periodics_br_integration_test
+    agent: jenkins
+    decorate: false # need add this.
+    cron: "0 */12 * * *" # every 12 hour
+    extra_refs: # Periodic job doesn't clone any repo by default, needs to be added explicitly
+    - org: pingcap
+      repo: tidb
+      base_ref: release-6.1
diff --git a/prow-jobs/pingcap/tidb/release-6.5-periodics.yaml b/prow-jobs/pingcap/tidb/release-6.5-periodics.yaml
new file mode 100644
index 0000000000..10053a458d
--- /dev/null
+++ b/prow-jobs/pingcap/tidb/release-6.5-periodics.yaml
@@ -0,0 +1,10 @@
+# struct ref: https://pkg.go.dev/k8s.io/test-infra/prow/config#Periodic
+periodics:
+  - name: pingcap/tidb/release-6.5/periodics_br_integration_test
+    agent: jenkins
+    decorate: false # need add this.
+    cron: "0 */12 * * *" # every 12 hour
+    extra_refs: # Periodic job doesn't clone any repo by default, needs to be added explicitly
+    - org: pingcap
+      repo: tidb
+      base_ref: release-6.5
diff --git a/prow-jobs/pingcap/tidb/release-7.1-periodics.yaml b/prow-jobs/pingcap/tidb/release-7.1-periodics.yaml
new file mode 100644
index 0000000000..8027993cad
--- /dev/null
+++ b/prow-jobs/pingcap/tidb/release-7.1-periodics.yaml
@@ -0,0 +1,10 @@
+# struct ref: https://pkg.go.dev/k8s.io/test-infra/prow/config#Periodic
+periodics:
+  - name: pingcap/tidb/release-7.1/periodics_br_integration_test
+    agent: jenkins
+    decorate: false # need add this.
+    cron: "0 */12 * * *" # every 12 hour
+    extra_refs: # Periodic job doesn't clone any repo by default, needs to be added explicitly
+    - org: pingcap
+      repo: tidb
+      base_ref: release-7.1
diff --git a/prow-jobs/pingcap/tidb/release-7.5-periodics.yaml b/prow-jobs/pingcap/tidb/release-7.5-periodics.yaml
new file mode 100644
index 0000000000..dae6b68653
--- /dev/null
+++ b/prow-jobs/pingcap/tidb/release-7.5-periodics.yaml
@@ -0,0 +1,10 @@
+# struct ref: https://pkg.go.dev/k8s.io/test-infra/prow/config#Periodic
+periodics:
+  - name: pingcap/tidb/release-7.5/periodics_br_integration_test
+    agent: jenkins
+    decorate: false # need add this.
+    cron: "0 */12 * * *" # every 12 hour
+    extra_refs: # Periodic job doesn't clone any repo by default, needs to be added explicitly
+    - org: pingcap
+      repo: tidb
+      base_ref: release-7.5
diff --git a/prow-jobs/pingcap/tidb/release-8.1-periodics.yaml b/prow-jobs/pingcap/tidb/release-8.1-periodics.yaml
new file mode 100644
index 0000000000..082f855fc5
--- /dev/null
+++ b/prow-jobs/pingcap/tidb/release-8.1-periodics.yaml
@@ -0,0 +1,10 @@
+# struct ref: https://pkg.go.dev/k8s.io/test-infra/prow/config#Periodic
+periodics:
+  - name: pingcap/tidb/release-8.1/periodics_br_integration_test
+    agent: jenkins
+    decorate: false # need add this.
+    cron: "0 */12 * * *" # every 12 hour
+    extra_refs: # Periodic job doesn't clone any repo by default, needs to be added explicitly
+    - org: pingcap
+      repo: tidb
+      base_ref: release-8.1


Reviews:
user: login: gemini-code-assist[bot]
body: Hello @purelind, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

## Summary of Changes
This pull request adds periodic BR (Backup & Restore) integration jobs for the release branches 6.1, 6.5, 7.1, 7.5, and 8.1. This involves creating new Groovy files for Jenkins job definitions and YAML files for Prow periodic job configurations for each of the specified release branches. The Jenkins jobs are configured to run BR integration tests, and the Prow configurations schedule these jobs to run every 12 hours.

### Highlights
* **Jenkins Job Definitions**: New Groovy files are added to define Jenkins pipeline jobs for periodic BR integration tests on release branches 6.1, 6.5, 7.1, 7.5, and 8.1. These jobs use a shared pipeline script and are parameterized for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
* **Prow Periodic Job Configurations**: New YAML files are added to configure Prow periodic jobs that trigger the Jenkins BR integration tests for each release branch every 12 hours. These configurations specify the Jenkins agent, disable decoration, and include extra references to the pingcap/tidb repository.
* **Pipeline Script**: New groovy pipeline scripts are added for each release branch to define the stages of the BR integration test. These stages include debug info, checkout, prepare, and tests. The test stage runs the br integration tests in parallel using a matrix of test groups.

### Changelog
<details>
<summary>Click here to see the changelog</summary>

* **jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy**
  * Added a new Jenkins job definition for periodic BR integration tests on the release-6.1 branch.
  * Configured the job with parameters for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
  * Set up the job to use a pipeline script located at `pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy`.
* **jobs/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy**
  * Added a new Jenkins job definition for periodic BR integration tests on the release-6.5 branch.
  * Configured the job with parameters for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
  * Set up the job to use a pipeline script located at `pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy`.
* **jobs/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy**
  * Added a new Jenkins job definition for periodic BR integration tests on the release-7.1 branch.
  * Configured the job with parameters for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
  * Set up the job to use a pipeline script located at `pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy`.
* **jobs/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy**
  * Added a new Jenkins job definition for periodic BR integration tests on the release-7.5 branch.
  * Configured the job with parameters for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
  * Set up the job to use a pipeline script located at `pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy`.
* **jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy**
  * Added a new Jenkins job definition for periodic BR integration tests on the release-8.1 branch.
  * Configured the job with parameters for BUILD_ID, PROW_JOB_ID, and JOB_SPEC.
  * Set up the job to use a pipeline script located at `pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy`.
* **pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy**
  * Added a new pipeline script for BR integration tests on the release-6.1 branch.
  * Configured the pipeline to run in a Kubernetes environment with a specific pod template.
  * Defined stages for debug info, checkout, prepare, and tests, including downloading dependencies, building binaries, and running tests in parallel.
* **pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy**
  * Added a new pipeline script for BR integration tests on the release-6.5 branch.
  * Configured the pipeline to run in a Kubernetes environment with a specific pod template.
  * Defined stages for debug info, checkout, prepare, and tests, including downloading dependencies, building binaries, and running tests in parallel.
* **pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy**
  * Added a new pipeline script for BR integration tests on the release-7.1 branch.
  * Configured the pipeline to run in a Kubernetes environment with a specific pod template.
  * Defined stages for debug info, checkout, prepare, and tests, including downloading dependencies, building binaries, and running tests in parallel.
* **pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy**
  * Added a new pipeline script for BR integration tests on the release-7.5 branch.
  * Configured the pipeline to run in a Kubernetes environment with a specific pod template.
  * Defined stages for debug info, checkout, prepare, and tests, including downloading dependencies, building binaries, and running tests in parallel.
* **pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy**
  * Added a new pipeline script for BR integration tests on the release-8.1 branch.
  * Configured the pipeline to run in a Kubernetes environment with a specific pod template.
  * Defined stages for debug info, checkout, prepare, and tests, including downloading dependencies, building binaries, and running tests in parallel.
* **prow-jobs/kustomization.yaml**
  * Added references to the new Prow periodic job configuration files for release branches 6.1, 6.5, 7.1, 7.5, and 8.1.
* **prow-jobs/pingcap/tidb/release-6.1-periodics.yaml**
  * Added a new Prow periodic job configuration file for release-6.1, scheduling the `periodics_br_integration_test` job every 12 hours.
* **prow-jobs/pingcap/tidb/release-6.5-periodics.yaml**
  * Added a new Prow periodic job configuration file for release-6.5, scheduling the `periodics_br_integration_test` job every 12 hours.
* **prow-jobs/pingcap/tidb/release-7.1-periodics.yaml**
  * Added a new Prow periodic job configuration file for release-7.1, scheduling the `periodics_br_integration_test` job every 12 hours.
* **prow-jobs/pingcap/tidb/release-7.5-periodics.yaml**
  * Added a new Prow periodic job configuration file for release-7.5, scheduling the `periodics_br_integration_test` job every 12 hours.
* **prow-jobs/pingcap/tidb/release-8.1-periodics.yaml**
  * Added a new Prow periodic job configuration file for release-8.1, scheduling the `periodics_br_integration_test` job every 12 hours.

</details>


<details>

<summary><b>Using Gemini Code Assist</b></summary>
<br>

The full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.

<b>Invoking Gemini</b>

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either `/gemini <command>` or `@gemini-code-assist <command>`. Below is a summary of the supported commands.

Feature | Command | Description
--- | --- | ---
Code Review | `/gemini review` | Performs a code review for the current pull request in its current state.
Pull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments.
Help | `/gemini help` | Displays a list of available commands.

<b>Customization</b>

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/review-github-code).

<b>Limitations & Feedback</b>

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments to provide feedback.

</details>

<b>You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).</b>


[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/review-github-code). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).

---

**Trivia time!**

What is the primary purpose of Jenkins?

<details>
<summary><b>Click here for the answer</b></summary>
<br>
Jenkins is primarily used for continuous integration and continuous delivery (CI/CD), automating the software development process.

</details>

state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-12T09:21:11Z
user: login: gemini-code-assist[bot]
body: ## Code Review
This pull request introduces periodic br integration jobs for several release branches. The changes involve adding new Groovy files for Jenkins job definitions and YAML files for Prow periodic jobs. The overall structure and logic seem consistent across the different release branches. However, there are some areas where improvements can be made to enhance maintainability and clarity.

### Summary of Findings
* **Duplicated Code**: The Groovy files for different release branches contain a lot of duplicated code. Consider using a template or shared library to reduce redundancy and improve maintainability.
* **Inconsistent Naming**: The file name for release-8.1 pipeline is `periodics_br_integration.groovy` while others are `periodics_br_integration_test.groovy`. Consistent naming would improve readability.
* **Hardcoded Values**: The K8S_NAMESPACE is hardcoded in the Groovy files. Consider externalizing this configuration to make it more flexible.
* **Script Consistency**: The scripts used in the 'Prepare' stage differ slightly between release branches. Standardizing these scripts would improve consistency and reduce maintenance overhead.

### Merge Readiness
The pull request introduces important periodic integration jobs. However, the identified issues, particularly the duplicated code and inconsistent naming, should be addressed before merging to ensure long-term maintainability and reduce potential errors. I am unable to approve this pull request, and recommend that another reviewer also takes a look at this code before merging. At a minimum, the high severity issues should be addressed before merging.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-12T09:21:40Z

Review comments:
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-8.1'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
path: jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![high](https://img.shields.io/badge/priority-high-orange)

This file is nearly identical to `jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy`.  Consider creating a template or shared library to avoid code duplication. This will make maintenance easier and reduce the risk of inconsistencies.
created_at: 2025-03-12T09:21:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-6.5'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
path: jobs/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![high](https://img.shields.io/badge/priority-high-orange)

This file is nearly identical to `jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy`.  Consider creating a template or shared library to avoid code duplication. This will make maintenance easier and reduce the risk of inconsistencies.
created_at: 2025-03-12T09:21:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-7.1'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
path: jobs/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![high](https://img.shields.io/badge/priority-high-orange)

This file is nearly identical to `jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy`.  Consider creating a template or shared library to avoid code duplication. This will make maintenance easier and reduce the risk of inconsistencies.
created_at: 2025-03-12T09:21:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-7.5'
+final jobName = 'periodics_br_integration_test'
+
+pipelineJob("${folder}/${jobName}") {
+    logRotator {
+        daysToKeep(30)
+    }
+    parameters {
+        stringParam("BUILD_ID")
+        stringParam("PROW_JOB_ID")
+        stringParam("JOB_SPEC", "", "Prow job spec struct data")
+    }
+    properties {
+        // priority(0) // 0 fast than 1
+        githubProjectUrl("https://github.com/pingcap/tidb")
+    }
+ 
+    definition {
+        cpsScm {
+            lightweight(true)
+            scriptPath("pipelines/${folder}/${jobName}.groovy")
+            scm {
+                git{
+                    remote {
+                        url('https://github.com/PingCAP-QE/ci.git')
+                    }
+                    branch('main')
+                    extensions {
+                        cloneOptions {
+                            depth(1)
+                            shallow(true)
+                            timeout(5)
+                        } 
+                    }
+                }
+            }
+        }
+    }
+}
path: jobs/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![high](https://img.shields.io/badge/priority-high-orange)

This file is nearly identical to `jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy`.  Consider creating a template or shared library to avoid code duplication. This will make maintenance easier and reduce the risk of inconsistencies.
created_at: 2025-03-12T09:21:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-7.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-7.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-7.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-7.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
path: pipelines/pingcap/tidb/release-7.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The `make failpoint-enable && make && make failpoint-disable` command is specific to this release. Consider adding a comment explaining why this is needed for this release and not others.

```
# Enable failpoint for this release, build, then disable failpoint
[ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
```
created_at: 2025-03-12T09:21:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-6.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
path: pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The `K8S_NAMESPACE` is hardcoded. Consider externalizing this configuration to make it more flexible and easier to manage across different environments.

```
final K8S_NAMESPACE = System.getenv('K8S_NAMESPACE') ?: "jenkins-tidb"
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-6.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-6.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-6.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-6.1
path: pipelines/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider using a variable for the release version instead of hardcoding it in the script. This will make the script more reusable and easier to update for different releases.

```
${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh ${TARGET_BRANCH_VERSION}
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-6.5 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-6.5/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-6.5"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            chmod +x ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh
+                            ${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-6.5
path: pipelines/pingcap/tidb/release-6.5/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider using a variable for the release version instead of hardcoding it in the script. This will make the script more reusable and easier to update for different releases.

```
${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh ${TARGET_BRANCH_VERSION}
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
path: jobs/pingcap/tidb/release-6.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider replacing `<your-jenkins-server>` with a placeholder or environment variable to avoid exposing sensitive information or requiring manual updates across multiple files. This also makes the reference more generic and reusable.

```
// REF: https://${JENKINS_SERVER}/plugin/job-dsl/api-viewer/index.html
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,139 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for master and latest release branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-7.5/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-7.5"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-7.5
path: pipelines/pingcap/tidb/release-7.5/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

This script is different from the one used in the other release branches. Consider standardizing the script across all branches to reduce maintenance overhead.

```
${WORKSPACE}/scripts/pingcap/tidb/br_integration_test_download_dependency.sh release-7.5
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
path: pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The script `run_group_br_tests.sh` is different from the `run_group.sh` used in other release branches. Standardizing the script across all branches would reduce maintenance overhead and improve consistency.

```
./br/tests/run_group.sh others
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
path: pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

This line uses a different script compared to other release branches.  Consider standardizing the script name and functionality across all branches for consistency.

```
sh label: "check all tests added to group", script: """#!/usr/bin/env bash
                        chmod +x br/tests/*.sh
                        ./br/tests/run_group.sh others
                    """
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
+                        chmod +x br/tests/*.sh
+                        ./br/tests/run_group_br_tests.sh others
+                    """
+                    // build br.test for integration test
+                    // only build binarys if not exist, use the cached binarys if exist
+                    sh label: "prepare", script: """
+                        [ -f ./bin/tidb-server ] || (make failpoint-enable && make && make failpoint-disable)
+                        [ -f ./bin/br.test ] || make build_for_br_integration_test
+                        ls -alh ./bin
+                        ./bin/tidb-server -V
+                    """
+                    cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                        sh label: "prepare", script: """
+                            cp -r ../third_party_download/bin/* ./bin/
+                            ls -alh ./bin
+                        """
+                    }
+                }
+            }
+        }
+        stage('Tests') {
+            matrix {
+                axes {
+                    axis {
+                        name 'TEST_GROUP'
+                        values 'G00', 'G01', 'G02', 'G03', 'G04', 'G05', 'G06',  'G07', 'G08'
+                    }
+                }
+                agent{
+                    kubernetes {
+                        namespace K8S_NAMESPACE
+                        defaultContainer 'golang'
+                        yamlFile POD_TEMPLATE_FILE
+                    }
+                }
+                stages {
+                    stage("Test") {
+                        options { timeout(time: 45, unit: 'MINUTES') }
+                        steps {
+                            dir('tidb') {
+                                cache(path: "./", includes: '**/*', key: "ws/${BUILD_TAG}/br-lightning") { 
+                                    sh label: "TEST_GROUP ${TEST_GROUP}", script: """#!/usr/bin/env bash
path: pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

This line uses a different script compared to other release branches.  Consider standardizing the script name and functionality across all branches for consistency.

```
sh label: "TEST_GROUP ${TEST_GROUP}", script: """#!/usr/bin/env bash
                                        chmod +x br/tests/*.sh
                                        ./br/tests/run_group.sh ${TEST_GROUP}
                                    """
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
+                        chmod +x br/tests/*.sh
+                        ./br/tests/run_group_br_tests.sh others
path: pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

This line uses a different script compared to other release branches.  Consider standardizing the script name and functionality across all branches for consistency.

```
sh label: "check all tests added to group", script: """#!/usr/bin/env bash
                        chmod +x br/tests/*.sh
                        ./br/tests/run_group.sh others
                    """
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,136 @@
+// REF: https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
+// Keep small than 400 lines: https://issues.jenkins.io/browse/JENKINS-37984
+// should triggerd for release-8.1 branches
+@Library('tipipeline') _
+
+final K8S_NAMESPACE = "jenkins-tidb"
+final GIT_FULL_REPO_NAME = 'pingcap/tidb'
+final GIT_CREDENTIALS_ID = 'github-sre-bot-ssh'
+final POD_TEMPLATE_FILE = 'pipelines/pingcap/tidb/release-8.1/pod-pull_br_integration_test.yaml'
+final TARGET_BRANCH = "release-8.1"
+
+pipeline {
+    agent {
+        kubernetes {
+            namespace K8S_NAMESPACE
+            yamlFile POD_TEMPLATE_FILE
+            defaultContainer 'golang'
+        }
+    }
+    environment {
+        FILE_SERVER_URL = 'http://fileserver.pingcap.net'
+    }
+    options {
+        timeout(time: 60, unit: 'MINUTES')
+        // parallelsAlwaysFailFast()
+    }
+    stages {
+        stage('Debug info') {
+            steps {
+                sh label: 'Debug info', script: """
+                    printenv
+                    echo "-------------------------"
+                    go env
+                    echo "-------------------------"
+                    echo "debug command: kubectl -n ${K8S_NAMESPACE} exec -ti ${NODE_NAME} bash"
+                """
+                container(name: 'net-tool') {
+                    sh 'dig github.com'
+                }
+            }
+        }
+        stage('Checkout') {
+            options { timeout(time: 5, unit: 'MINUTES') }
+            steps {
+                dir("tidb") {
+                    cache(path: "./", includes: '**/*', key: "git/pingcap/tidb/rev-${TARGET_BRANCH}", restoreKeys: ['git/pingcap/tidb/rev-']) {
+                        retry(2) {
+                            script {
+                                component.checkoutWithMergeBase('https://github.com/pingcap/tidb.git', 'tidb', TARGET_BRANCH, "", trunkBranch=TARGET_BRANCH, timeout=5, credentialsId="")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        stage('Prepare') {
+            steps {
+                dir("third_party_download") {
+                    retry(2) {
+                        sh label: "download third_party", script: """
+                            chmod +x ../tidb/br/tests/*.sh
+                            ${WORKSPACE}/tidb/br/tests/download_integration_test_binaries.sh release-8.1
+                            mkdir -p bin && mv third_bin/* bin/
+                            ls -alh bin/
+                            ./bin/pd-server -V
+                            ./bin/tikv-server -V
+                            ./bin/tiflash --version
+                        """
+                    }
+                }
+                dir('tidb') {
+                    sh label: "check all tests added to group", script: """#!/usr/bin/env bash
+                        chmod +x br/tests/*.sh
+                        ./br/tests/run_group_br_tests.sh others
+                    """
path: pipelines/pingcap/tidb/release-8.1/periodics_br_integration.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

This line uses a different script compared to other release branches.  Consider standardizing the script name and functionality across all branches for consistency.

```
sh label: "check all tests added to group", script: """#!/usr/bin/env bash
                        chmod +x br/tests/*.sh
                        ./br/tests/run_group.sh others
                    """
```
created_at: 2025-03-12T09:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,40 @@
+// REF: https://<your-jenkins-server>/plugin/job-dsl/api-viewer/index.html
+final folder = 'pingcap/tidb/release-8.1'
+final jobName = 'periodics_br_integration_test'
path: jobs/pingcap/tidb/release-8.1/periodics_br_integration_test.groovy
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The file name for release-8.1 pipeline is `periodics_br_integration.groovy` while others are `periodics_br_integration_test.groovy`. Consistent naming would improve readability.
created_at: 2025-03-12T09:21:40Z
author_association: CONTRIBUTOR

PR comments:
user: login: purelind
created_at: 2025-03-12T09:21:05Z
body: /cc @BornChanger 
author_association: CONTRIBUTOR
user: login: ti-chi-bot[bot]
created_at: 2025-03-12T09:21:16Z
body: > **I have already done a preliminary review for you, and I hope to help you do a better job.**

This pull request adds daily br integration jobs for release branches 6.1, 6.5, 7.1, 7.5, and 8.1. 

Key changes observed in the pull request:

1. It introduces new groovy files for each release branch under the 'jobs' and 'pipelines' directories.
2. Each groovy file sets up a job on Jenkins to perform a periodic integration test for the corresponding branch.
3. It also introduces new YAML files under the 'prow-jobs' directory to schedule these jobs to run every 12 hours.
4. In each groovy file, it sets the BUILD_ID, PROW_JOB_ID, JOB_SPEC as parameters, and sets the branch and git repository to be tested.
5. It also includes code for handling errors and logging.

Potential problems:

1. Hardcoded values: There are numerous hardcoded values like the namespace, repo name, and branch names. These values might need to be parameterized for flexibility.
2. Duplication: There is a lot of duplicated code in the groovy files. You might want to consider extracting the common parts into a shared library or a base file.
3. Error handling: While there is some error handling in place, it might not be comprehensive enough. You may want to add more checks, for example, to ensure that the git clone operation was successful.
4. There is no test coverage for these changes. It is difficult to determine the impact of these changes without tests.
5. Multiple Jobs: This PR is creating multiple jobs for different branches. This might consume extra resources if the jobs are heavy. You might want to consider a more efficient way of testing across different branches.

Suggestions for fixing:

1. Parameterize hardcoded values: Consider replacing hard-coded values with variables or configuration options for more flexibility.
2. Remove duplication: Extract common code into shared functions or a base file to reduce duplication.
3. Enhance error handling: Consider adding more error handling code to catch and handle different types of errors that might occur during the job.
4. Add tests: Consider adding tests to ensure that these changes work as expected and do not break anything.
5. Efficient Branch Testing: Consider implementing a more efficient way of testing multiple branches, for example, by running tests in parallel or using a more lightweight testing approach for some branches.
author_association: NONE
user: login: ti-chi-bot[bot]
created_at: 2025-03-12T09:21:43Z
body: @gemini-code-assist[bot]: adding LGTM is restricted to approvers and reviewers in OWNERS files.

<details>

In response to [this](https://github.com/PingCAP-QE/ci/pull/3423#pullrequestreview-2677677954):

>## Code Review
>This pull request introduces periodic br integration jobs for several release branches. The changes involve adding new Groovy files for Jenkins job definitions and YAML files for Prow periodic jobs. The overall structure and logic seem consistent across the different release branches. However, there are some areas where improvements can be made to enhance maintainability and clarity.
>
>### Summary of Findings
>* **Duplicated Code**: The Groovy files for different release branches contain a lot of duplicated code. Consider using a template or shared library to reduce redundancy and improve maintainability.
>* **Inconsistent Naming**: The file name for release-8.1 pipeline is `periodics_br_integration.groovy` while others are `periodics_br_integration_test.groovy`. Consistent naming would improve readability.
>* **Hardcoded Values**: The K8S_NAMESPACE is hardcoded in the Groovy files. Consider externalizing this configuration to make it more flexible.
>* **Script Consistency**: The scripts used in the 'Prepare' stage differ slightly between release branches. Standardizing these scripts would improve consistency and reduce maintenance overhead.
>
>### Merge Readiness
>The pull request introduces important periodic integration jobs. However, the identified issues, particularly the duplicated code and inconsistent naming, should be addressed before merging to ensure long-term maintainability and reduce potential errors. I am unable to approve this pull request, and recommend that another reviewer also takes a look at this code before merging. At a minimum, the high severity issues should be addressed before merging.


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ti-chi-bot[bot]
created_at: 2025-03-12T09:25:35Z
body: > **I have already done a preliminary review for you, and I hope to help you do a better job.**

This pull request is introducing periodic integration tests for the Backup & Restore (BR) feature on various release branches (6.1, 6.5, 7.1, 7.5, and 8.1) of the PingCAP/TiDB project. The changes are applied by adding new configuration files and Jenkins pipeline scripts.

Key Changes:
1. Added new Jenkins pipeline configuration files for each release branch. These files define the pipeline job's properties, parameters, and SCM settings.
2. Added new Jenkins pipeline script files for each release branch. These files define the pipeline stages and steps, such as checkout, prepare, tests, etc.
3. Added new periodic Prow job configuration files for each release branch. These files define the Prow job's properties, such as name, agent, cron schedule, and extra_refs.

Potential problems:

1. Pipeline scripts are copied for each release branch. This could make maintaining these scripts challenging as changes would need to be replicated across all copies.
2. The integration test scripts are downloaded from an HTTP file server. The server's availability and network issues can impact the reliability of the pipeline.
3. The pipeline scripts use a specific kubernetes namespace 'jenkins-tidb'. If this namespace is not available or lacks necessary permissions, the pipeline will fail.

Fixing Suggestions:

1. Consider using a script template or centralizing the shared logic to avoid code duplication across the pipeline scripts for different branches.
2. For the file server, consider having a backup plan, such as retry logic or alternative file servers.
3. Make sure the 'jenkins-tidb' kubernetes namespace is well maintained and has the necessary permissions for the pipeline jobs.

author_association: NONE
user: login: ti-chi-bot[bot]
created_at: 2025-03-12T09:31:00Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

Approval requirements bypassed by manually added approval.

This pull-request has been approved by:

The full list of commands accepted by this bot can be found [here](https://prow.tidb.net/command-help?repo=PingCAP-QE%2Fci).

The pull request process is described [here](https://book.prow.tidb.net/#/workflows/pr)

<details >
Needs approval from an approver in each of these files:

- **[jobs/OWNERS](https://github.com/PingCAP-QE/ci/blob/main/jobs/OWNERS)**
- **[pipelines/OWNERS](https://github.com/PingCAP-QE/ci/blob/main/pipelines/OWNERS)**
- **[prow-jobs/OWNERS](https://github.com/PingCAP-QE/ci/blob/main/prow-jobs/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["purelind"]} -->
author_association: NONE