一、部署Jenkins(建议使用安装版jenkins,docker版的容器里套容器会有问题,且不合理)
1.更新yum源:
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
2.下载安装包
wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm
3.安装
rpm -ivh jenkins-2.156-1.1.noarch.rpm
4,修改配置:
vim /etc/sysconfig/jenkins
5,浏览器访问自己配置的端口
此时需要输入密码,具体看浏览器显示的那个路径,去看一下:cat xxx
6.安装插件 所有关于pipleline的插件都需要安装,如果安装有问题的,可以直接跳过,
此时会提醒更新最新版本Jenkins,点更新就好,
此时在这里更新刚刚没有下好的插件
(此时可以试一下该机器是否可以clone代码)
git init git remote add origin ssh://[email protected]:2222/liming/microservice.git git add . git commit -m "Initial commit" git push -u origin master
二、建个流水线的项目:
1.Jenkins中:
配置scm
这里的Jenkinsfile是放在项目中的,Jenkins构建时就会去找该脚本
脚本示范:
// 需要在jenkins的Credentials设置中配置jenkins-harbor-creds、jenkins-k8s-config参数
pipeline {
agent any
environment {
HARBOR_CREDS = credentials('jenkins-harbor-creds')
K8S_CONFIG = credentials('jenkins-k8s-config')
GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
}
parameters {
string(name: 'HARBOR_HOST', defaultValue: '仓库ip', description: 'harbor仓库地址')
string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker镜像名')
string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中标签名')
string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名称')
}
stages {
stage('Maven Build') {
when { expression { env.GIT_TAG != null } }
agent {
docker {
image 'maven:3-jdk-8-alpine'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
stash includes: 'target/*.jar', name: 'app'
}
}
stage('Docker Build') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent any
steps {
unstash 'app'
sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
}
}
stage('Deploy') {
when {
allOf {
expression { env.GIT_TAG != null }
}
}
agent {
docker {
image 'lwolf/helm-kubectl-docker'
}
}
steps {
sh "mkdir -p ~/.kube"
sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
}
}
}
}
三、配置git调用Jenkins打包:
1.在Jenkins中配置令牌:
如果没有此功能,这是由于权限问题导致的
注释:跨站请求伪造保护最新Jenkins页面无法开启,在安装目录设置:
vim /etc/sysconfig/jenkins
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
配置后需要重启jenkins:
service jenkins restart
生效后就如前图所示
2.复制链接到刚刚gitab打开的触发器页面:
此时如果gitlab设置Webhooks报错Urlis blocked: Requests to localhost are not allowed。admin 登录设置
然后再添加完毕:
然后可以测试一下:
返回201,说明成功(注意 JENKINS_URL/job/jobname/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME)
此时Jenkins的构建任务也在运行了
四、对刚刚列出的脚本说明:
最好是用安装办maven,案例中使用的maven是docker镜像,想修改setting文件的话有点麻烦
如果使用当机器的maven,此时需要下载Jenkins的maven插件:
全局配置中要配置一下
还有环境变量也要配置一下:
这时才可以在Jenkinsfile中使用mvn命令
3.dockerbuild:
这里步骤中的五句话:
第一句,使用的哪个app包
第二句,登录Harbor
第三句,制作临时镜像 ,此时会使用到dockerfile,可以参考docker的搭建,写一个dockerfile,示范:
FROM openjdk:8-jdk-alpine
#构建参数
ARG JAR_FILE
ARG WORK_PATH="/opt/demo"
# 环境变量
ENV JAVA_OPTS="" \
JAR_FILE=${JAR_FILE}
# 切换源
RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories
#设置时区
RUN apk update && apk add ca-certificates && \
apk add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
COPY target/$JAR_FILE $WORK_PATH/
WORKDIR $WORK_PATH
ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE
示范中的命令:
这个有可能因为网络原因下载失败,此时在他的上一步添加一行切换源就可以了:
RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories
注意:哪个项目需要发布的,dockerfile就在哪个项目下
第四句,推送镜像
第五句,删除本地临时镜像
4.发布:
这里使用的kubectl镜像命令发布
四句话:
第一句,创建文件夹
第二句 ,寻找下一步使用的config,来验证k8s
第三句,这个项目中有个发布模板,参考k8s搭建中发布模板,这个命令是讲参数写入模板.tpl,生成发布文件yml ,附上tpl示范:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {APP_NAME}-deployment
labels:
app: {APP_NAME}
spec:
replicas: 1
selector:
matchLabels:
app: {APP_NAME}
template:
metadata:
labels:
app: {APP_NAME}
spec:
containers:
- name: {APP_NAME}
image: {IMAGE_URL}:{IMAGE_TAG}
ports:
- containerPort: 40080
env:
- name: SPRING_PROFILES_ACTIVE
value: {SPRING_PROFILE}
第四句,发布
五、上一步中有登录harbor,此处需要配置密码:
还需要配置k8s的kube.config,示范配置:
apiVersion: v1kind: Configclusters:- name: "test" cluster: server: "https://ip" api-version: v1 certificate-authority-data: "xxxxxx"users:- name: "root" user: token: "你的token"contexts:- name: "test" context: user: "user1" cluster: "test"current-context: "test
然后编码:
base64 kube-config.yml > kube-config.txt
然后类似上一步,在jenkins凭据中增加配置文件内容。在凭据设置界面,类型选择为“Secret text”,ID设置为“jenkins-k8s-config”(此处的ID必须与Jenkinsfile中的保持一致),Secret设置为上面经过base64编码后的配置文件内容。
六、测试任务,立即构建:
成功后可以在镜像仓库中查看到镜像:
可以在k8s面板中看到运行的服务: