Concourse fly 命令行工具实战指南:源码构建、登录认证、UI 安装与版本同步升级 DevOps【免费下载链接】concourseConcourse is a container-based automation system written in Go. Its mostly used for CI/CD.项目地址https://gitcode.com/gh_mirrors/con/concourse点击查看免费下载fly 是 Concourse 面向用户的官方命令行接口CLI它通过与 ATCConcourse 的 Web/API 主进程通信让开发者可以在本地终端中执行 pipeline 的创建、触发、监控与容器管理等一系列操作。本文以仓库中的 fly/README.md 为主线结合源码与集成测试完整讲解 fly 的源码构建、单元测试、从 Concourse UI 下载安装以及利用fly sync完成版本同步升级的全过程读完你将能够独立从零构建一份可用的 fly 二进制并掌握 target 管理与版本对齐的完整工作流。fly 在 Concourse 架构中的定位fly 本身不执行任何构建任务它的职责是驱动构建所有构建调度、容器生命周期与资源检查都发生在服务端ATC 与 workerfly 只是将这些能力以命令行形式暴露出来。正如 fly/README.md 所描述fly 是在容器中运行构建的 ATC 命令行接口A command line interface that runs a build in a container with ATC。从 fly/main.go 的入口实现可以看到 fly 的完整启动路径func main() { parser : flags.NewParser(commands.Fly, flags.HelpFlag|flags.PassDoubleDash) parser.NamespaceDelimiter - // ... _, err : parser.Parse() err loginAndRetry(parser, err) handleError(helpParser, err) }fly 基于jessevdk/go-flags构建参数解析并且内置了一个非常实用的未授权自动重试逻辑loginAndRetry当命令返回concourse.ErrUnauthorized且标准输入输出均为 TTY 时会自动引导用户执行login登录成功后再重新解析一次原始命令参数见 fly/main.go。全部可用命令都集中注册在 fly/commands/fly.go 中覆盖了连接管理login、logout、status、health、sync、targets、delete-target、edit-targetPipeline 操作set-pipeline、get-pipeline、destroy-pipeline、pause-pipeline、validate-pipeline、format-pipeline等作业与构建trigger-job、jobs、builds、watch、abort-build、rerun-build、execute资源与容器resources、check-resource、pin-resource、containers、hijack、volumes、workers从源码构建 fly前置条件fly 使用 Go 编写构建的前提是本地安装 Go 工具链。官方推荐直接从 concourse 仓库的整体检出中进行构建因为 fly 依赖仓库内其他包例如go-concourse、atc等。构建步骤检出仓库含子模块git clone --recursive https://gitcode.com/gh_mirrors/con/concourse.git cd concourse进入fly目录并执行go buildcd fly go build构建成功后当前目录下会生成名为fly的可执行文件Windows 平台为fly.exe。注意如果使用 Go 1.10 及以下版本需要在go build之前先执行go get ./...拉取依赖。当前仓库的go.mod已声明 Go module 依赖见仓库根目录 go.mod较新版本的 Go 会自动处理依赖下载。版本信息的注入构建出的 fly 二进制会内置一个版本号conc.Version该版本号用于后续与服务端 ATC 的版本比对。从 fly/rc/target.go 可以看到var LocalVersion conc.Version func init() { ver, found : os.LookupEnv(FAKE_FLY_VERSION) if found { LocalVersion ver } }LocalVersion即当前 fly 二进制的版本测试环境可通过FAKE_FLY_VERSION环境变量覆盖这在 fly/integration/sync_test.go 中被大量使用用于模拟 fly 与 ATC 版本不一致的场景。运行 fly 的测试套件fly 的测试覆盖从单元到集成多个层面官方推荐使用 ginkgo 运行go get github.com/onsi/ginkgo/v2/ginkgo ginkgo -rginkgo -r会递归运行仓库内所有包含 ginkgo 测试的包。以 fly 为例测试主要分布在fly/rctarget 配置读写与版本校验逻辑如 target_test.go、targets_test.gofly/commands各命令的单元测试如 helpers_test.gofly/integration真实二进制级别的端到端测试例如sync的完整下载-替换流程sync_test.go以 fly/integration/sync_test.go 为例它通过 ghttp 模拟 ATC 的GET /api/v1/cli接口验证当版本不一致时 fly 会把自身二进制替换为服务端下发的二进制同时验证了目标目录无写权限时报错且不替换原文件、版本一致时输出version x.x.x already matches; skipping并跳过下载等边界场景。这些测试是理解 fly 行为约定的最佳参考。从 Concourse UI 安装 fly项目开发场景UI 下载入口Concourse Web UI 的右下角提供了 fly 的下载入口点击后进入下载页http://localhost:8080/download-fly其中8080是本地 ATC 默认端口实际地址取决于你的 Concourse 部署配置。下载完成后用which fly确认二进制已被放入 PATH 中且可执行which fly服务端下载接口的实现UI 的/download-fly页面背后调用的是 ATC 提供的 CLI 下载 API其路由定义在 atc/routes.go{Path: /api/v1/cli, Method: GET, Name: DownloadCLI},完整的下载端点形如GET /api/v1/cli?platformdarwinarchamd64该处理器的实现位于 atc/api/cliserver/download.go根据platform如darwin、linux、windows与arch参数拼接归档文件路径fly-platform-arch.extWindows 平台下载fly.exezip 归档其余平台下载flytgz 归档platform与arch必须匹配正则^[a-z0-9]$否则直接返回 400防止路径穿越攻击对应测试 atc/api/cli_test.go 中arch../darwin/amd64、platform../etc/passwd返回 Bad Request 的用例。服务端存放这些归档的目录由 ATC 启动参数--cli-artifacts-dir指定见 atc/atccmd/command.go该目录经filepath.Abs归一化后注入cliserver.NewServer见 atc/api/handler.go。注意如果 ATC 未配置--cli-artifacts-dir即目录为空下载接口会返回 404cli downloads directory not configured这是本地开发部署时常见的一个坑。多平台归档的命名约定ATC 服务端约定每个平台/架构组合对应一个归档文件例如atc/api/cli_test.go中出现的fly-darwin-amd64.tgzfly-windows-amd64.zip这也意味着若你要在自定义环境中提供 fly 下载需要按fly-platform-arch.{tgz,zip}的命名规范准备好对应归档。登录与 target 管理安装好 fly 之后第一步是把它指向你的 Concourse 实例并完成认证。基本登录fly -t example login -c http://localhost:8080参数说明对应 fly/commands/login.go 中的LoginCommand定义参数短参数说明--concourse-url/-c-cConcourse 实例地址用于首次登录--username/-u-u用户名basic auth 方式--password/-p-p密码basic auth 方式--team-name/-n-n认证的团队名默认main或该 target 上次使用的团队--insecure/-k-k跳过服务端 SSL 证书校验--ca-certPEM 格式的 Concourse CA 证书文件路径--client-certPEM 格式客户端证书文件路径--client-keyPEM 格式客户端密钥文件路径--open-browser/-b-b自动在浏览器中打开认证地址-t--target为登录后保存的 target 别名后续所有命令都用-t 别名来引用该 Concourse 实例。登录成功后 fly 会打印target saved。认证方式的选择从 fly/commands/login.go 的Execute逻辑可以看到登录流程会根据服务端版本自动选择认证路径新版本 3.14.1优先走 OIDC。若同时提供-u/-p使用 OAuth2 password grant客户端 ID 为fly向/sky/issuer/token换取令牌否则走浏览器授权码流程——fly 在本地127.0.0.1随机端口起一个回调服务提示用户访问{url}/login?fly_port{port}支持-b自动打开浏览器旧版本≤ 3.14.1走 legacy auth从/api/v1/teams/{team}/auth/methods拉取可用认证方式oauth / basic / nonebasic 模式下向/api/v1/teams/{team}/auth/token换取令牌。登录完成后 fly 还会调用UserInfo校验用户确实属于目标团队防止已登录但无团队权限的假成功verifyTeamExists见 fly/commands/login.go。target 的存储~/.flyrc所有 target 信息被保存在~/.flyrc文件中路径计算见 fly/rc/targets.go可通过FLY_HOME环境变量重定向主目录。其结构与 JSON tag 定义对应fly/rc/targets.gotargets: example: api: http://localhost:8080 team: main insecure: false token: type: bearer value: eyJ... # 访问令牌 ca_cert: # 可选CA 证书内容 client_cert_path: client_key_path: 注意token 未指定团队时默认填充为main见LoadTargets。由于文件内容包含令牌fly 写入时使用0600权限位fly/rc/targets.go以保护凭证安全。常用 target 管理命令命令说明fly targetsts列出已保存的全部 target包含 name / url / team / 令牌过期时间实现见 fly/commands/targets.gofly -t example status查看当前 target 的登录状态校验令牌有效性fly -t example logouto登出并清除令牌--all可登出所有 target同时调用服务端/sky/logout使会话失效见 fly/commands/logout.gofly delete-targetdtg删除某个 targetfly edit-targetetg修改 target 的 URL、团队或名称--target-name/--concourse-url/--team-name见 fly/commands/edit_target.go升级 fly版本同步与fly sync升级原则fly不能脱离 Concourse 独立升级它必须与所连接的 ATC 保持版本匹配否则很多 API 请求会因字段或路由变化而失败。因此升级 fly 的唯一正轨是从当前 Concourse 实例拉取与它配套版本的 fly 二进制。升级途径有两种通过 Concourse UI 下载页手动下载对应版本见上文从 Concourse UI 安装 fly一节如果本地已装有 fly直接执行fly -t example syncsync 的工作流程fly -t example sync的完整链路如下实现见 fly/commands/sync.go通过 target 加载 ATC 地址调用GetInfo()获取服务端版本将服务端版本与本地rc.LocalVersion比对——若一致且未加--force输出version {v} already matches; skipping并直接结束检查当前二进制所在目录的写权限updateOptions.CheckPermissions()调用 go-concourse 客户端的GetCLIReader(runtime.GOARCH, runtime.GOOS)向GET /api/v1/cli发起下载客户端实现见 go-concourse/concourse/cli.go显示带进度条KiB 计数的下载过程用go-update原子替换当前正在运行的 fly 二进制输出done。SyncCommand支持的可选参数fly/commands/sync.go参数短参数说明--force-f即使版本已一致也强制同步--concourse-url-c直接指定 Concourse 地址无需先配置 target如fly sync -c http://localhost:8080--insecure-k跳过 SSL 证书校验--ca-cert/--client-cert/--client-key自定义 TLS 证书参数与 login 一致版本不一致时的保护机制fly 在每次向服务端发起请求前都会做版本校验Validate见 fly/rc/target.go若本地 fly 与 ATC 的主、次版本号不一致直接拒绝执行并返回ErrVersionMismatch提示用户运行fly -t target sync若仅patch 版本不一致则打印警告但仍允许执行。对应错误信息形如fly version (x.y.z) is out of sync with the target (a.b.c). to sync up, run the following: fly -t example syncfly main的错误处理fly/main.go还会针对以下场景给出友好提示未登录/令牌失效提示fly -t target login未指定 target提示fly -t (alias) login -c (concourse url)版本严重不一致以警告色提示cowardly refusing to run due to significant version discrepancy网络不可达提示确认目标 Concourse 是否在运行。对应集成测试覆盖了版本不一致时下载替换、目录无写权限时报update failed.*permission denied、版本一致时跳过等场景fly/integration/sync_test.go可作为验证 sync 行为的权威用例。常见问题速查现象原因与处理could not find a valid token未登录或令牌过期重新fly -t alias loginno target specified未指定-t先fly -t alias login -c url保存 targetunknown target: xxx-t指定的别名不存在用fly targets查看已保存别名fly version (x) is out of sync with the target (y)版本不匹配执行fly -t alias synccli downloads directory not configured下载页 404ATC 未配置--cli-artifacts-dirupdate failed: permission denied当前 fly 二进制所在目录无写权限无法自我替换小结本文围绕 fly/README.md 完整梳理了 fly 的四种核心使用场景从仓库源码构建go build、通过 ginkgo 运行测试、从 Concourse UI 的/download-fly页面安装以及通过fly -t example sync与服务端保持版本同步。同时结合 fly/main.go、fly/commands/fly.go、fly/rc/targets.go、atc/api/cliserver/download.go 与对应测试文件解释了 target 配置、登录认证、版本校验与二进制自替换背后的实现机制。掌握这些内容后你既能从零搭建开发环境也能在日常使用中快速定位并解决 fly 的安装、认证与版本同步问题。赞分享DevOps【免费下载链接】concourseConcourse is a container-based automation system written in Go. Its mostly used for CI/CD.项目地址https://gitcode.com/gh_mirrors/con/concourse点击查看免费下载相关推荐pdfminer.six 安装指南pip 安装、版本验证与命令行工具自检pdfminer.six 安装指南pip 安装、版本验证与命令行工具自检 本篇教程是 pdfminer.six 官方文档教程系列的入门第一篇面向首次接触该库后端docopt同步工具构建命令行同步管理工具docopt同步工具构建命令行同步管理工具 你是否还在为命令行工具的参数解析而烦恼是否希望有一种简单的方式来构建功能强大的命令行同步管理工具本文将介绍如何开发工具多显示器窗口分区 10 分钟上手FancyZones 手把手教程多显示器窗口分区 10 分钟上手FancyZones 手把手教程 PowerToys 是微软的 Windows 效率工具集FancyZones 模块负责多显桌面应用开发工具上一篇Pelican 静态站点生成器 reST 代码高亮实战sourcecode 指令与 PYGMENTS_RST_OPTIONS 全解析下一篇Apache Druid MiddleManager 服务详解任务分发、Peon 进程模型与集群调优实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考