CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps 实践分享

这周一,我们迫不及待写下了最新的 changelog —— 项目语言新增「Java」。创建 Java 项目工作流和其它语言项目配置很相似,flow.ci 提供了默认的 Java 项目构建流程模版,快去试试吧~

最近 flow.ci 2017 招聘计划正式启动,我们需要高级 Ruby 工程师、 高级前端工程师、DevOps 运维开发工程师、产品经理、初级工程师的加入,一起赋予 flow.ci 更稳定流畅的体验,更简洁的形象和更未来的气质,职位详情见 这里,欢迎自荐或推荐 :)

这期 CI Weekly 收录了即刻技术团队 Docker 实践、携程容器云实践、持续集成与自动化测试、DevOps平台的自动化部署设计等技术分享,一起来看看~

创业公司小团队为什么要使用Docker

Docker几乎就是一个进程简单的包装,只有很少的额外开销,启动速度也几乎相当于直接启动应用进程。对于没有专职运维的即刻团队,很自然的从项目开始就使用 Docker 来做服务的发布工具。(via:即刻技术团队

docker 搭建测试环境的实践

容器技术慢慢开始普及的今天,对测试人员有什么变革性的影响。这篇文章作者聊了下Docker在公司的测试环境中扮演了的角色。 (via: Testerhome @ycwdaaaa) ​​​​

携程容器云实践&version=12020110&nettype=WIFI&fontScale=100&pass_ticket=xIlmY9uMWAoJBZ37yD6DaJ60Qf/fqb+UU2hhB/TFZJB5aepzt6auLJmhEf5R6ewv)

这篇文章介绍了携程技术团队容器云的相关实践,包括实践在线旅游与弹性需求、容器云定位、容器部署基本原则、容器编排选型&取舍、容器网络选型、Docker遇到的问题、容器监控方案、CDOS Overview。(via:公众号携程技术中心)

持续集成CI与自动化测试

很多公司对持续集成、自动化测试都有不同的研究,这篇 Slide 记录了关于持续集成CI与自动化测试的一些思考与经验。(via:博客园@PetterLiu

DevOps平台中的自动化部署框架设计&version=12010210&nettype=WIFI&fontScale=100&pass_ticket=MuCQrPNa5MvcyflFZY7lO77HaI15UZFgIvXUFzuEr0w8nIWuap9aQUFENgwYF5m6)

为实现 DevOps 以产品为核心,以项目管理为驱动,将需求、设计、交付、运维整个链路打通,看看他们如何设计DevOps平台中的自动化部署框架。(via : 微信公众号EAWorld)

ThoughtWorks技术雷达 Vol.16

ThoughtWorks 发布了最新一期的技术雷达,帮助你了解 IT 技术、工具、平台和语言及框架的最新动向。(via : ThoughtWorks

Chrome DevTools 代码覆盖率功能详解

本文介绍了 Chrome Canary 新增的代码覆盖率功能、如何收集数据、如何基于它收集的数据来改进 WEB 应用的性能。(via : 知乎王仕军

Security 101 for SaaS startups

这是一篇写给 SaaS 型初创企业的安全建议, 按照初创企业的成长阶段, 罗列了应该需要注意的安全事项,值得一看。

英文原文: Security 101 for SaaS startups

中文翻译: SaaS型初创企业安全101

__

以上是 CI Weekly #17 的所有技术分享,
如有问题,请联系我们~

Happy building!
flow.ci

CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Tips 。同步于 flow.ci Blog、微信公众号、官方微博知乎专栏简书,欢迎关注或投稿:)

PS C:\Users\Administrator> # Ultimate-ProjectCleanup.ps1 >> $projectRoot = "E:\ProjectEcosystem\ProjectMonitor" >> >> # 1. 创建完整的文件夹结构 >> $folders = @( >> "SQLite", >> "Logs", >> "Database", >> "Scripts", >> "Config", >> "Binaries", >> "SourceFiles", >> "Documentation", >> "Libraries", >> "BuildOutputs" >> ) >> >> foreach ($folder in $folders) { >> $path = Join-Path $projectRoot $folder >> if (-not (Test-Path $path)) { >> New-Item -ItemType Directory -Path $path -Force | Out-Null >> } >> } >> >> # 2. 增强的SQLite文件移动(包含PDB和XML) >> $sqlitePatterns = @( >> "System.Data.SQLite.*", >> "SQLite.Interop.*", >> "sqlite3.*", >> "SQLite.NET.*" >> ) >> >> foreach ($pattern in $sqlitePatterns) { >> $files = Get-ChildItem -Path $projectRoot -Filter $pattern -File >> foreach ($file in $files) { >> $destDir = Join-Path $projectRoot "SQLite" >> $destPath = Join-Path $destDir $file.Name >> >> if (-not (Test-Path $destDir)) { >> New-Item -ItemType Directory -Path $destDir -Force | Out-Null >> } >> >> Move-Item -Path $file.FullName -Destination $destPath -Force -ErrorAction SilentlyContinue >> if ($?) { >> Write-Host "✅ 已移动SQLite文件: $($file.Name) -> SQLite\" -ForegroundColor Cyan >> } >> } >> } >> >> # 3. 移动所有程序数据库文件(PDB)到BuildOutputs >> $pdbFiles = Get-ChildItem -Path $projectRoot -Filter "*.pdb" -File >> foreach ($pdb in $pdbFiles) { >> $destDir = Join-Path $projectRoot "BuildOutputs" >> $destPath = Join-Path $destDir $pdb.Name >> >> Move-Item -Path $pdb.FullName -Destination $destPath -Force >> Write-Host "✅ 已移动PDB文件: $($pdb.Name) -> BuildOutputs\" -ForegroundColor Cyan >> } >> >> # 4. 移动所有XML文档文件到Documentation >> $xmlFiles = Get-ChildItem -Path $projectRoot -Filter "*.xml" -File >> foreach ($xml in $xmlFiles) { >> $destDir = Join-Path $projectRoot "Documentation" >> $destPath = Join-Path $destDir $xml.Name >> >> Move-Item -Path $xml.FullName -Destination $destPath -Force >> Write-Host "✅ 已移动文档: $($xml.Name) -> Documentation\" -ForegroundColor Cyan >> } >> >> # 5. 移动其他库文件到Libraries >> $libraryPatterns = @("*.dll", "*.lib", "*.a") >> foreach ($pattern in $libraryPatterns) { >> $files = Get-ChildItem -Path $projectRoot -Filter $pattern -File >> foreach ($file in $files) { >> # 排除已处理的SQLite文件 >> if ($file.FullName -notlike "*\SQLite\*") { >> $destDir = Join-Path $projectRoot "Libraries" >> $destPath = Join-Path $destDir $file.Name >> >> Move-Item -Path $file.FullName -Destination $destPath -Force >> Write-Host "✅ 已移动库文件: $($file.Name) -> Libraries\" -ForegroundColor Cyan >> } >> } >> } >> >> # 6. 项目感知型清理 - 保留项目结构 >> $projectFolders = @("APIServer", "BackendService", "DataAnalysis", "EcoMonitor", "MyApp", "MyWebApp") >> foreach ($project in $projectFolders) { >> $projectPath = Join-Path $projectRoot $project >> if (Test-Path $projectPath) { >> Write-Host "🔍 清理项目: $project" -ForegroundColor Yellow >> >> # 清理项目中的临时文件 >> $tempPatterns = @("*.tmp", "*.bak", "Thumbs.db") >> foreach ($pattern in $tempPatterns) { >> Get-ChildItem -Path $projectPath -Filter $pattern -File -Recurse -ErrorAction SilentlyContinue | >> Remove-Item -Force -ErrorAction SilentlyContinue >> } >> >> # 清理项目中的空文件夹 >> Get-ChildItem -Path $projectPath -Directory -Recurse | >> Where-Object { >> $_.GetFiles().Count -eq 0 -and >> $_.GetDirectories().Count -eq 0 >> } | >> Remove-Item -Force -Recurse -ErrorAction SilentlyContinue >> } >> } >> >> # 7. 生成目录结构报告 >> $structureReport = Join-Path $projectRoot "Project_Structure_Report.txt" >> tree $projectRoot /F /A | Out-File -FilePath $structureReport -Encoding UTF8 >> >> # 8. 最终结果展示 >> Write-Host "✨ 终极清理完成!项目目录完美整理 ✨" -ForegroundColor Green >> Write-Host "当前目录结构:" >> tree $projectRoot /F /A >> Write-Host "完整报告已保存至: $structureReport" -ForegroundColor Yellow >> ✅ 已移动PDB文件: Installer.pdb -> BuildOutputs\ ✅ 已移动PDB文件: SQLite.Designer.pdb -> BuildOutputs\ ✅ 已移动PDB文件: test.pdb -> BuildOutputs\ ✅ 已移动PDB文件: testef6.pdb -> BuildOutputs\ ✅ 已移动PDB文件: testlinq.pdb -> BuildOutputs\ ✅ 已移动文档: SQLite.Designer.xml -> Documentation\ ✅ 已移动库文件: SQLite.Designer.dll -> Libraries\ 🔍 清理项目: APIServer 🔍 清理项目: BackendService 🔍 清理项目: DataAnalysis 🔍 清理项目: EcoMonitor 🔍 清理项目: MyApp 🔍 清理项目: MyWebApp ✨ 终极清理完成!项目目录完美整理 ✨ 当前目录结构: 卷 ="模型响应", 的文件夹 PATH 列表 卷序列号为 7648-2CD3 E:\PROJECTECOSYSTEM\PROJECTMONITOR | Project_Structure_Report.txt | +---APIServer | | .gitignore | | APIServer.code-workspace | | package.json | | | \---src | index.js | +---BackendService | | .gitignore | | BackendService.code-workspace | | BackendService.sln | | | \---src | \---BackendService | BackendService.csproj | Program.cs | +---Binaries | Installer.exe | test.exe | testef6.exe | testlinq.exe | +---BuildOutputs | Installer.pdb | SQLite.Designer.pdb | test.pdb | testef6.pdb | testlinq.pdb | +---Config | System.Data.SQLite.dll.config | test.exe.config | testef6.exe.config | testlinq.exe.config | +---DataAnalysis | | .gitignore | | DataAnalysis.code-workspace | | requirements.txt | | | \---src | main.py | +---Database | northwindEF.db | project_state.db | +---Documentation | SQLite.Designer.xml | +---EcoMonitor | | .gitignore | | README.md | | | \---config | settings.psd1 | +---Libraries | SQLite.Designer.dll | +---Logs +---MyApp | | .gitignore | | MyApp.code-workspace | | | \---src | index.html | main.js | style.css | +---MyWebApp | | .gitignore | | MyWebApp.code-workspace | | | \---src | index.html | main.js | style.css | +---Scripts | Initialize-DevEnv.psm1 | Monitor-Project.ps1 | Start-Ecosystem.ps1 | +---SourceFiles | db_init.py | monitor.py | state_analyzer.py | \---SQLite System.Data.SQLite.dll System.Data.SQLite.EF6.dll System.Data.SQLite.EF6.pdb System.Data.SQLite.EF6.xml System.Data.SQLite.Linq.dll System.Data.SQLite.Linq.pdb System.Data.SQLite.Linq.xml System.Data.SQLite.pdb System.Data.SQLite.xml 完整报告已保存至: E:\ProjectEcosystem\ProjectMonitor\Project_Structure_Report.txt PS C:\Users\Administrator> # 处理PDB文件 >> Get-ChildItem -Path $projectRoot -Filter "*.pdb" -File | >> Move-Item -Destination "$projectRoot\BuildOutputs" >> >> # 处理XML文档 >> Get-ChildItem -Path $projectRoot -Filter "*.xml" -File | >> Move-Item -Destination "$projectRoot\Documentation" >> PS C:\Users\Administrator> # 只清理项目目录中的临时文件,保留项目结构 >> $projectFolders | ForEach-Object { >> Get-ChildItem -Path (Join-Path $projectRoot $_) -Filter "*.tmp" -Recurse | >> Remove-Item -Force >> } >> PS C:\Users\Administrator> # 创建目录结构报告 >> tree $projectRoot /F /A | Out-File "Project_Structure_Report.txt" >> PS C:\Users\Administrator> # Permanent-ProjectOrganizer.ps1 >> $organizerScript = @" >> # 自动维护脚本 - 每天运行 >> `$projectRoot = "E:\ProjectEcosystem\ProjectMonitor" >> >> # 1. 清理临时文件 >> Get-ChildItem -Path `$projectRoot -Include *.tmp, *.bak, Thumbs.db -Recurse | >> Remove-Item -Force -ErrorAction SilentlyContinue >> >> # 2. 自动分类新文件 >> `$watcher = @{ >> "*.ps*1" = "Scripts" >> "*.exe" = "Binaries" >> "*.dll" = "Libraries" >> "*.pdb" = "BuildOutputs" >> "*.xml" = "Documentation" >> "*.db" = "Database" >> "*.py" = "SourceFiles" >> "*.json" = "Config" >> } >> >> Get-ChildItem -Path `$projectRoot -File | ForEach-Object { >> foreach (`$rule in `$watcher.GetEnumerator()) { >> if (`$_.Name -like `$rule.Key) { >> `$targetDir = Join-Path `$projectRoot `$rule.Value >> if (-not (Test-Path `$targetDir)) { >> New-Item -ItemType Directory -Path `$targetDir | Out-Null >> } >> Move-Item -Path `$_.FullName -Destination `$targetDir -Force >> break >> } >> } >> } >> >> # 3. 每周生成报告 >> if ((Get-Date).DayOfWeek -eq [System.DayOfWeek]::Monday) { >> tree `$projectRoot /F /A | Out-File (Join-Path `$projectRoot "Weekly_Structure_Report.txt") >> } >> "@ >> >> Set-Content -Path "E:\ProjectEcosystem\ProjectOrganizer.ps1" -Value $organizerScript >> PS C:\Users\Administrator> # 创建Windows计划任务 >> $action = New-ScheduledTaskAction -Execute "PowerShell.exe" ` >> -Argument "-ExecutionPolicy Bypass -File `"E:\ProjectEcosystem\ProjectOrganizer.ps1`"" >> >> $trigger = New-ScheduledTaskTrigger -Daily -At 3am >> >> Register-ScheduledTask -Action $action -Trigger $trigger ` >> -TaskName "ProjectMonitor_Organizer" -Description "每日自动整理项目目录" ` >> -User "SYSTEM" -RunLevel Highest >> TaskPath TaskName State -------- -------- ----- \ ProjectMonitor_Organizer Ready PS C:\Users\Administrator>
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值