|
3 | 3 | on: |
4 | 4 | pull_request: |
5 | 5 | push: |
6 | | - branches: |
7 | | - - main |
| 6 | + release: |
| 7 | + types: [published] |
8 | 8 |
|
9 | 9 | jobs: |
10 | 10 | build: |
|
51 | 51 |
|
52 | 52 | - name: Run tests |
53 | 53 | run: make test-coverage |
| 54 | + |
| 55 | + - name: Validate opam file |
| 56 | + run: | |
| 57 | + echo "🔍 Running opam lint validation..." |
| 58 | + opam lint relude.opam |
| 59 | + echo "✅ Opam file is valid" |
| 60 | + |
| 61 | + echo "🧪 Testing opam install dry run..." |
| 62 | + opam install --dry-run . || { |
| 63 | + echo "❌ opam install --dry-run failed - dependency resolution issues detected" |
| 64 | + exit 1 |
| 65 | + } |
| 66 | + echo "✅ opam install --dry-run succeeded - dependencies can be resolved" |
| 67 | + |
| 68 | + echo "📦 Testing opam pin dry run..." |
| 69 | + opam pin add --dry-run relude . || { |
| 70 | + echo "❌ opam pin dry run failed - package cannot be pinned" |
| 71 | + exit 1 |
| 72 | + } |
| 73 | + echo "✅ opam pin dry run succeeded - package can be pinned from source" |
| 74 | +
|
| 75 | + - name: Install opam-publish plugin |
| 76 | + if: github.event_name == 'release' || github.event_name == 'push' || github.event_name == 'pull_request' |
| 77 | + run: opam install opam-publish |
| 78 | + |
| 79 | + - name: Publish to opam (dry run) |
| 80 | + if: github.event_name != 'release' |
| 81 | + run: | |
| 82 | + echo "🧪 Running opam publish dry run..." |
| 83 | + echo "📝 This validates the publishing process without submitting to opam" |
| 84 | + |
| 85 | + # Verify opam-publish plugin can analyze the package |
| 86 | + echo "🔍 Checking if opam-publish can process the package..." |
| 87 | + |
| 88 | + # Test that we can generate the opam file content |
| 89 | + if opam show --raw . >/dev/null 2>&1; then |
| 90 | + echo "✅ Package metadata can be read successfully" |
| 91 | + else |
| 92 | + echo "❌ Failed to read package metadata" |
| 93 | + exit 1 |
| 94 | + fi |
| 95 | + |
| 96 | + # Verify required fields are present in opam file |
| 97 | + echo "📋 Validating required opam file fields..." |
| 98 | + if grep -q "^homepage:" relude.opam && grep -q "^bug-reports:" relude.opam && grep -q "^synopsis:" relude.opam; then |
| 99 | + echo "✅ Required opam fields are present" |
| 100 | + else |
| 101 | + echo "❌ Missing required opam fields for publishing" |
| 102 | + exit 1 |
| 103 | + fi |
| 104 | + |
| 105 | + # Check if we can read the current git state |
| 106 | + if git rev-parse --verify HEAD >/dev/null 2>&1; then |
| 107 | + echo "✅ Git repository state is valid" |
| 108 | + else |
| 109 | + echo "❌ Git repository state is invalid" |
| 110 | + exit 1 |
| 111 | + fi |
| 112 | + |
| 113 | + echo "✅ Dry run validation successful - opam publishing should work for a real release" |
| 114 | + echo "📋 To publish manually, create a release or run: opam publish --tag=<version> ." |
| 115 | +
|
| 116 | + - name: Configure git for GitHub operations |
| 117 | + if: github.event_name == 'release' |
| 118 | + env: |
| 119 | + OPAM_PUBLISH_TOKEN: ${{ secrets.OPAM_PUBLISH_TOKEN }} |
| 120 | + run: | |
| 121 | + if [ -n "$OPAM_PUBLISH_TOKEN" ]; then |
| 122 | + git config --global user.name "GitHub Actions" |
| 123 | + git config --global user.email "actions@github.com" |
| 124 | + git config --global credential.helper store |
| 125 | + echo "https://github-actions:$OPAM_PUBLISH_TOKEN@github.com" > ~/.git-credentials |
| 126 | + fi |
| 127 | +
|
| 128 | + - name: Publish to opam (release) |
| 129 | + if: github.event_name == 'release' && github.event.action == 'published' |
| 130 | + env: |
| 131 | + OPAM_PUBLISH_TOKEN: ${{ secrets.OPAM_PUBLISH_TOKEN }} |
| 132 | + run: | |
| 133 | + if [ -n "$OPAM_PUBLISH_TOKEN" ]; then |
| 134 | + echo "🚀 Publishing relude v${{ github.ref_name }} to opam repository" |
| 135 | + mkdir -p ~/.opam/plugins/opam-publish |
| 136 | + echo -n "$OPAM_PUBLISH_TOKEN" > ~/.opam/plugins/opam-publish/github-actions.token |
| 137 | + opam publish --no-confirmation --tag=${{ github.ref_name }} . |
| 138 | + echo "✅ Successfully published relude v${{ github.ref_name }} to opam" |
| 139 | + else |
| 140 | + echo "⚠️ OPAM_PUBLISH_TOKEN not found in secrets" |
| 141 | + echo "📋 To manually publish this release to opam, run:" |
| 142 | + echo " opam publish --tag=${{ github.ref_name }} ." |
| 143 | + echo "" |
| 144 | + echo "📖 See https://opam.ocaml.org/doc/Packaging.html#Publishing for more details" |
| 145 | + echo "🔗 Release: https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}" |
| 146 | + fi |
0 commit comments