jenkins 自动化流水线流程创建步骤

511 阅读3分钟

Freestyle项目自动化流程

Freestyle项目创建步骤

image.png

添加对应git路径

image.png

image.png

添加拉取git仓库后的sh脚本

image.png

执行成功

image.png

  • 到这Freestyle项目的自动化流程就创建完毕了
  • 因为Freestyle项目需要交互创建所以会有很多劣势

Jenkins Freestyle项目自动化流程的劣势包括:

  1. 缺乏灵活性:Jenkins Freestyle项目需要事先配置好流程,如果需要更改流程,需要手动编辑项目配置。这种静态的流程定义可能无法适应复杂的动态需求。
  2. 难以维护:Jenkins Freestyle项目通常需要编写大量的脚本和插件,这使得项目变得难以维护。当需要升级或更改插件时,可能需要重新编写或修改现有脚本,这会消耗大量时间和资源。
  3. 难以重用:Jenkins Freestyle项目中的流程定义通常是针对特定项目或特定场景编写的,很难将其重用于其他项目或场景中。这可能导致重复的劳动和资源浪费。
  4. 安全问题:Jenkins Freestyle项目中的脚本可能包含敏感信息,例如密码和证书。如果不妥善保护这些信息,可能会导致安全问题。
  5. 可靠性问题:Jenkins Freestyle项目中的流程可能受到人为错误的影响,例如手动执行流程步骤的错误或计划任务的错误。这可能导致流程执行失败或结果不正确。

pipline项目自动化流程

创建pipline项目

image.png

  • Pipline流程两种方式
    • Pipline script // 直接将代码写在jenkins的script的输入框中
    • Pipline script From SCM // 从代码仓库的目录中自动读取Jenkinsfile来执行
    • 这里我们选择第二种

选择 Pipline script From SCM方式

image.png

选择对应的代码仓库

image.png

读取文件的名称

image.png

在代码中添加Jenkinsfile文件及内容

该脚本使用 Docker 镜像来构建和部署一个基于 Nginx 的 Web 应用程序。

该 Pipeline 包含四个阶段,即 Build、Deploy、gogogo 和 update。在每个阶段中,都有一系列步骤。

在 Build 阶段中,首先指定使用 node:14 镜像作为代理来执行后续的构建任务。在执行步骤时,该阶段使用 npm 安装依赖项,然后运行构建命令。

在 commmit docker image 阶段中,脚本将生成的构建文件部署到 Nginx 容器中,并将容器提交为新的 Docker 镜像。该阶段还包括将部署的应用程序打包并传递到下一个阶段的步骤。

在 push docker images 阶段中,脚本使用 Docker Hub 的凭据登录到一个 Harbor 仓库,并将新的 Docker 镜像推送到该仓库。

在 update service 阶段中,脚本将新的 Docker 镜像拉取到目标服务器上,并使用该镜像启动一个新的 Nginx 容器。

整个 Pipeline 脚本是一个完整的持续集成和持续交付过程,将开发者提交的代码自动构建、测试、打包和部署到生产环境中

pipeline {
    agent any
    environment {
        DOCKER_CONTAINER_NAME = "${env.BUILD_NUMBER}"
        IMAGE_NAME = '192.168.31.44/web/newnginx:latest'
    }
    stages {
        stage('Build') {
            // 此处的意思是将node:14镜像作为代理
            // 下方的steps 中执行的代码都在node:14这个镜像环境中执行
            // 使用镜像执行的好处是可以隔离环境不造成不必要的污染
            // 数据传递可以使用 stash 和 unstash 进行传递
            agent {
                docker { image 'node:14' }
            }
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }

        stage('commmit docker image') {
            steps {
                script {
                    sh 'docker run -itd --name ${DOCKER_CONTAINER_NAME} nginx:latest'
                    sh 'docker cp ./dist/js ${DOCKER_CONTAINER_NAME}:/usr/share/nginx/html/'
                    sh 'docker cp ./dist/css ${DOCKER_CONTAINER_NAME}:/usr/share/nginx/html/'
                    sh 'docker cp ./dist/favicon.ico ${DOCKER_CONTAINER_NAME}:/usr/share/nginx/html/'
                    sh 'docker cp ./dist/index.html ${DOCKER_CONTAINER_NAME}:/usr/share/nginx/html/'
                    sh 'docker commit -m "add content" ${DOCKER_CONTAINER_NAME} newnginx:${DOCKER_CONTAINER_NAME}'
                    sh 'docker kill ${DOCKER_CONTAINER_NAME}'
                }
                // unstash 'app'

            }
        }
        stage('push docker images') {
            steps {
                script {
                    withCredentials([usernamePassword(credentialsId: 'd2ccd81c-5244-43dc-9228-59067b2d1827', passwordVariable: 'DOCKER_HUB_PASSWORD', usernameVariable: 'DOCKER_HUB_USERNAME')]) {
                        sh 'docker login http://harbor.com -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD'
                        sh 'docker tag newnginx:${DOCKER_CONTAINER_NAME} harbor.com/web/newnginx:latest'
                        sh 'docker push harbor.com/web/newnginx:latest'
                    }
                }
            }
        }
        stage('update service') {
            steps {
                script {
                    
                    sh 'echo ${IMAGE_NAME} 1111111111111'
                    sh 'cat > pull.sh <<EOF ls -a EOF'
                    // sh 'cat > pull.sh << EOF"ssh root@192.168.31.109 "docker pull 192.168.31.44/web/newnginx:latest && docker run -d -p 80:80 192.168.31.44/web/newnginx:latest""EOF'
                    sh 'scp pull.sh root@192.168.31.109:/tmp/'
                    sh 'ssh root@192.168.31.109 "chmod +x /tmp/pull.sh"'
                    sh 'ssh root@192.168.31.109 "sh /tmp/pull.sh"'
                }
            }
        }
    }
}
  • 在这段pipline示例中使用到的docker容器的用法
  • 上讲中我们jenkins是使用docker镜像的形式启动的应该是不能调用docker的
  • 下一个章节统一讲一下他们之间的关系,以及为何pipline能够使用docker