Skip to content

Commit e894584

Browse files
authored
Update conda_build.yml
1 parent a74557a commit e894584

1 file changed

Lines changed: 176 additions & 62 deletions

File tree

.github/workflows/conda_build.yml

Lines changed: 176 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,176 @@ on:
1111
type: string
1212

1313
jobs:
14+
# First job: Wait for PyPI to have the package
15+
wait-for-pypi:
16+
runs-on: ubuntu-latest
17+
outputs:
18+
version: ${{ steps.get-version.outputs.version }}
19+
sha256: ${{ steps.get-sha.outputs.sha256 }}
20+
steps:
21+
- name: Get version
22+
id: get-version
23+
run: |
24+
if [ "${{ github.event_name }}" == "release" ]; then
25+
VERSION="${{ github.event.release.tag_name }}"
26+
VERSION="${VERSION#v}"
27+
else
28+
VERSION="${{ github.event.inputs.version }}"
29+
fi
30+
echo "version=$VERSION" >> $GITHUB_OUTPUT
31+
echo "Waiting for version: $VERSION"
32+
33+
- name: Wait for PyPI package availability
34+
id: wait-pypi
35+
run: |
36+
VERSION="${{ steps.get-version.outputs.version }}"
37+
MAX_ATTEMPTS=20
38+
SLEEP_TIME=30
39+
40+
echo "Checking for omnipkg version $VERSION on PyPI..."
41+
42+
for i in $(seq 1 $MAX_ATTEMPTS); do
43+
echo "Attempt $i/$MAX_ATTEMPTS..."
44+
45+
# Check PyPI JSON API first (most reliable)
46+
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
47+
"https://pypi.org/pypi/omnipkg/$VERSION/json")
48+
49+
if [ "$HTTP_CODE" = "200" ]; then
50+
echo "✓ Package version found on PyPI API!"
51+
52+
# Also verify the tar.gz file is downloadable
53+
DOWNLOAD_URL="https://files.pythonhosted.org/packages/source/o/omnipkg/omnipkg-$VERSION.tar.gz"
54+
DOWNLOAD_CODE=$(curl -s -o /dev/null -w "%{http_code}" -I "$DOWNLOAD_URL")
55+
56+
if [ "$DOWNLOAD_CODE" = "200" ] || [ "$DOWNLOAD_CODE" = "302" ]; then
57+
echo "✓ Package file is downloadable!"
58+
break
59+
else
60+
echo "⚠ Package found in API but file not yet available (HTTP $DOWNLOAD_CODE)"
61+
fi
62+
else
63+
echo "Package not yet available (HTTP $HTTP_CODE)"
64+
fi
65+
66+
if [ $i -eq $MAX_ATTEMPTS ]; then
67+
echo "✗ Package not found after $MAX_ATTEMPTS attempts"
68+
echo "Check: https://pypi.org/project/omnipkg/$VERSION/"
69+
exit 1
70+
fi
71+
72+
echo "Waiting ${SLEEP_TIME}s..."
73+
sleep $SLEEP_TIME
74+
done
75+
76+
- name: Download and calculate SHA256
77+
id: get-sha
78+
run: |
79+
VERSION="${{ steps.get-version.outputs.version }}"
80+
81+
echo "Downloading package from PyPI..."
82+
# Try the files.pythonhosted.org URL first (CDN)
83+
if ! curl -L -f -o "omnipkg-$VERSION.tar.gz" \
84+
"https://files.pythonhosted.org/packages/source/o/omnipkg/omnipkg-$VERSION.tar.gz"; then
85+
# Fallback to pypi.org URL
86+
echo "CDN failed, trying pypi.org..."
87+
curl -L -f -o "omnipkg-$VERSION.tar.gz" \
88+
"https://pypi.org/packages/source/o/omnipkg/omnipkg-$VERSION.tar.gz"
89+
fi
90+
91+
# Verify file size
92+
FILE_SIZE=$(wc -c < "omnipkg-$VERSION.tar.gz")
93+
echo "File size: $FILE_SIZE bytes"
94+
95+
if [ "$FILE_SIZE" -lt 10000 ]; then
96+
echo "Error: File too small ($FILE_SIZE bytes)"
97+
exit 1
98+
fi
99+
100+
echo "Calculating SHA256..."
101+
if command -v sha256sum &> /dev/null; then
102+
SHA256=$(sha256sum "omnipkg-$VERSION.tar.gz" | cut -d' ' -f1)
103+
elif command -v shasum &> /dev/null; then
104+
SHA256=$(shasum -a 256 "omnipkg-$VERSION.tar.gz" | cut -d' ' -f1)
105+
else
106+
SHA256=$(python3 -c "import hashlib; print(hashlib.sha256(open('omnipkg-$VERSION.tar.gz', 'rb').read()).hexdigest())")
107+
fi
108+
109+
echo "sha256=$SHA256" >> $GITHUB_OUTPUT
110+
echo "SHA256: $SHA256"
111+
112+
# Second job: Update conda-forge feedstock
113+
update-feedstock:
114+
needs: wait-for-pypi
115+
runs-on: ubuntu-latest
116+
if: github.event_name == 'release'
117+
steps:
118+
- name: Checkout your feedstock fork
119+
uses: actions/checkout@v4
120+
with:
121+
repository: 1minds3t/omnipkg-feedstock
122+
token: ${{ secrets.GITHUB_TOKEN }}
123+
path: feedstock
124+
125+
- name: Setup Python
126+
uses: actions/setup-python@v5
127+
with:
128+
python-version: '3.11'
129+
130+
- name: Update feedstock meta.yaml
131+
run: |
132+
cd feedstock
133+
VERSION="${{ needs.wait-for-pypi.outputs.version }}"
134+
SHA256="${{ needs.wait-for-pypi.outputs.sha256 }}"
135+
136+
echo "Updating recipe/meta.yaml to version $VERSION with SHA256: $SHA256"
137+
138+
# Update version and sha256 in meta.yaml
139+
sed -i "s/{% set version = \".*\" %}/{% set version = \"$VERSION\" %}/" recipe/meta.yaml
140+
sed -i "s/sha256: .*/sha256: $SHA256/" recipe/meta.yaml
141+
142+
# Show the changes
143+
echo "=== Updated meta.yaml (first 30 lines) ==="
144+
head -30 recipe/meta.yaml
145+
146+
- name: Commit and push to fork
147+
run: |
148+
cd feedstock
149+
VERSION="${{ needs.wait-for-pypi.outputs.version }}"
150+
151+
git config --local user.email "action@github.com"
152+
git config --local user.name "GitHub Action"
153+
git add recipe/meta.yaml
154+
155+
if git diff --staged --quiet; then
156+
echo "No changes to commit"
157+
else
158+
git commit -m "Update omnipkg to version $VERSION"
159+
git push
160+
echo "✓ Changes pushed to fork"
161+
fi
162+
163+
- name: Create Pull Request to conda-forge
164+
uses: peter-evans/create-pull-request@v5
165+
with:
166+
token: ${{ secrets.FEEDSTOCK_TOKEN }}
167+
path: feedstock
168+
commit-message: "Update omnipkg to version ${{ needs.wait-for-pypi.outputs.version }}"
169+
title: "Update omnipkg to version ${{ needs.wait-for-pypi.outputs.version }}"
170+
body: |
171+
Automated update to omnipkg version ${{ needs.wait-for-pypi.outputs.version }}
172+
173+
- Updated version in meta.yaml
174+
- Updated SHA256 hash: ${{ needs.wait-for-pypi.outputs.sha256 }}
175+
176+
Changes were automatically generated by GitHub Actions after PyPI release.
177+
branch: "update-v${{ needs.wait-for-pypi.outputs.version }}"
178+
base: main
179+
push-to-fork: 1minds3t/omnipkg-feedstock
180+
181+
# Third job: Build conda packages for your own channel
14182
build-and-upload:
183+
needs: wait-for-pypi
15184
runs-on: ${{ matrix.os }}
16185
strategy:
17186
matrix:
@@ -34,23 +203,14 @@ jobs:
34203
shell: bash -l {0}
35204
run: |
36205
conda install conda-build anaconda-client -y
206+
37207
- name: Update meta.yaml version and hash
38208
shell: bash -l {0}
39209
run: |
40-
if [ "${{ github.event_name }}" == "release" ]; then
41-
VERSION="${{ github.event.release.tag_name }}"
42-
VERSION="${VERSION#v}" # Remove 'v' prefix if present
43-
else
44-
VERSION="${{ github.event.inputs.version }}"
45-
fi
210+
VERSION="${{ needs.wait-for-pypi.outputs.version }}"
211+
SHA256="${{ needs.wait-for-pypi.outputs.sha256 }}"
46212
47-
# Use curl for all platforms for consistency.
48-
echo "Downloading omnipkg version $VERSION..."
49-
curl -L -o "omnipkg-$VERSION.tar.gz" "https://pypi.org/packages/source/o/omnipkg/omnipkg-$VERSION.tar.gz"
50-
51-
# Use Python for a truly cross-platform SHA256 calculation.
52-
echo "Calculating SHA256 hash..."
53-
SHA256=$(python -c "import hashlib; print(hashlib.sha256(open('omnipkg-$VERSION.tar.gz', 'rb').read()).hexdigest())")
213+
echo "Using version $VERSION with SHA256: $SHA256"
54214
55215
# Update the version and sha256 in meta.yaml (cross-platform sed)
56216
if [[ "$RUNNER_OS" == "macOS" ]]; then
@@ -61,67 +221,21 @@ jobs:
61221
sed -i "s/sha256: .*/sha256: $SHA256/" omnipkg/conda-recipe/meta.yaml
62222
fi
63223
64-
echo "Updated version to $VERSION with SHA256: $SHA256"
65-
echo "VERSION=$VERSION" >> $GITHUB_ENV
66-
67-
# Show the updated meta.yaml for debugging
68-
echo "=== Updated meta.yaml ==="
224+
echo "Updated meta.yaml:"
69225
head -15 omnipkg/conda-recipe/meta.yaml
226+
70227
- name: Build conda package
71228
shell: bash -l {0}
72229
run: |
73230
export PYTHONIOENCODING=UTF-8
74231
conda build omnipkg/conda-recipe --output-folder ./conda-dist
232+
75233
- name: Upload to Anaconda Cloud
76234
shell: bash -l {0}
77235
run: |
78-
# Upload both .conda and .tar.bz2 files (conda-build may produce either format)
79-
# Use find to locate the actual files and upload them
80236
find ./conda-dist -name "*.conda" -o -name "*.tar.bz2" | while read file; do
81237
echo "Uploading $file"
82238
anaconda -t ${{ secrets.ANACONDA_TOKEN }} upload "$file" --force
83239
done
84240
env:
85241
ANACONDA_TOKEN: ${{ secrets.ANACONDA_TOKEN }}
86-
87-
# Alternative job for conda-forge feedstock update
88-
update-feedstock:
89-
runs-on: ubuntu-latest
90-
if: github.event_name == 'release'
91-
steps:
92-
- name: Checkout feedstock
93-
uses: actions/checkout@v4
94-
with:
95-
repository: conda-forge/omnipkg-feedstock
96-
token: ${{ secrets.FEEDSTOCK_TOKEN }}
97-
path: feedstock
98-
99-
- name: Setup Python
100-
uses: actions/setup-python@v4
101-
with:
102-
python-version: '3.11'
103-
104-
- name: Install dependencies
105-
run: |
106-
pip install pyyaml requests
107-
- name: Update feedstock
108-
run: |
109-
cd feedstock
110-
VERSION="${{ github.event.release.tag_name }}"
111-
VERSION="${VERSION#v}"
112-
113-
# Use curl and Python for consistency and reliability.
114-
echo "Downloading source to get SHA256..."
115-
curl -L -o "omnipkg-$VERSION.tar.gz" "https://pypi.org/packages/source/o/omnipkg/omnipkg-$VERSION.tar.gz"
116-
SHA256=$(python -c "import hashlib; print(hashlib.sha256(open('omnipkg-$VERSION.tar.gz', 'rb').read()).hexdigest())")
117-
118-
# Update recipe/meta.yaml
119-
sed -i "s/{% set version = \".*\" %}/{% set version = \"$VERSION\" %}/" recipe/meta.yaml
120-
sed -i "s/sha256: .*/sha256: $SHA256/" recipe/meta.yaml
121-
122-
# Commit and push
123-
git config --local user.email "action@github.com"
124-
git config --local user.name "GitHub Action"
125-
git add recipe/meta.yaml
126-
git commit -m "Update to version $VERSION" || exit 0
127-
git push

0 commit comments

Comments
 (0)