|
74 | 74 | --tag opencode-cloud-sandbox:ci-check \ |
75 | 75 | . |
76 | 76 |
|
| 77 | + cargo-package-verify: |
| 78 | + name: Cargo Package Verify |
| 79 | + runs-on: ubuntu-latest |
| 80 | + steps: |
| 81 | + - uses: actions/checkout@v6 |
| 82 | + |
| 83 | + - name: Install Rust |
| 84 | + uses: dtolnay/rust-toolchain@stable |
| 85 | + |
| 86 | + - name: Package opencode-cloud-core |
| 87 | + run: cargo package -p opencode-cloud-core --allow-dirty |
| 88 | + |
| 89 | + - name: Determine core version and publication status |
| 90 | + id: core-publication |
| 91 | + run: | |
| 92 | + set -euo pipefail |
| 93 | +
|
| 94 | + core_version="$(python3 -c 'import pathlib, tomllib; print(tomllib.loads(pathlib.Path("packages/core/Cargo.toml").read_text())["package"]["version"])')" |
| 95 | + echo "core_version=${core_version}" >> "$GITHUB_OUTPUT" |
| 96 | +
|
| 97 | + if ./scripts/check-crate-version-published.sh opencode-cloud-core "${core_version}"; then |
| 98 | + echo "published=true" >> "$GITHUB_OUTPUT" |
| 99 | + else |
| 100 | + check_exit=$? |
| 101 | + if [ "${check_exit}" -eq 1 ]; then |
| 102 | + echo "published=false" >> "$GITHUB_OUTPUT" |
| 103 | + else |
| 104 | + exit "${check_exit}" |
| 105 | + fi |
| 106 | + fi |
| 107 | +
|
| 108 | + - name: Package opencode-cloud (PR no-verify archive) |
| 109 | + if: github.event_name == 'pull_request' |
| 110 | + run: cargo package -p opencode-cloud --allow-dirty --no-verify |
| 111 | + |
| 112 | + - name: Verify packaged opencode-cloud against local core (PR) |
| 113 | + if: github.event_name == 'pull_request' |
| 114 | + run: | |
| 115 | + set -euo pipefail |
| 116 | +
|
| 117 | + crate_archive="$(ls -t target/package/opencode-cloud-*.crate | head -n1)" |
| 118 | + if [ -z "${crate_archive}" ]; then |
| 119 | + echo "Error: opencode-cloud package archive not found." |
| 120 | + exit 1 |
| 121 | + fi |
| 122 | +
|
| 123 | + crate_basename="$(basename "${crate_archive}" .crate)" |
| 124 | + unpack_dir="$(mktemp -d)" |
| 125 | + config_file="$(mktemp)" |
| 126 | + trap 'rm -rf "${unpack_dir}" "${config_file}"' EXIT |
| 127 | +
|
| 128 | + tar -xzf "${crate_archive}" -C "${unpack_dir}" |
| 129 | + crate_dir="${unpack_dir}/${crate_basename}" |
| 130 | + manifest_path="${crate_dir}/Cargo.toml" |
| 131 | + if [ ! -f "${manifest_path}" ]; then |
| 132 | + echo "Error: unpacked package manifest not found at ${manifest_path}" |
| 133 | + exit 1 |
| 134 | + fi |
| 135 | +
|
| 136 | + cat > "${config_file}" <<EOF |
| 137 | + [patch.crates-io] |
| 138 | + opencode-cloud-core = { path = "${GITHUB_WORKSPACE}/packages/core" } |
| 139 | + EOF |
| 140 | +
|
| 141 | + cargo check --manifest-path "${manifest_path}" --config "${config_file}" |
| 142 | +
|
| 143 | + - name: Package opencode-cloud (main push, published core) |
| 144 | + if: github.event_name == 'push' && steps.core-publication.outputs.published == 'true' |
| 145 | + run: cargo package -p opencode-cloud --allow-dirty |
| 146 | + |
| 147 | + - name: Skip opencode-cloud package verify (main push, core unpublished) |
| 148 | + if: github.event_name == 'push' && steps.core-publication.outputs.published != 'true' |
| 149 | + run: | |
| 150 | + echo "Skipping opencode-cloud packaging verify on main push." |
| 151 | + echo "Reason: opencode-cloud-core ${{ steps.core-publication.outputs.core_version }} is not yet published on crates.io." |
| 152 | + { |
| 153 | + echo "## Cargo Package Verify" |
| 154 | + echo "" |
| 155 | + echo "Skipped \`cargo package -p opencode-cloud\` on push to main." |
| 156 | + echo "Reason: dependency \`opencode-cloud-core ${{ steps.core-publication.outputs.core_version }}\` is not yet published on crates.io." |
| 157 | + } >> "$GITHUB_STEP_SUMMARY" |
| 158 | +
|
77 | 159 | # Build, lint, and test on multiple platforms |
78 | 160 | # Clippy/build/test must run on each platform because #[cfg(target_os)] causes |
79 | 161 | # different code to compile (e.g., systemd.rs on Linux, launchd.rs on macOS) |
|
0 commit comments