Jenkins 搭建、流水线一条龙

837 阅读8分钟

基于jenkins高版本后不再支持JDK1.8导致低版本Jenkins会出现插件循环依赖问题。本文从头开始搭建一个新版本的jenkins,跑通一个流水线任务,将代码镜像打包推送到阿里云镜像仓库。

基础环境

JDK 安装

因为业务代码基于JDK1.8构建,而Jenkins新版本最低支持JDK11,所以两个版本的JDK均要支持;

安装JDK1.8

  1. 通过yum命令查找JDK1.8软件包
yum -y list java*
  1. 安装列表中的JDK1.8软件包。
yum -y install java-1.8.0-openjdk-devel.x86_64
  1. 查看JDK版本。
java -version

版本信息如下所示。 image.png

安装JDK11

  1. 安装列表中的JDK11软件包。
yum install fontconfig java-11-openjdk
  1. 查看JDK版本。
java -version

版本信息如下所示。

image.png

JDK安裝问题

如果不是采用yml的方式安装的比如本地上传JDK的安装包或者采用wget的方式下载安装包到linux系统上,那么你需要做如下配置;
# 1.切换到 JDK安装包所在的目录(比如jdk安装包路径在/usr/local/src/jdk) 
cd /usr/local/src/jdk
# 2.解压JDK安装包(比如安装包名称为 jdk-8u131-linux-x64.tar.gz )
tar -zxvf  jdk-8u131-linux-x64.tar.gz
# 3.查看当前目录下的文件
ls
#显示如下信息
[root@iZuf6fo9iq******** jdk]# ls
jdk1.8.0_131  jdk-8u131-linux-x64.tar.gz
#4.切换到解压包里面
cd jdk1.8.0_131
#查找JDK安装路径
[root@iZuf6fo9iq******** jdk1.8.0_131]# pwd
/usr/local/src/jdk/jdk1.8.0_131
# 5.配置环境变量
#5.1 打开配置文件
vim /etc/profile
#5.2 在配置文件末尾,按`i`进入编辑模式
#5.3 添加以下信息
JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_131
PATH=$PATH:$JAVA_HOME/bin 
#5.4 按下`Esc`键,输入`:wq`并回车以保存并关闭文件
#5.5 刷新配置信息 使其立即生效
source /etc/profile
# 6.验证是否成功
java -version
如果用yum安装了 jdk1.8 和JDK11,因为先后的顺序的问题,导致目前生效的JDK非自己所期望的,发现修改/etc/profile也并不生效。
# yam 版本切换
update-alternatives --config java
# 输入你想要的切换的版本number

版本切換信息显示如下: image.png 验证java版本

java -version

版本信息显示如下: image.png

git安装

# linux安装git
yum install git
# 生成密钥文件
ssh-keygen
# 查看公钥文件id_rsa.pub中的内容
cat .ssh/id_rsa.pub
# 查询git安装路径。
whereis git
#  出现git: /usr/bin/git /usr/share/man/man1/git.1.gz
# 其中/usr/bin/git就是安装路径

maven安装

wget方式安装maven

#0.创建maven安装目录
mkdir -p /var/jenkins_home/maven
cd /var/jenkins_home/maven
#1. wget 方式下载 maven 
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
#2.解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
#3.修改配置文件,添加环境变量
vim /etc/profile
#4.添加maven的安装路径到环境变量文件中
export MAVEN_HOME=/var/jenkins_home/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
#5.让配置文件马上生效
source /etc/profile
#6.验证安装效果
mvn -v 
显示信息如下:
[root@iZuf6fo9iq5*****]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /var/jenkins_home/maven
Java version: 11.0.17, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.17.0.8-2.el7_9.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1062.18.1.el7.x86_64", arch: "amd64", family: "unix"

yum方式安装maven

#安装yum配置工具
 yum install -y yum-utils
#使用配置工具配置第三方epel源仓库
yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
yum-config-manager --enable epel-apache-maven
#安装maven
yum install -y apache-maven
# 验证安装效果
mvn -v 

yum安装完毕无需配置 /etc/profile

搭建jenkins

Jenkins安装的前提,必须得有配套的java环境,比如当前安装的Jenkins 2.375.1版本,务必 java JDK最低版本为JDK11。

安装jenkins

# wget拉取jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 导入秘钥,如果以前导入过此处会失败,跳过即可
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# 如果没有安装JDK环境,请执行下面指令安装JDK,如果已安装请跳过
yum install fontconfig java-11-openjdk
# 安装jenkins
yum install jenkins

修改端口

#配置jenkins的端口(默认端口8080)此处演示修改为9090,如无需求跳过该步骤即可
vi /etc/sysconfig/jenkins
#把 JENKINS_PORT="8080" 修改为 JENKINS_PORT="9090"

启动jenkins服务

# service jenkins start | stop | status | try-restart | restart | force-reload | reload |probe

service jenkins start

启动完毕效果如下: image.png

开通ECS服务器端口

此处演示开通9090,在云上的ECS服务器可以通过配置安全组开通端口,然后将安全组与ECS绑定;

image.png

登录jenkins WEB访问,

访问地址:http://IP:端口号 如果需要公网访问,要么ECS服务器上直接挂载公网EIP,要么通过SLB做监听,此处的公网IP要么是ECS的公网EIP,要么就是SLB的公网IP地址; image.png 访问成功后输入密码,根据提示地址查看,输入后可登录成功 选择安装推荐插件

#显示的密码 复制粘贴进入管理员密码即可
cat /var/lib/jenkins/secrets/initialAdminPassword

插件安装

此处采用默认安装推荐插件 image.png

创建管理用户

image.png

进入jenkins

image.png

更换插件源

如果插件下载过慢可以考虑该步骤

http://mirror.esuni.jp/jenkins/updates/update-center.json

image.png

全局配置

之前提前安装了 jdk、git、maven 此时需要做全局配置

image.png

构建流水线

此处采用Pipeline script方式构建流水线,从代码克隆、maven构建、docker制作镜像、上传到阿里云镜像仓库全部用Pipeline script实现;

配置凭证

凭证用于执行流水线过程中拉取代码或者推送镜像到镜像仓库等等操作,常用的有两种账号密码和SSH方式;

配置git仓库的凭证

image.png 此处通过账号密码的方式绑定访问git的账号密码,通过在脚本中通过凭证ID引用账密

配置阿里云镜像仓库凭证

1、登录阿里云账号,在产品服务中搜容器镜像服务 初次进入需要注册账号密码; 建议通过RAM控制访问创建ram子账号,开通控制台访问,配置容器镜像管理权限,然后用子账号登录阿里云镜像仓库;

账号密码要谨记 远程登录仓库用的到; image.png

2、创建一个新的镜像仓库 一个镜像仓库其实对应一个项目的代码仓库

image.png 这里拉仓库代码和Docker构建,我不希望让阿里云帮我构建,而是在Jenkins完成,只是构建完成后并上传到这个刚创建的镜像仓库中。所以选择“本地仓库” image.png 3、配置jenkins访问阿里云镜像仓库的凭证 image.png 此处通过账号密码的方式,绑定访问ram子账号的登录容器镜像的账号密码,通过在脚本中通过凭证ID引用账密;

如果忘记密码可以在下图所示处,修改密码和查找登录账号

image.png

工具配置-ossutil

因为此处构建镜像的dockerfile保存在阿里云OSS,所以需要在Jenkins安装所在的服务器安装ossutil工具

配置ram子账号,用于访问阿里云OSS

1、开通子账号的openapi功能,无需开通访问控制台,保存生成的ak sk;

2、如果存放dockerfile的bucket是私有权限,需要给该子账号配置 OSSAliyunOSSReadOnlyAccess | 只读访问对象存储服务(OSS)的权限 权限;

3、如果存放dockerfile的bucket是公共读,无需配置权限;

Linux系统安装

可以参考: help.aliyun.com/document_de…

#1、创建安装ossutil的目录
mkdir -p /var/jenkins_home/tools
cd /var/jenkins_home/tools
#2、运行以下命令下载ossutil。
wget https://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64 #3、运行以下命令修改文件执行权限 
chmod 755 ossutil64
#4、创建一个.ossutilconfig 用于保存ossutil的配置
vim /var/jenkins_home/tools/.ossutilconfig
#5、使用交互式配置生成配置文件
./ossutil64 config 请输入配置文件名,文件名可以带路径(默认为:/home/user/.ossutilconfig,回车将使用默认路径。 如果用户设置为其它路径,在使用命令时需要将--config-file选项设置为该路径): 未输入配置文件路径,将使用默认配置文件:/home/user/.ossutilconfig。 
对于下述配置,回车将跳过相关配置项的设置,配置项的具体含义,请使用"help config"命令查看。 
请输入endpoint:https://oss-cn-shenzhen.aliyuncs.com 
请输入accessKeyID:yourAccessKeyID 
请输入accessKeySecret:yourAccessKeySecret 
请输入stsToken:yourStsToken 

ossutilconfig 配置完毕如下: image.png path: config文件路径采用自定义

/var/jenkins_home/tools/.ossutilconfig

endpoint:要根据OSS使用地域决定,可参考: help.aliyun.com/document_de…

accessKeyID:配置上一步生成的ram子账号的AK

accessKeySecret:配置上一步生成的ram子账号的SK

stsToken:此处未用到可以直接回车

创建流水线

image.png

脚本

pipeline {
  agent any

  environment {
  	app_env="环境比如dev、sit、uat、prod等"
              -- ${BUILD_NUMBER} 可以动态生成jenkins构建额的版本号
  	image_tag="${app_env}-${BUILD_NUMBER}"
      docker_tag="应用镜像仓库地址:"${image_tag}
      -- 注意此处的仓库地址
      docker_repository_url="registry-vpc.cn-shanghai.aliyuncs.com"
      -- 此处配置 git https地址,因为下面采用的账密方式拉取代码的
      git_url="git地址"
      -- maven 地址
  mvn_home="/var/jenkins_home/maven/"
  -- dockerfile在oss的地址
  dockerfile_path="Dockerfile OSS地址"
  -- ossutil64安装地址
  tools_home = "/var/jenkins_home/tools"
  }

  // stages
  stages {
      stage('checkout') {
          steps {
              echo "1.pull git code"
              script {
                  def checkBranch = "";
                  checkBranch = "代码分支"
                  echo "will be checkout branch: $checkBranch"
                  checkout([$class: 'GitSCM', branches: [[name: "$checkBranch"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'git凭证ID', url: "$git_url"]]])
              }
          }
      }

      // stage('静态检查') {
      //     steps {
      //         echo "starting codeAnalyze with SonarQube......"
      //         sh "${env.mvn_home}/bin/mvn -f pom.xml clean compile sonar:sonar -Dsonar.host.url=sonar地址"
      //     }
      // }

      stage('mvn build') {    
          steps {
              echo "2. maven clean package"  
              sh "${env.mvn_home}/bin/mvn clean package -Dmaven.test.skip=true"  
    }
      }
  
      stage('Build Docker Image') {
          steps {
              echo "3.Build Docker" 
              sh "rm -f $WORKSPACE/Dockerfile"
      sh "${env.tools_home}/ossutil64 --config-file=${env.tools_home}/.ossutilconfig cp $dockerfile_path Dockerfile"
              sh "docker build -t $docker_tag ."
       
          }
    
      }

      stage('docker push') {
          steps {
              echo "4. docker push"
              withCredentials([usernamePassword(credentialsId: '阿里云镜像仓库凭证ID', passwordVariable: 'password', usernameVariable: 'username')]) {
                  sh 'docker login -u $username -p $password  ${docker_repository_url}'
                  sh "docker push $docker_tag"
              }
          }
      }
  }

  post {
      success {
          sh "echo 'success'"

      }

      failure {
          echo "failure"
      }

      unstable {
          echo "unstable"
      }
  }
}

上述脚本部分配置需注意的地方

image_tag :如果image_tag每次构建都一样,将会导致镜像覆盖问题,所以可以考虑${BUILD_NUMBER}拼接获取jenkins每次的构建序号;

应用镜像仓库地址:可以根据实际需求选择

如果Jenkins跟镜像仓库在同一个阿里云主账号下即uid是一致的,那么建议采用专有网路地址,因为在于内网访问快呀,也安全; 应用镜像仓库地址=镜像仓库地址/命名空间/应用名称,比如:registry-vpc.cn-shanghai.aliyuncs.com/uat/jenkins-uat

image.png

dockerfile

FROM centos:7
MAINTAINER test


# 安装软件
RUN yum -y install java-1.8.0-openjdk-devel && yum -y install net-tools.x86_64


ENV APP_HOME=/usr/apps
ENV ENV_TYPE=dev
ENV CONFIG_NAMESPACE=nacos命名空间
ENV EXPOSE_PORT=8080
ENV MAIN_JAR=应用jar包名称(比如user-1.0-SNAPSHOT.jar)
ENV JVM_OPTIONS="-Xms521M -Xmx2G"



# 修改时区
RUN echo "Asia/Shanghai" > /etc/timezone

# 将所需项目文件复制进入容器中
ADD ./target/$MAIN_JAR $APP_HOME/
#ADD ./target/lib/ $APP_HOME/lib/

# 运行项目

CMD java $JVM_OPTIONS -jar -Dspring.profiles.active=$ENV_TYPE -Dspring.cloud.nacos.config.namespace=$CONFIG_NAMESPACE -Dserver.port=$EXPOSE_PORT -Dloader.path=$APP_HOME/lib -Dfile.encoding=UTF-8 $APP_HOME/$MAIN_JAR

EXPOSE $EXPOSE_PORT