一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间,我们可能会因为需求发生变化、功能需要改进、缺陷需要修复等问题要更新服务。这个过程是重复而且是复杂的,也容易出现部署、更新失误的情况。因此我们有了自动构建的需求,和CI/CD(持续构建/持续发布)差不多类似。

我们最后要实现的像图片中这样,可以选择要构建的分支、要发布到哪一台服务器以及要更新的服务,之后点击构建,完成指定的服务构建以及发布到指定的服务器上。
Docker环境docker-compose,建议版本为:Docker Compose version v2.1.1,不然可能会出现docker-compose: not found的情况jenkinsci/blueocean:1.25.7-bcc31d32159f镜像maven:3-alpine镜像docker run \
-e TZ=Asia/Shanghai \
--network host \
-d \
-u root \
--name jenkins \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose \
jenkinsci/blueocean:1.25.7-bcc31d32159f
-v jenkins-data:/var/jenkins_home: 将jenkins容器里面的/var/jenkins_home(jenkins配置信息)映射到Docker volume,并将其命名成jenkins-data
-v /var/run/docker.sock:/var/run/docker.sock: 允许jenkins使用docker环境
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose: 允许jenkins使用docker-compose
第一次访问jenkins地址:http://ip:8080

密码在jenkins启动日志里


选择安装推荐的插件
如果遇到安装部分插件失败,可以去找到系统管理——插件管理——已安装,先卸载掉失败的插件,再去可选插件中搜索并下载.
ps:卸载和下载完需要重启才能生效,但是博主经常遇到点重启,它只关闭不重启,可以手动启动。


Git Parameter Plug-In,git参数化构建,构建时可以指定构建分支Publish Over SSH插件,远程发布Extended Choice Parameter Plugin,选择参数添加扩展功能Docker,集成dockerDocker Pipeline,通过流水线构建和使用Docker容器Docker Compose Buid Step Plugin,集成docker-compose配置gitlab的账号密码

点击系统管理——系统配置









version: "3.0"
services:
holiday-management:
build:
context: holiday-management
args:
APP: target/holiday-management.jar
plan-scheduler:
build:
context: plan-scheduler
args:
APP: target/plan-scheduler.jar
version: "3.0"
services:
holiday-management:
restart: always
image: holiday/management:latest
env_file: ./config/.env
ports:
- 10018:10010
plan-scheduler:
restart: always
image: plan/scheduler:latest
env_file: ./config/.env
ports:
- 10028:10020
pipeline {
agent any
environment {
def remoteId = "${PUBLISH_SSH_SERVER}"
def service_names = "${SERVICE_NAMES}".replace(",", " ")
def half_finished_images = "${service_names}".replace("-", "/").replace(" ", ":latest ")
def images = "${half_finished_images}" + ":latest"
def deploy = "deploy"
}
stages {
stage('项目构建') {
agent {
docker {
image 'maven:3-alpine'
args '-v /home/.m2:/root/.m2'
}
}
steps {
echo "打包项目"
sh 'mvn clean install -DskipTests=true'
echo "构建镜像"
sh "docker-compose -f docker-compose.yml -f docker-compose.dev.yml build ${service_names}"
}
}
stage('下载镜像') {
agent any
steps {
echo "下载镜像"
sh "docker save ${images} -o images.tar"
}
}
stage('发往远程'){
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: """
echo '准备解压发布文件并部署'
cd /home/deploy/cpmc
#解压到当前目录,并去除一级目录
docker load < images.tar
docker-compose up -d ${service_names}
echo '镜像加载成功'
""",
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: "cpmc",
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: "images.tar, config/.env, docker-compose.yml")],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true)])
}
}
}
}
在配置好以上的内容之后,在Dashboard-cpmc-Build with Parameters构建、发布远程

点击构建历史下的最新一次构建——Console Output

构建成功~
ps:如果构建失败可以根据错误提示去解决。博主写这篇博客的时候也是构建了10余次才最后构建成功。。

到这里,整一套自动构建远程发布就实现啦~欢迎留言讨论!
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里