Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
bob.admin
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
bob
bob.admin
Commits
f015da19
Commit
f015da19
authored
6 years ago
by
Pavel KORSHUNOV
Browse files
Options
Downloads
Patches
Plain Diff
updated documentation of all functions, cleanup
parent
c4f291e2
No related branches found
No related tags found
1 merge request
!85
Correcting release script: sorting tags, corrected version bump, updated help docs
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
release/release_bob.py
+111
-11
111 additions, 11 deletions
release/release_bob.py
with
111 additions
and
11 deletions
release/release_bob.py
+
111
−
11
View file @
f015da19
...
...
@@ -93,7 +93,17 @@ def _insure_correct_package(candidates, group_name, pkg_name):
# adapted from the same-name function in new_version.py script of bob.extension package
def
_update_readme
(
readme
,
version
=
None
):
# replace the travis badge in the README.rst with the given version
"""
Inside text of the readme, replaces parts of the links to the provided version.
If version is not provided, replace to `stable` or `master`.
Args:
readme: Text of the README.rst file from a bob package
version: Format of the version string is
'
#.#.#
'
Returns: New text of readme with all replaces done
"""
# replace the badge in the readme's text with the given version
DOC_IMAGE
=
re
.
compile
(
r
'
\-(stable|(v\d+\.\d+\.\d+([abc]\d+)?))\-
'
)
BRANCH_RE
=
re
.
compile
(
r
'
/(stable|master|(v\d+\.\d+\.\d+([abc]\d+)?))
'
)
...
...
@@ -116,16 +126,22 @@ def _update_readme(readme, version=None):
def
get_latest_tag_name
(
gitpkg
):
"""
Find the name of the latest tag for a given package in the format
'
#.#.#
'
Args:
gitpkg: gitlab package object
Returns: The name of the latest tag in format
'
#.#.#
'
. None if no tags for the package were found.
"""
# get 50 latest tags as a list
latest_tags
=
gitpkg
.
tags
.
list
(
all
=
True
)
if
not
latest_tags
:
return
None
# create list of tags' names but ignore the first 'v' character in each name
tag_names
=
[
tag
.
name
[
1
:]
for
tag
in
latest_tags
]
print
(
tag_names
)
# sort them correctly according to each subversion number
tag_names
.
sort
(
key
=
StrictVersion
)
print
(
tag_names
)
# take the last one, as it is the latest tag in the sorted tags
latest_tag_name
=
tag_names
[
-
1
]
return
latest_tag_name
...
...
@@ -171,6 +187,17 @@ def get_parsed_tag(gitpkg, tag):
def
update_tag_comments
(
gitpkg
,
tag_name
,
tag_comments_list
,
dry_run
=
False
):
"""
Write annotations inside the provided tag of a given package.
Args:
gitpkg: gitlab package object
tag_name: The name of the tag to update
tag_comments_list: New annotations for this tag in a form of list
dry_run: If True, nothing will be committed or pushed to GitLab
Returns: The gitlab object for the tag that was updated
"""
# get tag and update its description
tag
=
gitpkg
.
tags
.
get
(
tag_name
)
print
(
'
Found tag {1}, updating its comments with:
'
.
format
(
gitpkg
.
name
,
tag
.
name
))
...
...
@@ -180,26 +207,42 @@ def update_tag_comments(gitpkg, tag_name, tag_comments_list, dry_run=False):
return
tag
def
commit_files
(
gitpkg
,
files_list
,
message
=
'
Updated files
'
,
dry_run
=
False
):
def
commit_files
(
gitpkg
,
files_dict
,
message
=
'
Updated files
'
,
dry_run
=
False
):
"""
Commit files of a given GitLab package.
Args:
gitpkg: gitlab package object
files_dict: Dictionary of file names and their contents (as text)
message: Commit message
dry_run: If True, nothing will be committed or pushed to GitLab
"""
data
=
{
'
branch
'
:
'
master
'
,
# v4
'
commit_message
'
:
message
,
'
actions
'
:
[]
}
# add files to update
for
filename
in
files_
lis
t
.
keys
():
for
filename
in
files_
dic
t
.
keys
():
update_action
=
dict
(
action
=
'
update
'
,
file_path
=
filename
)
# with open(filename, 'r') as f:
# update_action['content'] = f.read()
update_action
[
'
content
'
]
=
files_list
[
filename
]
update_action
[
'
content
'
]
=
files_dict
[
filename
]
data
[
'
actions
'
].
append
(
update_action
)
print
(
"
Committing changes in files: {0}
"
.
format
(
str
(
files_
lis
t
.
keys
())))
print
(
"
Committing changes in files: {0}
"
.
format
(
str
(
files_
dic
t
.
keys
())))
if
not
dry_run
:
gitpkg
.
commits
.
create
(
data
)
def
get_last_nonskip_pipeline
(
gitpkg
,
before_last
=
False
):
"""
Returns the last running pipeline or the one before the last.
Args:
gitpkg: gitlab package object
before_last: If True, the pipeline before the last is returned
Returns: The gtilab object of the pipeline
"""
# sleep for 10 seconds to ensure that if a pipeline was just submitted,
# we can retrieve it
time
.
sleep
(
10
)
...
...
@@ -212,6 +255,15 @@ def get_last_nonskip_pipeline(gitpkg, before_last=False):
def
just_build_package
(
gitpkg
,
dry_run
=
False
):
"""
Restrt the last runnable pipeline of the package
Args:
gitpkg: gitlab package object
dry_run: If True, the pipeline will not be actually restarted on GitLab
Returns:
"""
# we assume the last pipeline is with commit [skip ci]
# so, we take the pipeline that can be re-built, which the previous to the last one
last_pipeline
=
get_last_nonskip_pipeline
(
gitpkg
,
before_last
=
True
)
...
...
@@ -232,7 +284,15 @@ def just_build_package(gitpkg, dry_run=False):
last_pipeline
.
retry
()
def
wait_for_pipeline_to_finish
(
gitpkg
,
tag
,
dry_run
=
False
):
def
wait_for_pipeline_to_finish
(
gitpkg
,
dry_run
=
False
):
"""
Using sleep function, wait for the latest pipeline to finish building.
This function pauses the script until pipeline completes either successfully or with error.
Args:
gitpkg: gitlab package object
dry_run: If True, print log message and exit. There wil be no waiting.
"""
sleep_step
=
30
max_sleep
=
60
*
60
# one hour
pipeline
=
get_last_nonskip_pipeline
(
gitpkg
,
before_last
=
True
)
...
...
@@ -264,12 +324,28 @@ def wait_for_pipeline_to_finish(gitpkg, tag, dry_run=False):
def
cancel_last_pipeline
(
gitpkg
):
"""
Cancel the last started pipeline of a package
Args:
gitpkg: gitlab package object
"""
pipeline
=
get_last_nonskip_pipeline
(
gitpkg
)
print
(
'
Cancelling the last pipeline {0} of project {1}
'
.
format
(
pipeline
.
id
,
gitpkg
.
name
))
pipeline
.
cancel
()
def
release_package
(
gitpkg
,
tag_name
,
tag_comments_list
,
dry_run
=
False
):
"""
Release package. The provided tag will be annotated with a given list of comments.
README.rst and version.txt files will also be updated according to the release procedures.
Args:
gitpkg: gitlab package object
tag_name: The name of the release tag
tag_comments_list: New annotations for this tag in a form of list
dry_run: If True, nothing will be committed or pushed to GitLab
"""
# if there is nothing to release, just rebuild the package
if
tag_name
==
'
none
'
:
print
(
"
Since the tag is
'
none
'
, we just re-build the last pipeline
"
)
...
...
@@ -305,6 +381,19 @@ def release_package(gitpkg, tag_name, tag_comments_list, dry_run=False):
def
parse_and_process_package_changelog
(
gl
,
bob_group
,
pkg_name
,
package_changelog
,
dry_run
=
False
):
"""
Process the changelog of a single package. Parse the log following specific format.
Update annotations of the provided older tags and release the package by following the last tag description.
Args:
gl: Gitlab API object
bob_group: gitlab object for the group
pkg_name: name of the package
package_changelog: the changelog corresponding to the provided package
dry_run: If True, nothing will be committed or pushed to GitLab
Returns: gitlab handle for the package, name of the latest tag, and tag
'
s comments
"""
cur_tag
=
None
cur_tag_comments
=
[]
...
...
@@ -332,6 +421,17 @@ def parse_and_process_package_changelog(gl, bob_group, pkg_name, package_changel
def
main
(
private_token
,
group_name
=
'
bob
'
,
changelog_file
=
'
changelog.rst
'
,
dry_run
=
False
,
package
=
None
,
resume
=
False
):
"""
Main function that updates and releases packages according to the provided changelog file.
Args:
private_token: GitLab token with the access rights to update and release Bob
'
s packages
group_name: Name of the group in GitLab. By default, the name of the group is
'
bob
'
changelog_file: The changelog file that defines which packages will be processed
dry_run: If True, nothing will be committed or pushed to GitLab
package: If provided, only this package will be processed
resume: If True, the processing of changelog will be resumed starting with the provided package
"""
gl
=
gitlab
.
Gitlab
(
'
https://gitlab.idiap.ch
'
,
private_token
=
private_token
,
api_version
=
4
)
bob_group
=
gl
.
groups
.
list
(
search
=
group_name
)[
0
]
...
...
@@ -362,7 +462,7 @@ def main(private_token, group_name='bob', changelog_file='changelog.rst', dry_ru
if
gitpkg
:
release_package
(
gitpkg
,
tag
,
tag_comments
,
dry_run
)
# now, wait for the pipeline to finish, before we can release the next package
wait_for_pipeline_to_finish
(
gitpkg
,
tag
,
dry_run
)
wait_for_pipeline_to_finish
(
gitpkg
,
dry_run
)
# if package name is provided and resume is not set, process only this package
if
package
==
cur_package_name
and
not
resume
:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment