一、kubesphere的develops流水线创建
必须使用“使用 Jenkinsfile 创建流水线”,看官方文档:使用 Jenkinsfile 创建流水线
也就是说,Jenkinsfile文件必须git仓库里,我们一般将Jenkinsfile文件放在源码一起同的git仓库,习惯我们放在git仓库的一级目录。
1、创建流水线,点击“代码仓库”---"git",我们在内网搭建的gitlab私有仓库,所以这里选择"git",填写git地址和凭证,点击对钩,“下一步”。
2、设置Jenkinsfile路径和查看WebHook地址,如下图
记住这里的WebHook地址。
“正则过滤”可以过滤分支,比如我们只创建develop分支,正则里填写“develop”;注意,若有多个分支,最好创建2个流水线,不然会同时触发多分支。(若有好的方法再补充)
kubesphere的流水线配置就这样结束了。Jenkinsfile脚本代码内容:
pipeline {
agent {
node {
label 'base'
}
}
stages {
stage('拉取代码') {
agent none
steps {
container('base') {
// echo "--printenv --"
// sh 'printenv'
checkout(scm)
script {
gitbranch=env.GIT_BRANCH
if(env.GIT_BRANCH=="develop"){
env_name="test"
env_name_big="Test"
}
else if(env.GIT_BRANCH=="master"){
env_name="prod"
env_name_big="Production"
}
}
// echo "env_name=${env_name}"
// echo "env_name_big=${env_name_big}"
// echo "gitbranch=${gitbranch}"
// echo "GIT_COMMIT=${GIT_COMMIT}"
sh '''pwd
ls'''
}
}
}
stage('构建镜像') {
agent none
steps {
container('base') {
// echo "env_name=${env_name}"
// echo "env_name_big=${env_name_big}"
// echo "gitbranch=${gitbranch}"
// echo "GIT_COMMIT=${GIT_COMMIT}"
script {
docker_image_url="${REGISTRY}/${DOCKERHUB_NAMESPACE}/${APP_NAME}:${env_name}${timestr}_${BUILD_NUMBER}"
}
// echo "docker_image_url=${docker_image_url}"
//sh "echo ${docker_image_url}"
sh 'mv ${web_dictionary_name}/Dockerfile .'
sh " docker build --build-arg ASPNETCORE_ENVIRONMENT=${env_name_big} -t ${docker_image_url} . "
echo '镜像打tag完成了'
}
}
}
stage('推送镜像到Harbor仓库') {
agent none
steps {
container('base') {
// echo "env_name=${env_name}"
// echo "env_name_big=${env_name_big}"
// echo "gitbranch=${gitbranch}"
// echo "GIT_COMMIT=${GIT_COMMIT}"
// echo "docker_image_url=${docker_image_url}"
withCredentials([usernamePassword(credentialsId : 'harbor-auth' ,passwordVariable : 'password_var' ,usernameVariable : 'username_var' ,)]) {
//echo '本地镜像上传到harbor---start'
sh " docker login -u ${username_var} -p ${password_var} ${REGISTRY}"
sh " docker push $docker_image_url "
//echo '本地镜像上传到harbor-ok'
}
}
}
}
stage('部署') {
agent none
environment {
env_name_big = "${env_name_big}"
env_name = "${env_name}"
}
steps {
container('base') {
echo "env_name=${env_name}"
echo "env_name_big=${env_name_big}"
echo "gitbranch=${gitbranch}"
echo "GIT_COMMIT=${GIT_COMMIT}"
echo "docker_image_url=${docker_image_url}"
withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')]) {
sh 'envsubst < ${web_dictionary_name}/deploy/svc.yml | kubectl apply -f -'
}
script {
if(env_name=="prod")
{
// echo "http请求更改版本号"
// echo docker_image_url
sh """ curl -X 'POST' '${version_update_posturi}' -H 'accept: text/plain' -H 'Content-Type: application/json-patch+json' -H 'request-from: swagger' -d '{ "appCode": "${APP_NAME}", "appVersionInfo": "${GIT_COMMIT}", "dockerImageUrl": "${docker_image_url}" }'"""
echo "http请求更改版本号成功!"
}
}
echo "自动构建成功!"
}
}
}
}
environment {
APP_NAME = 'test-api'
web_dictionary_name = 'Test.WebAPI'
version_update_posturi='http://10.120.34.5/api/version/BuildNum'
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITHUB_CREDENTIAL_ID = 'github-id'
KUBECONFIG_CREDENTIAL_ID = 'kubeconfig'
REGISTRY = '150.10.1.26'
DOCKERHUB_NAMESPACE = 'default'
GITHUB_ACCOUNT = 'kubesphere'
timestr=new Date().format("yyyyMMdd")
gitbranch=''
env_name=''
docker_image_url=''
}
}
还有个坑,我们的kubesphere的版本是3.2.1,更高版本我不清楚。我们部署的是2个集群,一个kubephere主集群和一个成员集群(所有webapi开发的站点都部署在这个集群)。 创建流水线页面上显示的webhooks地址显示的是主集群地址,其实是错误的,应该是成员集群的master的地址。所有gitlab的webhooks的地址一定要是 成员集群master的地址。当然若是“All-In-One”模式就不会有这个问题。
二、gitlab的Webhooks配置
打开刚刚指定的git地址,“Settings”--"Webhooks", URL填写 kubesphere中刚刚看到的webhooks地址。
记住,这里只勾选“Push events”,填写"develop"分支名。
不要勾选“Merge request events”,不要勾选“Merge request events”,不要勾选“Merge request events”。 因为Merge代码请求同意的时候,是推Push事件,所以只要勾选第一个就行了。
为了支持多分支,gitlab里创建多个webhooks。
三、Jenkinsfile脚本编写
需要获取一些git的参数,比如分支名,git commit id等数据。可以先打印下环境变量,若里面有相关的值就可以直接使用。
sh 'printenv'
就可以发现有几个环境变量可以直接使用。
env.BRANCH_NAME //分支名
env.GIT_BRANCH //分支名
env.GIT_COMMIT //git commit id