feat: Add CI/CD workflows for testing and publishing SAL crates
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Test Publishing Setup / Test Publishing Setup (pull_request) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Test Publishing Setup / Test Publishing Setup (pull_request) Has been cancelled
				
			- Add a workflow for testing the publishing setup - Add a workflow for publishing SAL crates to crates.io - Improve crate metadata and version management - Add optional dependencies for modularity - Improve documentation for publishing and usage
This commit is contained in:
		
							
								
								
									
										233
									
								
								.github/workflows/test-publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								.github/workflows/test-publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,233 @@ | ||||
| name: Test Publishing Setup | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: [ main, master ] | ||||
|     paths: | ||||
|       - '**/Cargo.toml' | ||||
|       - 'scripts/publish-all.sh' | ||||
|       - '.github/workflows/publish.yml' | ||||
|   pull_request: | ||||
|     branches: [ main, master ] | ||||
|     paths: | ||||
|       - '**/Cargo.toml' | ||||
|       - 'scripts/publish-all.sh' | ||||
|       - '.github/workflows/publish.yml' | ||||
|   workflow_dispatch: | ||||
|  | ||||
| env: | ||||
|   CARGO_TERM_COLOR: always | ||||
|  | ||||
| jobs: | ||||
|   test-publish-setup: | ||||
|     name: Test Publishing Setup | ||||
|     runs-on: ubuntu-latest | ||||
|      | ||||
|     steps: | ||||
|     - name: Checkout repository | ||||
|       uses: actions/checkout@v4 | ||||
|      | ||||
|     - name: Install Rust toolchain | ||||
|       uses: dtolnay/rust-toolchain@stable | ||||
|       with: | ||||
|         toolchain: stable | ||||
|      | ||||
|     - name: Cache Cargo dependencies | ||||
|       uses: actions/cache@v4 | ||||
|       with: | ||||
|         path: | | ||||
|           ~/.cargo/bin/ | ||||
|           ~/.cargo/registry/index/ | ||||
|           ~/.cargo/registry/cache/ | ||||
|           ~/.cargo/git/db/ | ||||
|           target/ | ||||
|         key: ${{ runner.os }}-cargo-publish-test-${{ hashFiles('**/Cargo.lock') }} | ||||
|         restore-keys: | | ||||
|           ${{ runner.os }}-cargo-publish-test- | ||||
|           ${{ runner.os }}-cargo- | ||||
|      | ||||
|     - name: Install cargo-edit | ||||
|       run: cargo install cargo-edit | ||||
|      | ||||
|     - name: Test workspace structure | ||||
|       run: | | ||||
|         echo "Testing workspace structure..." | ||||
|          | ||||
|         # Check that all expected crates exist | ||||
|         EXPECTED_CRATES=(os process text net git vault kubernetes virt redisclient postgresclient zinit_client mycelium rhai herodo) | ||||
|          | ||||
|         for crate in "${EXPECTED_CRATES[@]}"; do | ||||
|           if [ -d "$crate" ] && [ -f "$crate/Cargo.toml" ]; then | ||||
|             echo "✅ $crate exists" | ||||
|           else | ||||
|             echo "❌ $crate missing or invalid" | ||||
|             exit 1 | ||||
|           fi | ||||
|         done | ||||
|      | ||||
|     - name: Test feature configuration | ||||
|       run: | | ||||
|         echo "Testing feature configuration..." | ||||
|          | ||||
|         # Test that features work correctly | ||||
|         cargo check --features os | ||||
|         cargo check --features process | ||||
|         cargo check --features text | ||||
|         cargo check --features net | ||||
|         cargo check --features git | ||||
|         cargo check --features vault | ||||
|         cargo check --features kubernetes | ||||
|         cargo check --features virt | ||||
|         cargo check --features redisclient | ||||
|         cargo check --features postgresclient | ||||
|         cargo check --features zinit_client | ||||
|         cargo check --features mycelium | ||||
|         cargo check --features rhai | ||||
|          | ||||
|         echo "✅ All individual features work" | ||||
|          | ||||
|         # Test feature groups | ||||
|         cargo check --features core | ||||
|         cargo check --features clients | ||||
|         cargo check --features infrastructure | ||||
|         cargo check --features scripting | ||||
|          | ||||
|         echo "✅ All feature groups work" | ||||
|          | ||||
|         # Test all features | ||||
|         cargo check --features all | ||||
|          | ||||
|         echo "✅ All features together work" | ||||
|      | ||||
|     - name: Test dry-run publishing | ||||
|       run: | | ||||
|         echo "Testing dry-run publishing..." | ||||
|          | ||||
|         # Test each individual crate can be packaged | ||||
|         CRATES=(os process text net git vault kubernetes virt redisclient postgresclient zinit_client mycelium rhai) | ||||
|          | ||||
|         for crate in "${CRATES[@]}"; do | ||||
|           echo "Testing sal-$crate..." | ||||
|           cd "$crate" | ||||
|           cargo publish --dry-run | ||||
|           cd .. | ||||
|           echo "✅ sal-$crate can be published" | ||||
|         done | ||||
|          | ||||
|         # Test main crate | ||||
|         echo "Testing main sal crate..." | ||||
|         cargo publish --dry-run | ||||
|         echo "✅ Main sal crate can be published" | ||||
|      | ||||
|     - name: Test publishing script | ||||
|       run: | | ||||
|         echo "Testing publishing script..." | ||||
|          | ||||
|         # Make script executable | ||||
|         chmod +x scripts/publish-all.sh | ||||
|          | ||||
|         # Test dry run | ||||
|         ./scripts/publish-all.sh --dry-run --version 0.1.0-test | ||||
|          | ||||
|         echo "✅ Publishing script works" | ||||
|      | ||||
|     - name: Test version consistency | ||||
|       run: | | ||||
|         echo "Testing version consistency..." | ||||
|          | ||||
|         # Get version from root Cargo.toml | ||||
|         ROOT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/') | ||||
|         echo "Root version: $ROOT_VERSION" | ||||
|          | ||||
|         # Check all crates have the same version | ||||
|         CRATES=(os process text net git vault kubernetes virt redisclient postgresclient zinit_client mycelium rhai herodo) | ||||
|          | ||||
|         for crate in "${CRATES[@]}"; do | ||||
|           if [ -f "$crate/Cargo.toml" ]; then | ||||
|             CRATE_VERSION=$(grep '^version = ' "$crate/Cargo.toml" | head -1 | sed 's/version = "\(.*\)"/\1/') | ||||
|             if [ "$CRATE_VERSION" = "$ROOT_VERSION" ]; then | ||||
|               echo "✅ $crate version matches: $CRATE_VERSION" | ||||
|             else | ||||
|               echo "❌ $crate version mismatch: $CRATE_VERSION (expected $ROOT_VERSION)" | ||||
|               exit 1 | ||||
|             fi | ||||
|           fi | ||||
|         done | ||||
|      | ||||
|     - name: Test metadata completeness | ||||
|       run: | | ||||
|         echo "Testing metadata completeness..." | ||||
|          | ||||
|         # Check that all crates have required metadata | ||||
|         CRATES=(os process text net git vault kubernetes virt redisclient postgresclient zinit_client mycelium rhai) | ||||
|          | ||||
|         for crate in "${CRATES[@]}"; do | ||||
|           echo "Checking sal-$crate metadata..." | ||||
|           cd "$crate" | ||||
|            | ||||
|           # Check required fields exist | ||||
|           if ! grep -q '^name = "sal-' Cargo.toml; then | ||||
|             echo "❌ $crate missing or incorrect name" | ||||
|             exit 1 | ||||
|           fi | ||||
|            | ||||
|           if ! grep -q '^description = ' Cargo.toml; then | ||||
|             echo "❌ $crate missing description" | ||||
|             exit 1 | ||||
|           fi | ||||
|            | ||||
|           if ! grep -q '^repository = ' Cargo.toml; then | ||||
|             echo "❌ $crate missing repository" | ||||
|             exit 1 | ||||
|           fi | ||||
|            | ||||
|           if ! grep -q '^license = ' Cargo.toml; then | ||||
|             echo "❌ $crate missing license" | ||||
|             exit 1 | ||||
|           fi | ||||
|            | ||||
|           echo "✅ sal-$crate metadata complete" | ||||
|           cd .. | ||||
|         done | ||||
|      | ||||
|     - name: Test dependency resolution | ||||
|       run: | | ||||
|         echo "Testing dependency resolution..." | ||||
|          | ||||
|         # Test that all workspace dependencies resolve correctly | ||||
|         cargo tree --workspace > /dev/null | ||||
|         echo "✅ All dependencies resolve correctly" | ||||
|          | ||||
|         # Test that there are no dependency conflicts | ||||
|         cargo check --workspace | ||||
|         echo "✅ No dependency conflicts" | ||||
|      | ||||
|     - name: Generate publishing report | ||||
|       if: always() | ||||
|       run: | | ||||
|         echo "## 🧪 Publishing Setup Test Report" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "### ✅ Tests Passed" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Workspace structure validation" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Feature configuration testing" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Dry-run publishing simulation" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Publishing script validation" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Version consistency check" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Metadata completeness verification" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "- Dependency resolution testing" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "### 📦 Ready for Publishing" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "All SAL crates are ready for publishing to crates.io!" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "**Individual Crates:** 13 modules" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "**Meta-crate:** sal with optional features" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "**Binary:** herodo script executor" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "### 🚀 Next Steps" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "1. Create a release tag (e.g., v0.1.0)" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "2. The publish workflow will automatically trigger" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "3. All crates will be published to crates.io" >> $GITHUB_STEP_SUMMARY | ||||
|         echo "4. Users can install with: \`cargo add sal-os\` or \`cargo add sal --features all\`" >> $GITHUB_STEP_SUMMARY | ||||
		Reference in New Issue
	
	Block a user