5、Jenkins安装、.Net项目发布到k8s配置

全部文章导航

点此查看K8S、Jenkins持续集成环境搭建全部文章

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'。将查看到的输入到解锁界面-管理员密码,选择继续。

image-20210926205934479

4.2、下一步: 选择安装推荐的插件
4.2、下一步:创建管理员账号: free/free

image-20210927091637912

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插件管理界面,选择"可选插件"进行安装,需要勾选重启。

image-20210929175734605

​ 安装Kubernetes CLI

image-20210928191843787

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、进入凭据添加界面

image-20210927134920679

image-20210927135001103

1.2、添加Git账号、密码凭据。如果Git为公开仓库,可以不设置访问凭据。

image-20210927142741014

1.3、添加Harbor用户、密码凭据。

image-20210927135347893

1.3、添加k8s kube config凭据

配置类型选择"Secret file"。从k8s集群导出admin.conf文件,文件目录: /etc/kubernetes/admin.conf。在凭据界面选择导出的admin.conf文件。

image-20210929181408156

image-20210929181256660

2、建立发布任务

2.1、新建Pipeline发布任务

image-20210929182956698

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

添加参数按钮:

image-20210929183043073

参数示例:

image-20210929183427544

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'
          }
        }
        }
       }
    }
}

示例:

image-20210929183758773

第二种方式(Pipeline script from SCM)

配置从源代码读取Jenkinsfile文件,Jenkinsfile内容为第一种方式的脚本信息。

image-20210929200527927

2.4、执行发布到k8s

1、选择任务,点击Bulid with Parameters,点击开始构建。

image-20210929191933485

2、构建查看,失败可查看详情错误原因。

image-20210929192210763

3、k8s管理后台查看工作负载,可看到已经发布成功。

image-20210929192446504

参考资料

安装: 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/
posted @ 2021-10-15 08:58  江边飞鸟  阅读(739)  评论(0编辑  收藏  举报