jenkins教程

本来以为不会再使用 jenkins 了。但是遇到了这样的情况:

  • 公司现在使用火山云 cicd,很烂,bug 多,很不好用
  • 多种仓库结构
    • 前后端在同一个仓库
    • 后端多个微服务都在同一个仓库
    • 小程序独立项目结构。多种构建命令,产出不同端,不同目录
    • 前端独立仓库
  • gitlab-cicd 需要迁移代码到 gitlab。发版相关需要结合仓库的权限,分支的命名等。除非自己做二次开发

而 jenkins 这种久经沙场的万金油就不存在这些问题。

shell

# 安装jdk
apt install openjdk-21-jdk -y

官网下载 war 包,配置守护进程

/etc/systemd/system/jenkins.service

ini

[Unit]
Description=jenkins
# 启动区间30s内,尝试启动3次
StartLimitIntervalSec=30
StartLimitBurst=3

[Service]
# 环境变量 $MY_ENV1
# Environment=MY_ENV1=value1
# Environment="MY_ENV2=value2"
# 环境变量文件,文件内容"MY_ENV3=value3" $MY_ENV3
# EnvironmentFile=/path/to/environment/file1
WorkingDirectory=/root
ExecStart=/usr/bin/java -jar /root/jenkins.war
# 总是间隔30s重启,配合StartLimitIntervalSec实现无限重启
RestartSec=30s 
Restart=always
# 相关资源都发送term后,后发送kill
KillMode=mixed
# 最大文件打开数不限制
LimitNOFILE=infinity
# 子线程数量不限制
TasksMax=infinity

[Install]
WantedBy=multi-user.target
# Alias=testserver.service

启动

shell

systemctl enable jenkins --now

因为国内的网络问题,启动大概率会有问题。

此时找到 /root/.jenkins/hudson.model.UpdateCenter.xml 文件,修改 url 为国内源

xml

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>

重启

shell

systemctl restart jenkins

配置一个 nginx 反向代理

nginx

server {
    listen 80;
    server_name jenkins.kentxxq.com;
    return 301 https://$server_name$request_uri;
    access_log /usr/local/nginx/conf/hosts/logs/jenkins.kentxxq.com.log k-json;
}

server {
    http2 on;
    listen 443 ssl;
    server_name jenkins.kentxxq.com;
    access_log /usr/local/nginx/conf/hosts/logs/jenkins.kentxxq.com.log k-json;

    # 普通header头,ip之类的
    include /usr/local/nginx/conf/options/normal.conf;
    # 证书相关
    include /usr/local/nginx/conf/options/ssl_kentxxq.conf;

    location / {
        proxy_pass http://172.16.0.58:8080;
    }
}
  1. 查看 /root/.jenkins/secrets/initialAdminPassword 拿到密码
  2. 安装插件,可能会有一些插件报错。这是因为我们的 jenkins 不是最新版本,而我们的插件源是最新的版本,我们晚点处理。继续做下面的步骤
  3. admin管理界面 通常会有 升级jenkins的选项,升级然后重启 jenkins
  4. 再次检查插件是否有问题,有问题的话就更新或重装插件。
  1. 参数化构建过程, 字符参数 branch, 默认值 prod
  2. 配置流水线

groovy

pipeline{
    agent any
    environment{
        PRO_GROUP = 'prod'
        PROJECT = 'ooo'
        GIT_URL = "https://git.kentxxq.com/xxx/ooo.git"
        GIT_DIR = "/opt/git/$PRO_GROUP/$PROJECT"
        HOST='目标IP地址'
        
        JAVA_DIR="/app/$PROJECT"
        JAVA_NAME = 'ooo.jar'
        PROT=9077
        PKG_DIR = "$GIT_DIR/ooo/target"
        // SCRIPTS_FILE = "$JAVA_DIR/app.sh restart  $JAVA_NAME"
        SCRIPTS_FILE = "supervisorctl stop ooo ; supervisorctl start ooo"
    }
    stages{    
        stage(' git pull'){
         steps{
                // "*/${branch}" 无法使用sha256发版
                checkout([$class: 'GitSCM', branches: [[name: "${env.branch}"]],
                doGenerateSubmoduleConfigurations: false, 
                extensions: [[$class: 'RelativeTargetDirectory', 
                relativeTargetDir: "$GIT_DIR"]],
                submoduleCfg: [], 
                userRemoteConfigs: [[credentialsId: 'gitlab_xiangqiang',
                url: "$GIT_URL"]]])
              }
          }
        stage('mvn package'){
            steps{
                sh "cd $GIT_DIR/  && mvn clean package -Pprod"        
                // sh "cd $GIT_DIR/  && mvn clean install -U -Dmaven.test.skip=true -Ptest"
            }
        }
         stage('scp java'){
              steps{
                  sh "ansible $HOST -m synchronize -a 'src=$PKG_DIR/$JAVA_NAME dest=$JAVA_DIR' "
                //   sh "ansible $HOST2 -m synchronize -a 'src=$PKG_DIR/$JAVA_NAME dest=$JAVA_DIR' "
              }
          }
          stage('restart java'){
              steps{
                  sh  "ansible $HOST -m shell -a '$SCRIPTS_FILE'"
              }
          }
}

}

golang:1.21 容器里构建的时候, 挂载 -v /cache/golang:/go/pkg -v /cache/golang-build-cache:/root/.cache/go-build

groovy

stage("构建产物"){
    agent {
        docker { 
            image "golang:${env.golang_version}"
            args '-v /cache/golang:/go/pkg -v /cache/golang-build-cache:/root/.cache/go-build'
        }
    }
    steps{
        ...
    }
}

pipiline 的描述开启使用 safe html, 操作路径 Jenkins → Configure Global Security → Markup Formatter. Select Safe HTML for the Markup Formatter option

html

<p><a href="https://kentxxq.com">kentxxq.com</a></p>
<p><a href="https://github.com/kentxxq/testserver">代码仓库地址<a/></p>