Jenkins部署

Jenkins部署

部署包:JDK11、Jenkins、Maven、Node等

https://www.oracle.com/java/technologies/downloads/archive/
https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html


http://www.jenkins.io/download/ #war包


https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.387.3/jenkins.war

https://maven.apache.org/download.cgi

https://nodejs.org/download/release/
https://nodejs.org/download/release/v14.17.5/

一 部署包安装

将所有安装包上传到/data目录下

tar zxf jdk-11.0.18_linux-x64_bin.tar.gz
tar zxf jdk-8u361-linux-x64.tar.gz
tar zxf node-v14.17.5-linux-x64.tar.gz
tar zxf apache-maven-3.8.8-bin.tar.gz

1.1 环境系统配置

#1、yumconfig
cat <<EOF > /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF


#2、优化内核参数
cat >> /etc/sysctl.conf <<EOF
vm.swappiness = 0
net.ipv4.ip_forward = 1
EOF

sysctl --system

#3、安装必要的软件包
yum install fontconfig git docker-ce gcc gcc-c++ python3 -y

#4、配置docker加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://8e3pea7v.mirror.aliyuncs.com"
  ]
}
EOF

1.2 部署Jenkins

mkdir /data/jenkins
创建启动脚本 vi /usr/lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins
After=network-online.target
[Service]
Environment="JAVA_HOME=/data/jdk1.8.0_361"
Environment="JENKINS_HOME=/data/jenkins"
Environment="PATH=$PATH:/bin:/usr/bin:$JAVA_HOME/bin:/data/apache-maven-3.8.8/bin:/data/node-v16.14.2-linux-x64/bin"
WorkingDirectory=/data/jenkins
User=root
Group=root
LimitMEMLOCK=infinity
LimitNOFILE=65536
LimitNPROC=65536
LimitAS=infinity
LimitFSIZE=infinity
TimeoutSec=0
RestartSec=2
Restart=always
ExecStart=/data/jdk-11.0.19/bin/java -jar /data/jenkins.war --logfile=/data/jenkins/jenkins.log --httpPort=8080 --httpListenAddress=0.0.0.0
ExecReload=/usr/bin/kill -HUP $MAINPID
ExecStop=/usr/bin/kill -SIGTERM $MAINPID
[Install]
WantedBy=multi-user.target

systemctl enable jenkins.service && systemctl start jenkins.service

1.3 Jenkins页面配置

浏览器访问打开Jenkins部署页面 http://x.x.x.x:8080

cat /data/jenkins/secrets/initialAdminPassword

Jenkins部署

如果没有特殊要求,安装推荐的插件即可

创建管理员用户

Jenkins部署

配置Jenkins访问地址

Jenkins部署

二 Jenkins管理

2.1 管理插件

Jenkins部署

Jenkins部署

安装以下插件

Git Parameter
Build With Parameters
Config File Provider

2.2 管理Jenkins-Managed files

2.2.1 添加一个新的Config – Maven settings.xml

Jenkins部署

指定配置文件id

Jenkins部署

配置Maven settings.xml的内容,需要指定nexus私有仓库地址的同时,配置公共仓库地址,以便maven为java项目打包时能够拉取到对应的依赖包。

    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>私服内部Nexus</name>
      <url>http://172.16.0.217/repository/maven-public</url>
    </mirror>
    <mirror>
      <id>public</id>
      <mirrorOf>*</mirrorOf>
      <name>公共仓库</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>

Jenkins部署

还需要注意nexus默认情况下是需要认证的,配置认证信息。

Jenkins部署

2.2.2 创建用于构建后端java项目docker镜像的dockerfile模板

Jenkins部署

文件内容

FROM 10.114.233.12/baisc/kmbtjdk:v1
ARG PROJECT_PATH=/
WORKDIR ${PROJECT_PATH}
COPY <jar-file> ${PROJECT_PATH}/app.jar
ENV JAVA_OPTS="-Duser.timezone=GMT+08 -Dfile.encoding=utf-8"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar"]

Jenkins部署

2.2.3 创建用于构建前段vue项目docker镜像的dockerfile模板

文件内容

FROM nginx:1.16.1-alpine
ARG HTML_PATH=/usr/share/nginx/html
WORKDIR ${HTML_PATH}
RUN rm ${HTML_PATH}/*
COPY dist/ ${HTML_PATH}/
COPY default.conf /etc/nginx/conf.d/default.conf
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
ENV PATH /usr/local/nginx/sbin:$PATH
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80

Jenkins部署

2.2.4 创建vue项目的nginx配置文件

Jenkins部署

文件内容

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }
}

2.3 配置凭据

Jenkins部署

点击 System – 全局凭据

Jenkins部署

2.3.1 添加凭据-gitlab认证凭据

添加用于拉取代码的gitlab认证凭据

2.3.2 添加凭据-harbor(push images)

添加用于向harbor推送docker镜像的认证凭据

Jenkins部署

2.3.3 添加凭据-harbor

添加用于访问k8s集群认证的凭据

这里的Secret file是从k8s集群的master节点(如果是多个master节点,选择任意一个即可)的/root/.kube/config获取。
注意该文件里面的server项为k8s的apiserver地址,确保可以正常访问。此外还需要将master节点的/usr/bin/kubectl拷贝到Jenkins服务器/usr/bin/kubectl位置

2.4 创建JOB

为了便于统一管理,job一律采用pipeline流水线的方式配置。

2.4.1 创建基于java的后端服务job

Jenkins部署

配置构建保留的数量,节省磁盘空间

Jenkins部署

流水线脚本内容如下

env.GIT_URL = "https://172.16.0.208/nohup/applife_nohup.git" // 代码git仓库地址
env.JAR_FILE = "trunk/ydmall-service/orders/target/orders.jar" // 构建结果jar路径
env.IMAGE = "${JOB_NAME}" // 镜像名称
env.IMAGETAG = "dev-${new Date().format('yyyyMMddHHmmss')}" // 镜像tag
env.NAMESPACE = "dev" // 在k8s上部署的命名空间
env.RegistryUrl = "172.16.0.219" // habor仓库地址
properties([
    parameters([
        gitParameter(
            branch: '',
            branchFilter: 'origin/(.*)',
            defaultValue: 'master',
            name: 'GIT_BRANCH',
            quickFilterEnabled: false,
            selectedValue: 'NONE',
            sortMode: 'DESCENDING_SMART',
            tagFilter: '*',
            type: 'PT_BRANCH_TAG'
        )
    ])
])
node {
    stage('拉取代码') {
        echo "1.拉取代码"
        git credentialsId: 'gitlab', url: "$GIT_URL", branch: "${params.GIT_BRANCH}", changelog: true, poll: false
    }
    
    stage('Maven编译打包') {
        try {
            echo "2. Maven编译打包"
            configFileProvider([configFile(fileId: 'nexus', targetLocation: 'settings.xml')]) {
    // 打包命令,根据实际情况改写
                sh """
                    mvn -am -pl ydmall-service/orders 
                    clean package -T 1C 
                    -Dmaven.test.skip=true 
                    -Dmaven.compile.fork=true 
                    -f trunk/pom.xml 
                    --settings settings.xml
                """
            }
        } catch (exc) {
            println "Maven构建失败 - ${currentBuild.fullDisplayName}"
            throw(exc)
        }
    }
    stage('构建 Docker 镜像') {
        withCredentials([usernamePassword(
            credentialsId: 'harbor',
            usernameVariable: 'DOCKER_HUB_USER',
            passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                echo "3. 构建 Docker 镜像"
                configFileProvider([configFile(fileId: 'dockerfile-java', targetLocation: 'Dockerfile')]) {
                    sh """
                        sed -i "s#<jar-file>#${JAR_FILE}#g" Dockerfile
                        docker login ${RegistryUrl} -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD} && 
                        docker build -t ${RegistryUrl}/项目名称/${IMAGE}:${IMAGETAG} . && 
                        docker push ${RegistryUrl}/项目名称/${IMAGE}:${IMAGETAG} && 
                        docker logout ${RegistryUrl}
                    """
                }
            }
    }
    
    stage('使用kubectl部署') {
        withCredentials([file(credentialsId: 'kubeconfig', variable: 'KUBECONFIG')]) {
            echo "4. 部署到Kubernetes"
            sh """
                cat ${KUBECONFIG} > kconfig
                kubectl --kubeconfig kconfig patch -n ${NAMESPACE} deployment ${IMAGE} -p '{"spec":{"template":{"spec":{"containers":[{"name":"${IMAGE}","image":"${RegistryUrl}/项目名称/${IMAGE}:${IMAGETAG}"}]}}}}'
                rm -f kconfig
            """
        }
    }
}

注意:
1、由于代码分支采用git参数化动态指定,根据其插件规则,项目首次构建需要使用默认分支构建一次来初始化项目,后续则可以自由选择分支来进行构建;
2、pipeline脚本内容这里作为参考,需要根据实际情况进行修改。

2.4.2 创建基于vue的前端服务job

流水线脚本内容如下

env.GIT_URL = "https://172.16.0.208/frontpage/admin.git"
env.IMAGE = "${JOB_NAME}"
env.IMAGETAG = "dev-${new Date().format('yyyyMMddHHmmss')}"
env.NAMESPACE = "dev"
env.RegistryUrl = "172.16.0.219"
properties([
    parameters([
        gitParameter(
            branch: '',
            branchFilter: 'origin/(.*)',
            defaultValue: 'master',
            name: 'GIT_BRANCH',
            quickFilterEnabled: false,
            selectedValue: 'NONE',
            sortMode: 'DESCENDING_SMART',
            tagFilter: '*',
            type: 'PT_BRANCH_TAG'
        )
    ])
])
node {
    stage('拉取代码') {
        echo "1.拉取代码"
        git credentialsId: 'gitlab', url: "$GIT_URL", branch: "${params.GIT_BRANCH}", changelog: true, poll: false
    }
    
    stage('Node编译打包') {
        try {
            echo "2. Node编译打包"
            sh """
                PATH=/bin:/usr/bin:/usr/local/bin:/data/node-v14.17.5-linux-x64/bin  # 使用变量来指定node版本
                npm install
                npm run build:dev
            """
        } catch (exc) {
            println "Node构建失败 - ${currentBuild.fullDisplayName}"
            throw(exc)
        }
    }
    stage('构建 Docker 镜像') {
        withCredentials([usernamePassword(
            credentialsId: 'harbor',
            usernameVariable: 'DOCKER_HUB_USER',
            passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                echo "3. 构建 Docker 镜像"
                configFileProvider([configFile(fileId: 'vue-nginx.conf', targetLocation: 'default.conf'), configFile(fileId: 'dockerfile-vue', targetLocation: 'Dockerfile')]) {
                    sh """
                        docker login ${RegistryUrl} -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD} && 
                        docker build -t ${RegistryUrl}/dev/${IMAGE}:${IMAGETAG} . && 
                        docker push ${RegistryUrl}/dev/${IMAGE}:${IMAGETAG} && 
                        docker logout ${RegistryUrl}
                    """
                }
            }
    }
    
    stage('使用kubectl部署') {
        withCredentials([file(credentialsId: 'kubeconfig', variable: 'KUBECONFIG')]) {
            echo "4. 部署到Kubernetes"
            sh """
                cat ${KUBECONFIG} > kconfig
                kubectl --kubeconfig kconfig patch -n ${NAMESPACE} deployment ${IMAGE} -p '{"spec":{"template":{"spec":{"containers":[{"name":"${IMAGE}","image":"${RegistryUrl}/dev/${IMAGE}:${IMAGETAG}"}]}}}}'
                rm -f kconfig
            """
        }
    }
}

示例

2.4.3 配置自签ca证书

如果gitlab采用的是https协议且为自签名证书,则需要将其ca证书添加到
/etc/pki/tls/certs/ca-bundle.crt文件

Jenkins部署

如果harbor采用的是自签名证书,则需要将其ca证书添加到 /etc/docker/certs.d/服务器名称目录下

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
三千白发的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容