Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow - #714

Merged
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms
Mar 12, 2024
Merged

Upload dev wheels to Anaconda.org + revamp wheels publishing workflow#714
rgommers merged 7 commits into
PyWavelets:masterfrom
agriyakhetarpal:upload-nightly-wheels-for-all-platforms

Conversation

@agriyakhetarpal

@agriyakhetarpalagriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
Collaborator

Description

This PR introduces the following changes:

  1. It adds a deploy_anaconda job where the wheels can be uploaded to https://anaconda.org/scientific-python-nightly-wheels/PyWavelets/ using the scientific-python/upload-nightly-action GitHub Action
  2. A workflow_dispatch trigger to push the nightly wheels, and a CRON schedule that matches the one in Upload nightly wheels for PyWavelets to the Scientific Python Nightly Wheels index on Anaconda #710
  3. Replaces the cibuildwheel installation with its upstream GitHub Action, in order to get updates from Dependabot (see Keep GitHub Actions up to date with GitHub's Dependabot #708)
  4. Bumps up versions for the checkout actions and bumps the major version for download-artifact and upload-artifact
  5. Ensures that the necessary job runs or is skipped, based on the other wheel builds that may pass or fail

Footnotes

This PR is related to the changes requested on #712.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

@rgommers, this is ready for your review whenever you have the time for it. I thought that the changes weren't much!

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

With these changes, the PyPI job will run on:

  1. Tags

and the Anaconda PyPI index job will run on:

  1. Pushes to master/v1.XX,
  2. On a schedule, same as the WASM upload job (should we alter the CRON statement to have a 5-minute gap in case too many jobs start?)
  3. Manually

Should we allow the PyPI job to be triggered manually as well?

@rgommers

Copy link
Copy Markdown
Member

Should we allow the PyPI job to be triggered manually as well?

Yes, that would be useful to do.

@rgommersrgommers added the CI Continuous integration label Mar 12, 2024
@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

@rgommers

Copy link
Copy Markdown
Member

I guess we should add another input to the workflow_dispatch: event to gauge where to upload the wheels (there might be a situation where we would want to publish to just Anaconda, or just PyPI, or both).

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

@agriyakhetarpal

Copy link
Copy Markdown
CollaboratorAuthor

You are right. Actually, on second thought, this is a little dangerous. It should be a little hard to deploy to PyPI. Let's drop that last change. We do like 1-2 releases a year, so in case there's a problem with building from the tag, let's just make sure a maintainer fixes the problem and then moves the tag to do a release.

Thanks for the clarification! Yes, PyPI is permanent, so we do not want to trigger a broken release (even if the input is false by default). I have reverted the change in e8e4d86.

@rgommers

Copy link
Copy Markdown
Member

I tried this on my fork, and the uploading is broken: https://github.com/rgommers/pywt/actions/runs/8252417966. The problem is the name: field of upload-artifact, it is not specific enough. Maybe it used to work and the action got more strict.

On other projects I see that there is one wheel per zip file with the Python interpreter included in the upload name, e.g.: https://github.com/numpy/numpy/actions/runs/8238976297. I'm not sure if that is the optimal solution. Could you investigate, and then test from the master branch of your own fork?

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, it used to be more lenient with v3. I checked the workflow and the reason is that we are restricting the Python versions being built using cibw_python in the matrix – this produces parallel jobs per Python version (and therefore the name of the artifact must be different and the matrix variable must be present).

I had not used the CIBW_BUILD environment variable before and therefore did not face this problem (the difference is that it would build Python 3.9–3.12 in serial, one after the other, in the same job).

I have pushed 90ec5e4 which should fix this, here's a workflow run I have triggered just now – let's see if it passes: https://github.com/agriyakhetarpal/pywt/actions/runs/8252934295

@rgommers

Copy link
Copy Markdown
Member

Looks like it doesn't like the * in the name.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Yes, https://github.com/agriyakhetarpal/pywt/actions/runs/8253018855 works and all wheel builds plus their uploads are passing.

@agriyakhetarpal

agriyakhetarpal commented Mar 12, 2024

Copy link
Copy Markdown
CollaboratorAuthor

Now that both cibuildwheel and meson-python correctly set MACOSX_DEPLOYMENT_TARGET, we should look to build macOS arm64 wheels and test them natively before cutting 1.6.0. Do you mind opening a separate issue and PR for that or can I make that change here?

Edit: based on our Slack conversation, I shall do this and MUSL wheels in a follow-up PR.

Comment thread.github/workflows/wheel_tests_and_release.yml

@rgommersrgommers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That all looks good now, so let's give it a go!

I noticed that the Linux aarch64 jobs were taking forever; gh-716 should take care of that. I'll merge that first, so that the wheel builds triggered on merging this PR will be much faster.

@rgommersrgommers added this to the v1.6.0 milestone Mar 12, 2024
@rgommers
rgommers merged commit b078b7d into PyWavelets:masterMar 12, 2024
@agriyakhetarpal
agriyakhetarpal deleted the upload-nightly-wheels-for-all-platforms branch March 12, 2024 18:25
@rgommers

Copy link
Copy Markdown
Member

The upload to anaconda.org didn't actually work: https://github.com/PyWavelets/pywt/actions/runs/8253753639/job/22576823450. Could you have a look at that?

@rgommers

Copy link
Copy Markdown
Member

Ah never mind, you're already on it!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CIContinuous integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agriyakhetarpal@rgommers