CI/CD
https://www.jenkins.io/zh/doc/book/installing/ (jenkens安装手册)
1.首先需要安装docker
2.最低推荐配置:
256MB可用内存
1GB可用磁盘空间(作为一个
Docker容器运行jenkins的话推荐10GB)
为小团队推荐的硬件配置:
1GB+可用内存
50 GB+ 可用磁盘空间
软件配置:
Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDK)都可以。
3.容器中拉取官网 镜像 在本地运行
docker run -u root --rm -d -p 8081:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
4.打开浏览器访问本地docker地址和端口 http://localhost:8081
5.同时间创建自己的git仓库以及镜像仓库
我这里采用的是腾讯云和gitee
https://gitee.com/dashboard
https://console.cloud.tencent.com/tcr/repository/
6.回到jenkins中创建新的任务选择适合自己项目的任务
我这里选择的是流水线方式,把编辑好的脚本放入脚本执行处中,选择构建就执行了
7.这里需要注意的是,配置好相关的凭证以及系统插件
8.我这里下载的插件有gitee,SHH等,以及配置好相关的git用户名&密码,还有凭证token令牌
9.最后是我的执行脚本并把版本信息推送到企微当中l
// 镜像仓库
def harborUri = ‘XXXXXX’
def versionNumber = new Date().format(‘yyyyMMddHHmmss’, TimeZone.getTimeZone(‘Asia/Shanghai’)) + “${env.BUILD_ID}”
// 镜像版本号
def versionNo = “${versionNumber}-alpine-supervisor-php74”
// 代码目录
String codeConfBaseDir=“index”
// 发布脚本路径
String deployShellDir = “deploy”
// 容器外端口
String outerPort=‘8081’
// 容器内端口
String innerPort=‘8080’
// 镜像仓库用户名
def harborUsername=‘111111111’
// 镜像仓库密码
def harborPasswd=‘1111111’
// 镜像命名空间
def harborNamespace = ‘cangku’
// 凭据
def pullCodeCredentialsId = ‘0ebfe617-30ab-4861-9e19-9a99ce4a67e2’
// 代码仓库地址
def repositoryUrl = ‘https://gitee.com’
// 机器人
def robotMap = [
‘test’:‘e41231c-1c321-321ff-82313-1c6af40f11’,
]
// 容器外storage路径
String storagePathPrefix=‘/index/www/index/’
// 容器内storage路径
String innerStoragePath=‘/www/index’
//部署
node {
String currentDir =pwd()
properties([
buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '5')),
// 参数
parameters([
// 运行环境
choice(choices: ['test'], description: '''运行环境(发布时请手动修改环境标识,标识如下:)\n测试环境:test\n生产环境:prod\n''', name: 'runEnv'),
// 分支
choice(choices: ['test','master'], description: '''代码分支(发布时请手动修改分支标识,标识如下:)\n测试分支:test\n生产分支:master\n''', name: 'branch')
])
])
println("运行环境:${runEnv},发布分支:${branch}")
stage ('ready go') {
sh ("rm -rf ${currentDir}/${codeConfBaseDir}/*")
wrap([$class: 'BuildUser']) {
currentBuild.description="${env.BUILD_USER}-${branch}-${versionNumber}"
}
}
stage('pull code') {
checkout([
$class: 'GitSCM',
branches: [[name: "${branch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [ [$class: 'RelativeTargetDirectory', relativeTargetDir: "${codeConfBaseDir}"] ],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: "${pullCodeCredentialsId}",
url: "${repositoryUrl}",
]]
])
println("拉取代码:${repositoryUrl},分支:${branch}")
}
// 构建镜像
def lankouImageVersion = "${versionNo}"
def lankouImageFullPath = "${harborUri}/${harborNamespace}"
stage('build image') {
sh ("ls ${codeConfBaseDir} -al")
sh """
cd ${codeConfBaseDir} && docker build --no-cache -f Dockerfile \
--build-arg PROJECT_ENV="${runEnv}" \
-t ${harborUri}/${harborNamespace}:${versionNo} .
"""
}
// 推送镜像
stage('push image') {
sh """
docker login --username=${harborUsername} --password=${harborPasswd} ${harborUri}
docker push ${harborUri}/${harborNamespace}:${versionNo}
docker rmi -f ${harborUri}/${harborNamespace}:${versionNo}
"""
}
// 机器人推送版本号
stage ('push msg') {
sh """
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${robotMap[runEnv]}' \\
-H 'Content-Type: application/json' \\
-d '
{
"msgtype": "text",
"text": {
"content": "特斯拉,环境:${runEnv},镜像构建成功,版本号:${harborUri}/${harborNamespace}:${versionNo}"
}
}'
"""
sh ("rm -rf ${currentDir}/${codeConfBaseDir}/*")
}
stage ("echo version") {
println("特斯拉,环境:${runEnv},镜像构建成功,版本号:${harborUri}/${harborNamespace}:${versionNo}")
}
}