mirror of
https://github.com/pyTooling/Actions.git
synced 2026-02-12 02:56:56 +08:00
initial commit
This commit is contained in:
29
.github/workflows/push.yml
vendored
Normal file
29
.github/workflows/push.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: 'tip'
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
- '!tip'
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
env:
|
||||||
|
CI: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
tip:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
echo "Build some tool and generate some artifacts" > artifact.txt
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: |
|
||||||
|
artifact.txt
|
||||||
|
README.md
|
||||||
4
Dockerfile
Normal file
4
Dockerfile
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
FROM python:alpine
|
||||||
|
COPY tip.py /tip.py
|
||||||
|
RUN pip install PyGithub --progress-bar off
|
||||||
|
ENTRYPOINT ["/tip.py"]
|
||||||
38
README.md
Normal file
38
README.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
**tip** is a Docker GitHub Action written in Python. **tip** allows to keep a pre-release and its artifacts up to date with a latest builds. Combined with a workflow that is executed periodically, **tip** allows to provide a fixed release name for users willing to use daily/nightly artifacts of a project.
|
||||||
|
|
||||||
|
The following block shows a minimal YAML workflow file:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: 'workflow'
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 5'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mwe:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# Clone repository
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Build your application, tool, artifacts, etc.
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
echo "Build some tool and generate some artifacts" > artifact.txt
|
||||||
|
|
||||||
|
# Update tag and pre-release
|
||||||
|
# - Update (force-push) tag to the commit that is used in the workflow.
|
||||||
|
# - Upload artifacts defined by the user.
|
||||||
|
- uses: eine/tip@master
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: |
|
||||||
|
artifact.txt
|
||||||
|
README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the tag and the pre-release need to be created manually the first time. The workflow above will fail if the release does not exist.
|
||||||
|
|
||||||
|
The default tag name is `tip`, but it can be optionally overriden through option `tag` or setting envvar `INPUT_TAG`.
|
||||||
16
action.yml
Normal file
16
action.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: 'tip'
|
||||||
|
description: "keep a pre-release always up-to-date"
|
||||||
|
inputs:
|
||||||
|
token:
|
||||||
|
description: 'Token to make authenticated API calls; can be passed in using {{ secrets.GITHUB_TOKEN }}'
|
||||||
|
required: true
|
||||||
|
files:
|
||||||
|
description: 'Multi-line list of glob patterns describing the artifacts to be uploaded'
|
||||||
|
required: true
|
||||||
|
tag:
|
||||||
|
description: 'Name of the tag that corresponds to the tip/nightly pre-release'
|
||||||
|
required: false
|
||||||
|
default: tip
|
||||||
|
runs:
|
||||||
|
using: 'docker'
|
||||||
|
image: 'Dockerfile'
|
||||||
102
tip.py
Executable file
102
tip.py
Executable file
@@ -0,0 +1,102 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from os import environ, getenv
|
||||||
|
from sys import argv, stdout
|
||||||
|
from github import Github
|
||||||
|
from subprocess import check_call
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
|
print("· Get list of artifacts to be uploaded")
|
||||||
|
|
||||||
|
args = []
|
||||||
|
files = []
|
||||||
|
|
||||||
|
if 'INPUT_FILES' in environ:
|
||||||
|
args = environ['INPUT_FILES'].split()
|
||||||
|
|
||||||
|
if len(argv) > 1:
|
||||||
|
args = args + argv[1:]
|
||||||
|
|
||||||
|
if len(args) == 0:
|
||||||
|
stdout.flush()
|
||||||
|
raise(Exception("Glob patterns need to be provided as positional arguments or through envvar 'INPUT_FILES'!"))
|
||||||
|
|
||||||
|
for item in args:
|
||||||
|
items = glob(item)
|
||||||
|
print("glob(%s)" % item, "->", items)
|
||||||
|
files = files + items
|
||||||
|
|
||||||
|
if len(files) < 1:
|
||||||
|
stdout.flush()
|
||||||
|
raise(Exception('Empty list of files to upload/update!'))
|
||||||
|
|
||||||
|
print("· Get GitHub API handler (authenticate)")
|
||||||
|
|
||||||
|
if 'GITHUB_TOKEN' in environ:
|
||||||
|
gh = Github(environ["GITHUB_TOKEN"])
|
||||||
|
elif 'INPUT_TOKEN' in environ:
|
||||||
|
gh = Github(environ["INPUT_TOKEN"])
|
||||||
|
else:
|
||||||
|
if 'GITHUB_USER' not in environ or 'GITHUB_PASS' not in environ:
|
||||||
|
stdout.flush()
|
||||||
|
raise(Exception("Need credentials to authenticate! Please, provide 'GITHUB_TOKEN', 'INPUT_TOKEN', or 'GITHUB_USER' and 'GITHUB_PASS'"))
|
||||||
|
gh = Github(environ["GITHUB_USER"], environ["GITHUB_PASS"])
|
||||||
|
|
||||||
|
print("· Get Repository handler")
|
||||||
|
|
||||||
|
if 'GITHUB_REPOSITORY' not in environ:
|
||||||
|
stdout.flush()
|
||||||
|
raise(Exception("Repository name not defined! Please set 'GITHUB_REPOSITORY"))
|
||||||
|
|
||||||
|
gh_repo = gh.get_repo(environ['GITHUB_REPOSITORY'])
|
||||||
|
|
||||||
|
print("· Get Release handler")
|
||||||
|
|
||||||
|
tag = getenv('INPUT_TAG', 'tip')
|
||||||
|
|
||||||
|
try:
|
||||||
|
gh_tag = gh_repo.get_git_ref('tags/%s' % tag)
|
||||||
|
except Exception as e:
|
||||||
|
stdout.flush()
|
||||||
|
# TODO: create the tag/release, instead of raising an exception
|
||||||
|
raise(Exception("Tag '%s' does not exist!" % tag))
|
||||||
|
|
||||||
|
gh_release = gh_repo.get_release(tag)
|
||||||
|
|
||||||
|
print("· Upload artifacts")
|
||||||
|
|
||||||
|
artifacts = files
|
||||||
|
|
||||||
|
for asset in gh_release.get_assets():
|
||||||
|
print(">", asset)
|
||||||
|
print(" ", asset.name)
|
||||||
|
for fname in artifacts:
|
||||||
|
if asset.name == fname:
|
||||||
|
print(" removing '%s'..." % asset.name)
|
||||||
|
asset.delete_asset()
|
||||||
|
print(" uploading '%s'..." % fname)
|
||||||
|
gh_release.upload_asset(fname)
|
||||||
|
artifacts.remove(fname)
|
||||||
|
break
|
||||||
|
|
||||||
|
for fname in artifacts:
|
||||||
|
print(" uploading '%s'..." % fname)
|
||||||
|
gh_release.upload_asset(fname)
|
||||||
|
|
||||||
|
stdout.flush()
|
||||||
|
print("· Update Release reference (force-push tag)")
|
||||||
|
|
||||||
|
if ('GITHUB_SHA' in environ) and ('GITHUB_REF' in environ) and environ['GITHUB_REF'] != 'refs/tags/%s' % tag:
|
||||||
|
sha = environ['GITHUB_SHA']
|
||||||
|
print("force-push '%s' to %s" % (tag, sha))
|
||||||
|
gh_repo.get_git_ref('tags/%s' % tag).edit(sha)
|
||||||
|
|
||||||
|
# TODO: alternatively, update the title/body of the release (while keeping the tag or not)
|
||||||
|
# gh_release.update_release(
|
||||||
|
# gh_release.title,
|
||||||
|
# gh_release.body,
|
||||||
|
# draft=False,
|
||||||
|
# prerelease=True,
|
||||||
|
# tag_name=gh_release.tag_name,
|
||||||
|
# target_commitish=gh_release.target_commitish
|
||||||
|
# )
|
||||||
Reference in New Issue
Block a user