5、Jenkins安装、.Net项目发布到k8s配置
全部文章导航
1、Jenkins安装
1、安装jenkins(参考官方安装文档: https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos)
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
# yum list | grep jenkins
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# sudo yum upgrade
sudo yum install epel-release java-11-openjdk-devel
sudo yum install jenkins
2、启动
sudo systemctl daemon-reload
sudo systemctl start jenkins
# 查看状态
sudo systemctl status jenkins
3、如果开启了防火墙,需要开放端口8080
YOURPORT=8080
PERM="--permanent"
SERV="$PERM --service=jenkins"
firewall-cmd $PERM --new-service=jenkins
firewall-cmd $SERV --set-short="Jenkins ports"
firewall-cmd $SERV --set-description="Jenkins port exceptions"
firewall-cmd $SERV --add-port=$YOURPORT/tcp
firewall-cmd $PERM --add-service=jenkins
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
4、初始化安装插件、创建账号
访问管理界面,访问地址: http://192.168.110.104:8080/ ,Ip需要替换为部署Jenkins服务器的Ip。
4.1、查看并输入密码:
在安装Jenkins服务器,使用cat {PassWordPath}查看密码,{PassWordPath}替换为界面提示路径,记录下密码'd511a516c09a47c2843c0b285e08d565'。将查看到的输入到解锁界面-管理员密码,选择继续。
4.2、下一步: 选择安装推荐的插件
4.2、下一步:创建管理员账号: free/free
5、确认Jenkins服务器安装git
# 确认是否安装
git --version
# 安装
sudo yum install -y git
6、确认Jenkins服务器安装docker
# 确认是否安装
docker --version
# 安装------------------------------------------------------------------------------------------------
# 安装所需的包。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置稳定存储库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io
# centos 8遇到 problem with installed package buildah-1.19.7-1.module_el8.4.0+781+acf4c33b.x86_64 问题
# 方法1 执行yum erase podman buildah 再执行 yum -y install docker-ce
# 设置开机启动
sudo systemctl enable docker
sudo systemctl start docker
7、将jenkins用户添加到docker用户组,不然jenkins用户无法执行docker命令
sudo gpasswd -a jenkins docker
sudo service jenkins restart
8、jenkins插件安装(k8s发布相关)
进入Manage Plugins插件管理界面,选择"可选插件"进行安装,需要勾选重启。
安装Kubernetes CLI
9、确认Jenkins服务器安装了kubectl命令行工具(k8s发布相关)
# 确认是否安装kubectl
kubectl version --client
# 添加基础源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 添加K8S安装源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装
sudo yum install -y kubectl
2、Jenkins发布
1、凭证添加
1.1、进入凭据添加界面
1.2、添加Git账号、密码凭据。如果Git为公开仓库,可以不设置访问凭据。
1.3、添加Harbor用户、密码凭据。
1.3、添加k8s kube config凭据
配置类型选择"Secret file"。从k8s集群导出admin.conf文件,文件目录: /etc/kubernetes/admin.conf。在凭据界面选择导出的admin.conf文件。
2、建立发布任务
2.1、新建Pipeline发布任务
2.2、添加参数
参数清单:
名称 | 类型 | 选项 | 描叙 | 默认值 |
---|---|---|---|---|
BRANCH | Choice Parameter | develop master |
develop: 开发分支 master: 主干分支 |
|
SERVICE | Choice Parameter | order payment |
order:订单服务 payment:支付服务 |
|
ENVIRONMENT | Choice Parameter | Development Test |
Development: 开发环境 Test: 测试环境 |
|
SERVICE_VERSION | String Parameter | 发布版本号 | 1.0.0 | |
REPLICAS | String Parameter | 发布实例数量 | 1 |
添加参数按钮:
参数示例:
2.3、添加流水线(二选一)。
添加脚本。确认好脚本变量信息,添加好脚本后一个任务就算配好了。
第一种方式(Pipeline script)
- 调整变量: harbor_host、harbor_project、harbor_crt_id、git_auth_id、k8s_crt_id
变量名称 | 描述 | 来源 | 示例 |
---|---|---|---|
harbor_host | harbor服务地址,格式: $ | 看Harbor安装服务器和开放端口 | 192.168.110.104:9999 |
harbor_project | harbor项目名称 | 镜像存放的项目,需要配置的harbor账号有该项目权限 | free-test |
harbor_crt_id | harbor凭证Id | 添加凭据时自定义,在Jenkins全局凭证列表查看 | HARBOR_CRT_ID |
git_auth_id | git凭证Id | 添加凭据时自定义,在Jenkins全局凭证列表查看 | GITEE_RIVERBIED |
k8s_crt_id | k8s凭证Id | 添加凭据时自定义,在Jenkins全局凭证列表查看 | KUBE_CONFIG_FILE_ID |
k8s_namespace | k8s发布项目的空间 | 可通过'kubectl create ns free'命令进行创建 | free |
- 脚本信息:
// git
def git_url = 'https://gitee.com/RiverBied/k8-score-demo.git'
def git_auth_id = 'GITEE_RIVERBIED'
// services
def order_api_name = 'order.api'
def order_api_dockerfile_path = 'src/Services/Order.Api/Dockerfile'
def payment_api_name = 'payment.api'
def payment_api_dockerfile_path = 'src/Services/Payment.Api/Dockerfile'
// harbor
def harbor_host = '192.168.110.104:9999'
def harbor_project = 'free-test'
def harbor_crt_id = 'HARBOR_CRT_ID'
// k8s shf
def k8s_crt_id = 'KUBE_CONFIG_FILE_ID'
def k8s_namespace = 'free'
// common
def api_name = ''
def docker_file_path= ''
def docker_image = "${harbor_host}/${harbor_project}/${api_name}:${SERVICE_VERSION}-${ENVIRONMENT.toLowerCase()}"
def service_node_port = ''
def current_timespan = System.currentTimeMillis().toString()
pipeline {
agent any
stages {
stage('参数初始化+代码拉取') {
steps {
script {
switch("$SERVICE")
{
case "order":
api_name = "${order_api_name}"
docker_file_path = "${order_api_dockerfile_path}"
docker_image = "${harbor_host}/${harbor_project}/${api_name}-${ENVIRONMENT.toLowerCase()}:${SERVICE_VERSION}_${current_timespan}"
service_node_port = "32600"
break;
case "payment":
api_name = "${payment_api_name}"
docker_file_path = "${payment_api_dockerfile_path}"
docker_image = "${harbor_host}/${harbor_project}/${api_name}-${ENVIRONMENT.toLowerCase()}:${SERVICE_VERSION}_${current_timespan}"
service_node_port = "32620"
break;
default:
echo '未知项目选项...'
break;
}
}
dir("${ENVIRONMENT.toLowerCase()}") {
// 如果是公开仓库,可以直接使用 git url: "${git_url}" 拉取代码
git branch: BRANCH, credentialsId: "${git_auth_id}", url: "${git_url}"
}
}
}
stage('镜像构建') {
steps {
dir("${ENVIRONMENT.toLowerCase()}") {
sh (script: """
oldImage=\$(docker images ${harbor_host}/${harbor_project}/${api_name}:${SERVICE_VERSION} | grep ${api_name} | awk \'{ print \$1":"\$2 }\')
if [ -z \$oldImage ]; then
echo "正常构建镜像"
else
echo "删除存在镜像"
docker rmi \$oldImage
fi
""")
sh 'pwd'
// 生成镜像
sh "docker build -t ${docker_image} -f ${docker_file_path} ./src/"
// 查看镜像
sh "docker images ${harbor_host}/${harbor_project}/${api_name}"
}
}
}
stage('镜像上传') {
steps {
withCredentials([usernamePassword(credentialsId: "${harbor_crt_id}", passwordVariable: 'harbor_password', usernameVariable: 'harbor_user_name')]) {
sh (script: """
# 登录镜像仓库
HARBOR_PASSWORD=${harbor_password} && echo "\$HARBOR_PASSWORD" | docker login ${harbor_host} -u ${harbor_user_name} --password-stdin
# 推送镜像
docker push ${docker_image}
# 登出
docker logout ${harbor_host}
# 删除镜像
docker rmi ${docker_image}
""")
}
}
}
stage('发布到K8S') {
steps {
dir("${ENVIRONMENT.toLowerCase()}") {
sh """
api_name=${api_name}
deploy_api_name=\${api_name/./-}
export REGISTRY_HOST_IMAGE=${docker_image}
export SERVICE_NAME=\${deploy_api_name}
export SERVICE_VERSION=\${SERVICE_VERSION}
export SERVICE_DEPLOYNAME_NAME=\${deploy_api_name}-deployment
export ASPNETCORE_ENVIRONMENT=${ENVIRONMENT}
export SERVICE_SERVICE_NAME=\${deploy_api_name}-service
export SERVICE_SERVICE_PORT_NAME=\${deploy_api_name}-port
export SERVICE_SERVICE_SELECT_NAME=\${deploy_api_name}
export SERVICE_SERVICE_NODE_PORT=${service_node_port}
export SERVICE_REPLICAS=${REPLICAS}
export K8S_DEPLOY_NAMESPACE=${k8s_namespace}
envsubst < deploy/k8s-master/template/api-deployment.yaml > deploy/k8s-master/template/api-real-deployment.yaml
echo 'deployment发布内容'
cat deploy/k8s-master/template/api-real-deployment.yaml
envsubst < deploy/k8s-master/template/api-service.yaml > deploy/k8s-master/template/api-real-service.yaml
echo 'service发布内容'
cat deploy/k8s-master/template/api-real-service.yaml
"""
withKubeConfig([credentialsId: "${k8s_crt_id}"]) {
sh 'kubectl apply -f deploy/k8s-master/template/api-real-deployment.yaml'
sh 'kubectl apply -f deploy/k8s-master/template/api-real-service.yaml'
}
}
}
}
}
}
示例:
第二种方式(Pipeline script from SCM)
配置从源代码读取Jenkinsfile文件,Jenkinsfile内容为第一种方式的脚本信息。
2.4、执行发布到k8s
1、选择任务,点击Bulid with Parameters,点击开始构建。
2、构建查看,失败可查看详情错误原因。
3、k8s管理后台查看工作负载,可看到已经发布成功。
参考资料
安装: https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
使用: https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/
Jenkins Kubernetes插件搜索: https://plugins.jenkins.io/ui/search?query=Kubernetes
Jenkins 插件Kubernetes-cli:https://plugins.jenkins.io/kubernetes-cli/
Blue Ocean插件: https://plugins.jenkins.io/ui/search?query=BlueOcean
卸载Jenkins
sudo systemctl stop jenkins
sudo yum -y remove jenkins
sudo rm -rf /var/cache/jenkins
sudo rm -rf /var/lib/jenkins/