Add a synthetic .git directory containing the commit sha so that 'git rev-parse HEAD' works from inside builds
This commit is contained in:
parent
49f8629566
commit
07f3bd6f8c
2 changed files with 48 additions and 8 deletions
|
@ -3,6 +3,7 @@ import io
|
|||
import os.path
|
||||
import tarfile
|
||||
import base64
|
||||
from StringIO import StringIO
|
||||
|
||||
from github import Github, UnknownObjectException, GithubException
|
||||
from tempfile import SpooledTemporaryFile
|
||||
|
@ -297,14 +298,50 @@ class GithubBuildTrigger(BuildTrigger):
|
|||
# Seek to position 0 to make tarfile happy
|
||||
tarball.seek(0)
|
||||
|
||||
# Pull out the name of the subdir that GitHub generated
|
||||
# Pull out the name of the subdir that GitHub generated.
|
||||
with tarfile.open(fileobj=tarball) as archive:
|
||||
tarball_subdir = archive.getnames()[0]
|
||||
tarball_subdir = archive.getnames()[0]
|
||||
tarball_subdir_info = archive.getmember(tarball_subdir)
|
||||
|
||||
# Seek to position 0 to make boto multipart happy
|
||||
# Seek to position 0 to make tarfile happy
|
||||
tarball.seek(0)
|
||||
|
||||
dockerfile_id = user_files.store_file(tarball, TARBALL_MIME)
|
||||
with SpooledTemporaryFile(CHUNK_SIZE) as updated_tarball:
|
||||
def add_entry(arch, dir_path, base_info, contents=None):
|
||||
info = tarfile.TarInfo(dir_path)
|
||||
|
||||
info.uid = base_info.uid
|
||||
info.gid = base_info.gid
|
||||
info.uname = base_info.uname
|
||||
info.gname = base_info.gname
|
||||
info.mode = base_info.mode
|
||||
info.mtime = base_info.mtime
|
||||
|
||||
info.type = tarfile.REGTYPE if contents else tarfile.DIRTYPE
|
||||
if contents:
|
||||
info.size = len(contents)
|
||||
|
||||
arch.addfile(info, fileobj=StringIO(contents) if contents else None)
|
||||
|
||||
with tarfile.open(fileobj=updated_tarball, mode='w|gz') as updated_archive:
|
||||
# Copy existing members of the tar to the updated archive.
|
||||
with tarfile.open(fileobj=tarball) as archive:
|
||||
for tar_info in archive:
|
||||
if tar_info.isreg():
|
||||
updated_archive.addfile(tar_info, archive.extractfile(tar_info.name))
|
||||
else:
|
||||
updated_archive.addfile(tar_info)
|
||||
|
||||
# Add the synthetic .git directory to the tarball, containing the commit_sha.
|
||||
add_entry(updated_archive, tarball_subdir + '/.git/HEAD', tarball_subdir_info,
|
||||
contents=commit_sha)
|
||||
add_entry(updated_archive, tarball_subdir + '/.git/objects/', tarball_subdir_info)
|
||||
add_entry(updated_archive, tarball_subdir + '/.git/refs/', tarball_subdir_info)
|
||||
|
||||
# Seek to position 0 to make boto multipart happy
|
||||
updated_tarball.seek(0)
|
||||
|
||||
dockerfile_id = user_files.store_file(updated_tarball, TARBALL_MIME)
|
||||
|
||||
logger.debug('Successfully prepared job')
|
||||
|
||||
|
|
Reference in a new issue