Release setup-python as an npm package #38
Comments
|
Or it should support triggering another action from a javascript action, e.g. import * as actions from '@actions/actions'; // <-- this is new
import * as exec from '@actions/exec';
await actions.run('setup-python', {python-version: '2.x'});
await exec.exec('pip install ...'); |
|
It's not particularly pretty, but I think I've found a way to include Add the repository as a dependency and specify a version.
It will get added to package.json like this.
Add a script in package.json to build setup-python.
Install and build (Add this to CI, too)
It should build and be usable as in this example: import * as core from '@actions/core'
import * as setupPython from 'setup-python/lib/find-python'
async function run(): Promise<void> {
try {
const installed = await setupPython.findPythonVersion('3.x', 'x64')
core.info(`Successfully setup ${installed.impl} (${installed.version})`)
} catch (error) {
core.setFailed(error.message)
}
}
run() |
|
@peter-evans right, I think if we were publishing as an NPM package, we would want to do more work around giving the action a proper API and versioning the NPM package around that. So, if the existing path that |
|
@brcrista It feels a bit hacky so I don't think it's a great solution long term. It would be nice if the logic existed in an actions/tookit module and this action was just a wrapper that called it. For my own use case, I'm planning to move away from executing Python with |
|
That makes sense -- just a matter of whether the time spent and added complexity is worth it. I'm going to close this as we're not planning on this work right now, but we'll keep this in mind if people keep asking for it. |
|
I was watching this thread without speaking up. I would also like a way to ensure that a specific version of Python is installed from another action, to simplify the requirements for others who depend on the action. |
|
fwiw I've been pretty disappointed with the reusability of github actions, the design choices of having executable git repos make it really difficult to compose actions (instead they must be copy pasted everywhere) and with a lack of support for template repositories (such as with azure pipelines) means there really isn't any solution for things like this beyond adding more to copy paste my particular usecase for having an in-process runnable setupPython is to patch a (imo) pretty glaring omission in this action: setting up in-development versions. the current implementation requires copy pasting two actions both with disparate complex conditionals. the ideal case would be a single action which just works (by calling out to setup-python in some way when it cannot handle the particular versions itself): deadsnakes/issues#123 |
|
FWIW one way in another action we found to compose actions is to simply download the resulting |
|
Check out this issue for "composite actions:" actions/runner#438. There's also a working design proposal: actions/runner#554 I think this would address @peter-evans 's and @foolip 's scenarios. @asottile , this isn't the same templating model as Azure Pipelines, but I think that could address your use case also. |
I have a Javascript action that executes Python. It would be great if I could add
@actions/setup-pythonas a dependency and call it from my Javascript action.In order to make it work for now I converted parts of this action into a
setupPythonfunction that I've included with my action. Below is a simplified snippet of what I'm doing now. Full source code here.Here is a python-action template that also demonstrates what I'm doing in the snippet above.
Why call Python from a Javascript action?
The reason I ended up doing this and not writing the whole action in Javascript requires a bit of history and explanation. I wrote the action during GitHub Actions beta v1 when it was just container actions. When Actions v2 arrived the choices were Javascript or Docker container actions. I want the action to be multi-platform and runnable on any virtual machine, so I have no choice but to wrap it with a Javascript action as I'm doing, or convert the whole action to Javascript.
Even if Docker container actions worked on all platforms I think I would still choose to wrap Python in Javascript like this. The two issues I don't like about container actions are:
image: 'Dockerfile'it's slow because the image is built from scratch every time the workflow runs.image: 'docker://my-namespace/my-image:1.0.0'it cannot be forked easily because the reference to the public Docker image remains. Being able to fork GitHub actions is important for security conscious users.The text was updated successfully, but these errors were encountered: