linux

Rust项目在Linux上如何配置CI/CD

小樊
35
2025-12-22 05:32:35
栏目: 编程语言

Rust 项目在 Linux 上的 CI/CD 实战指南

一 方案总览

二 GitHub Actions 示例

name: Rust CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust: [stable, beta, nightly]
    steps:
      - uses: actions/checkout@v4
      - name: Setup Rust
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          override: true
      - name: Cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Build
        run: cargo build --verbose
      - name: Test
        run: cargo test --all-features --verbose

  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          components: clippy, rustfmt
      - name: Format check
        run: cargo fmt -- --check
      - name: Clippy
        run: cargo clippy --all-targets --all-features -- -D warnings

  build-release:
    name: Build Release
    needs: [test, lint]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
      - name: Cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-release-${{ hashFiles('**/Cargo.lock') }}
      - name: Build release
        run: cargo build --release
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: app-binary
          path: target/release/your-bin-name  # 替换为你的二进制名

  # 可选:发布到 crates.io(库)
  # publish-crate:
  #   name: Publish to crates.io
  #   if: github.event_name == 'push' && github.ref == 'refs/heads/main'
  #   needs: [build-release]
  #   runs-on: ubuntu-latest
  #   steps:
  #     - uses: actions/checkout@v4
  #     - uses: actions-rust-lang/setup-rust-toolchain@v1
  #       with:
  #         toolchain: stable
  #     - name: Publish
  #       run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}

三 GitLab CI 与 Jenkins 模板

image: rust:latest

variables:
  CARGO_HOME: $CI_PROJECT_DIR/.cargo
  RUSTUP_HOME: $CI_PROJECT_DIR/.rustup

cache:
  paths:
    - .cargo/registry
    - .cargo/git
    - target/
  key: "$CI_COMMIT_REF_SLUG"
  policy: pull-push

stages:
  - setup
  - test
  - build
  - security
  - deploy

setup_rust:
  stage: setup
  script:
    - rustup component add clippy rustfmt
    - rustup target add wasm32-unknown-unknown  # 如需 WASM

test_suite:
  stage: test
  script:
    - cargo test --verbose
    - cargo clippy --all-targets --all-features -- -D warnings
    - cargo fmt -- --check

build_release:
  stage: build
  script:
    - cargo build --release
  artifacts:
    paths:
      - target/release/

security_scan:
  stage: security
  script:
    - cargo audit
    - cargo deny check

deploy_prod:
  stage: deploy
  script:
    - echo "Deploy steps here (e.g., scp, rsync, kubectl)"
  only:
    - main
pipeline {
  agent any
  environment {
    RUSTUP_HOME = '/usr/local/rustup'
    CARGO_HOME  = '/usr/local/cargo'
    PATH = "$CARGO_HOME/bin:$PATH"
  }
  stages {
    stage('Setup Rust') {
      steps {
        sh 'curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y'
        sh 'source $HOME/.cargo/env'
        sh 'rustup toolchain install stable'
        sh 'rustup default stable'
        sh 'rustup component add clippy rustfmt'
      }
    }
    stage('Test') {
      steps {
        sh 'cargo test --verbose'
        sh 'cargo clippy -- -D warnings'
        sh 'cargo fmt -- --check'
      }
    }
    stage('Build') {
      steps {
        sh 'cargo build --release'
      }
    }
  }
}

四 容器化与发布交付

# 构建阶段
FROM rust:1.70 as builder
WORKDIR /usr/src/app
COPY . .
RUN cargo build --release

# 运行阶段(Debian Slim)
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/src/app/target/release/your-bin-name /usr/local/bin/your-bin-name
USER 1000:1000
CMD ["your-bin-name"]
    - name: Login to Docker Hub
      if: github.ref == 'refs/heads/main'
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_TOKEN }}

    - name: Build and push
      if: github.ref == 'refs/heads/main'
      uses: docker/build-push-action@v5
      with:
        context: .
        push: true
        tags: your-dockerhub/your-app:latest
    - name: Scan image
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: your-dockerhub/your-app:latest
        format: 'table'
        exit-code: '1'
        severity: 'CRITICAL'

五 性能与安全最佳实践

0
看了该问题的人还看了