Rust的CI/CD:从零开始自动化构建与部署

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么你的Rust项目值得拥有真正的CI/CD?

\n\n

想象一下:你正在用Rust编写代码,编译器是你最好的朋友,借用检查器让你时刻保持警惕,代码运行如闪电般迅速。但一旦涉及到部署,魔法就结束了。手动运行测试、在本地机器上构建、通过SCP将二进制文件上传到服务器——这是一条死路。尤其是当项目规模扩大,团队中又增加了第二位开发者时。

\n\n

CI/CD(持续集成/持续部署)不仅仅是一个时髦的词汇。它是一个系统,能够替你承担繁琐的工作:运行测试、检查代码风格、构建发布版本并将其发送到它应该运行的地方。对于注重可靠性和性能的Rust来说,构建自动化是语言哲学的天然延伸。

\n\n

在本文中,我们将从零开始为基于GitHub Actions的Rust应用程序配置CI/CD管道。你将学习如何组织测试、代码检查、跨平台二进制文件构建以及部署。所有内容都配有实际代码示例,你可以直接复制到自己的项目中。

\n\n

我们将自动化什么?

\n\n

在编写代码之前,让我们先明确目标。我们的管道将完成四件事:

\n\n
    \n
  • 代码检查与格式化 — 确保代码符合Rust标准,不包含常见错误。
  • \n
  • 测试 — 运行所有单元测试,如果有的话,还包括集成测试。
  • \n
  • 构建二进制文件 — 编译优化版本(release)。
  • \n
  • 部署 — 将构建好的工件上传到服务器或GitHub Releases。
  • \n
\n\n

所有这些都将在每次推送到main分支或创建pull request时自动发生。听起来像魔法?实际上只是YAML文件和几个Cargo命令。

\n\n

步骤1:准备项目

\n\n

作为示例,我们将使用一个基于Actix-web的简单Web服务器。但管道是通用的:适用于任何Rust项目,无论是CLI工具、库还是微服务。

\n\n

创建一个新项目:

\n\n
cargo new rust-ci-cd-demo --bin\ncd rust-ci-cd-demo
\n\n

在Cargo.toml中添加依赖:

\n\n
[dependencies]\nactix-web = "4"\nserde = { version = "1", features = ["derive"] }
\n\n

并在src/main.rs中添加最简单的代码:

\n\n
use actix_web::{get, App, HttpResponse, HttpServer, Responder};\n\n#[get("/")]\nasync fn hello() -> impl Responder {\n    HttpResponse::Ok().body("Hello from Rust CI/CD!")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n    HttpServer::new(|| {\n        App::new().service(hello)\n    })\n    .bind(("0.0.0.0", 8080))?\n    .run()\n    .await\n}
\n\n

在src/main.rs底部添加一个简单的测试:

\n\n
#[cfg(test)]\nmod tests {\n    use actix_web::{test, App, web};\n    use crate::hello;\n\n    #[actix_web::test]\n    async fn test_hello_endpoint() {\n        let app = test::init_service(App::new().service(hello)).await;\n        let req = test::TestRequest::get().uri("/").to_request();\n        let resp = test::call_service(&app, req).await;\n        assert!(resp.status().is_success());\n    }\n}
\n\n

一切就绪。现在最有趣的部分——配置CI/CD。

\n\n

步骤2:创建GitHub Actions工作流

\n\n

GitHub Actions是GitHub内置的CI/CD工具。它基于存放在.github/workflows/目录下的YAML文件运行。创建该目录:

\n\n
mkdir -p .github/workflows\ntouch .github/workflows/ci.yml
\n\n

打开ci.yml并开始编写管道。我们将其命名为"Rust CI/CD Pipeline"。

\n\n

基本触发器和环境

\n\n
name: Rust CI/CD Pipeline\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\nenv:\n  CARGO_TERM_CO                

博客

书籍推荐