首页 文章 精选 留言 我的

精选列表

搜索[ci],共5727篇文章
优秀的个人博客,低调大师

【CI/CD技术专题】「Jenkins实战系列」(3)Jenkinsfile+DockerFile实现自动部署

每日一句 没有人会因学问而成为智者。学问或许能由勤奋得来,而机智与智慧却有懒于天赋。 前提概要 Jenkins下用DockerFile自动部署Java项目,项目的部署放心推向容器化时代机制。 本节需要对jenkinsfile有点了解,对dockerfile有点了解,对shell有点了解,对docker有点了解 环境准备 新建-构建一个Maven项目 需要提一下,现在新安装的没有这个选项,需要在插件里安装一下 Maven Integration java配置,其他配置查看以前文章 发布到服务器,DockerFile部署自动构建 Publish SSH配置 执行流程 jenkins拉取代码仓库中的代码 jenkins执行jenkinsfile文件(可指定文件名) 先在jenkins所在的服务器将拉取的项目build成docker镜像 将镜像发布到镜像仓库 在应用服务器的节点上将该镜像拉取下来(私有仓库需要用户名/密码) 在应用服务器上执行该镜像 jenkins配置 创建一个Pipeline SCM项目 jenkins项目名为sample-tezst (和发布的工程名保持一致) Definition选择 【Pipeline Script from SCM】 Branch Specifier(blank for 'any'):选择分支 Additional Behaviours: 添加邮箱通知的发送者 Script Path: 填写使用项目中的Jenkinsfile文件的名字 应用工程配置 在工程的根目录下创建Dockerfile文件和Jenkins_docker文件 jenkinsfile_docker文件内容如下: docker集成docker部署 pipeline { agent {label 'master'} tools{ maven 'maven' } environment { GIT_PROJECT_ADDR="git@gitee.com:uncleqiao/springboot-test.git" //项目的git地址 JENKINS_WORKSPACE="/root/.jenkins/workspace" //jenkins存放文件的地址 PROJECT_NAME="${JOB_NAME}" // 项目名 JAR_NAME="sample-tezst-0.0.1-SNAPSHOT.jar" // 项目生成的jar的名字 IMAGE_NAME="sample-tezst" // 镜像名一般和项目名相同 IMAGE_ADDR="repository/qiao_namespace/${IMAGE_NAME}" // 镜像的位置 VERSION_ID="${BUILD_ID}" } stages { stage('pullCode'){ steps{ echo 'This is a pullCode step' //git branch: "${BRANCH}", credentialsId: '1001', url: "${GIT_PROJECT_ADDR}" checkout scm } } stage('Build') { steps{ echo 'This is a Build step' // 在有Jenkinsfile同一个目录下(项目的根目录下) sh 'mvn clean package -Dmaven.test.skip=true' } } // 创建目录(如果不存在),并把jar文件上传到该目录下 stage('ssh') { steps{ echo 'push jar to target server' sh ''' ole_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'` if [[ -n "${ole_image_id}" ]]; then docker rmi -f ${ole_image_id} fi docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${IMAGE_NAME}:${VERSION_ID} . new_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'` sudo docker tag ${new_image_id} ${IMAGE_ADDR}:${VERSION_ID} sudo docker push ${IMAGE_ADDR}:${VERSION_ID} ''' } } stage('run') { // 在应用服务器节点 test agent { node { label 'test' //customWorkspace "${SERVER_TARGET_PATH}" //此参数会初始化目录 注意填写 } } options { // 不让它切换到节点上自动从仓库拉取项目 skipDefaultCheckout() } steps { echo 'pull image and docker run' withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) { sh ''' sudo docker login --username=yourusername --password=yourpassword ccr.ccs.tencentyun.com sudo docker pull ${IMAGE_ADDR}:${VERSION_ID} container_id=`docker ps|grep ${IMAGE_ADDR}:${VERSION_ID}|awk '{print $1}'` if [ -n "${container_id}" ]; then docker rm -f "${container_id}" fi old_pid=`ps -ef|grep ${JAR_NAME}|grep -v grep|awk '{print $2}'` if [[ -n $old_pid ]]; then kill -9 $old_pid fi old_image=`docker images|grep ${IMAGE_ADDR}|grep ${VERSION_ID}` if [[ -n $old_image ]]; then old_image_id=`echo ${old_image}|awk '{print $3}'` docker rmi -f ${old_image_id} fi sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${IMAGE_ADDR}:${VERSION_ID} ''' } } } } } 注意: if [ -n str ] 这个命令在使用的时候如果str为空,也是true,可以使用 if [ -n ${str} -a "${str}x" != "x" ]或者使用if [[ -n ${str} ]]来判断 shell语法中,$()` 和 `` (两个单引号) 可以在子shell中执行命令,但是这儿$()不支持 idea没有jenkinsfile的语法提示,很容易出错,这个很难受 步骤一:拉取项目 在【pullCode】步骤中 checkout scm , 这个scm是创建jenkins流水线时选择的,属于特殊变量,代表了你的仓库信息,自动从仓库中获取项目 步骤二: 【Build】 将拉取下来的项目进行编译并打包 步骤三:【build_image】 将打包好的项目build成docker镜像,然后推送到镜像仓库(这里可以分成两步) 获取已经存在的镜像 ole_image_id=`docker images| grep ${IMAGE_NAME} | grep ${VERSION_ID}|awk '{print $3}'` 删掉存在的镜像 if [[ -n "${ole_image_id}" ]]; then docker rmi -f ${ole_image_id} fi 通过项目根目录下的Dockerfile来构建镜像 -f:[filename] --build-arg <key=value> 给Dockerfile传递参数 -t:镜像的名称:版本 这里我将jenkins的构建次数当作镜像的版本 docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${IMAGE_NAME}:${VERSION_ID} . 获取构建好的镜像的id new_image_id=`docker images | grep ${IMAGE_NAME} | grep ${VERSION_ID} | awk '{print $3}'` 根据生成的镜像,tag出一个名称空间不同的镜像 sudo docker tag ${new_image_id} repoistory/qiao_namespace/${IMAGE_NAME}:${VERSION_ID} 将镜像仓库能够识别的镜像推送到仓库 sudo docker push repoistory/qiao_namespace/${IMAGE_NAME}:${VERSION_ID} 步骤四:【run】 应用服务器拉取项目并且运行, 这一步要选择节点(应用服务器,如果是集群,就不用节点用scp登陆吧) 登陆到镜像仓库 sudo docker login --username=yourusername --password=yourpassword repository 从仓库中拉取刚才生成的镜像 sudo docker pull repository/qiao_namespace/${IMAGE_NAME}:${VERSION_ID} 查看已经存在的容器, 存在则删掉 存在则删掉 这里应该是一个数组,有点小问题,待修改 container_id=`docker ps | grep ${IMAGE_ADDR}:${VERSION_ID} | awk '{print $1}'` if [ -n "${container_id}" ]; then docker rm -f "${container_id}" fi 查看已经运行的同版本的项目, 存在则删掉 pid=`ps -ef | grep ${JAR_NAME}| grep -v grep | awk '{print $2}'` if [[ -n $pid ]]; then kill -9 $pid fi 查看已经存在的镜像 old_image=`docker images|grep ${IMAGE_ADDR}|grep ${VERSION_ID}` if [[ -n $old_image ]]; then old_image_id=`echo ${old_image}|awk '{print $3}'` docker rmi -f ${old_image_id} fi 运行容器 sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${IMAGE_ADDR}:${VERSION_ID} Dockerfile 文件内容如下 FROM repository/qiao_namespace/myjdk8:v1 默认jar包的名字 注意分隔符为 :- 这里是由jenkinsfile中build dockerfile时传递过来的 ARG jar_name={jar_name:-sample-teszt-0.0.1-SNAPSHOT.jar} RUN 用于容器内部执行命令 RUN mkdir -p /usr/local/project WORKDIR /usr/local/project 将项目放到/usr/local/project下 COPY ./target/sample-teszt-0.0.1-SNAPSHOT.jar ./ EXPOSE 8081 CMD java -jar -Dserver.port=8081 springboot-test-0.0.1-SNAPSHOT.jar 执行完毕后我们登陆到应用服务器,看到容器已经启动

优秀的个人博客,低调大师

如何破局CI工具拉锯战:探寻中小企业的持续集成之路

摘要:随着持续集成技术的不断成熟,各种持续集成相关的开源和商用软件层出不穷,但是对于中小型企业的技术团队而言,往往在进行持续集成实践时会陷入工具之间的拉锯战。那么,对于中小团队而言,如何才能实现高效敏捷的持续集成方案?2017苏州云栖大会云效专场上,南京路特CTO、阿里云MVP戚俊结合实践经验为大家分享了中小团队持续集成之路。 以下内容根据演讲视频以及PPT整理而成。 虽然持续集成的概念已经火了很长时间了,但是因为各个企业的规模以及业务类型都不同,所以在持续集成中遇到的问题也各不相同。本次将结合南京路特的实践经验为大家分享中小团队的持续集成之路。本次的分享主要围绕着困境、敏捷开发、工具链、架构和收获这5个方面阐述路特自己所走过的持续集成之路。 困境 对于南京路特而言,在没有和阿里的云效平台结合之前所遇到的最为核心的3个问题就是成本问题

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册