use of com.google.cloud.tools.jib.blob.BlobDescriptor in project jib by google.
the class CacheWriter method writeLayer.
/**
* Builds an {@link UnwrittenLayer} from a {@link LayerBuilder} and compresses and writes the
* {@link UnwrittenLayer}'s uncompressed layer content BLOB to cache.
*
* @param layerBuilder the layer builder
* @return the cached layer
*/
public CachedLayer writeLayer(LayerBuilder layerBuilder) throws IOException, LayerPropertyNotFoundException {
UnwrittenLayer unwrittenLayer = layerBuilder.build();
// Writes to a temporary file first because the UnwrittenLayer needs to be written first to
// obtain its digest.
Path tempLayerFile = Files.createTempFile(cache.getCacheDirectory(), null, null);
// TODO: Find a way to do this with java.nio.file
tempLayerFile.toFile().deleteOnExit();
// Writes the UnwrittenLayer layer BLOB to a file to convert into a CachedLayer.
try (CountingDigestOutputStream compressedDigestOutputStream = new CountingDigestOutputStream(new BufferedOutputStream(Files.newOutputStream(tempLayerFile)))) {
// Writes the layer with GZIP compression. The original bytes are captured as the layer's
// diff ID and the bytes outputted from the GZIP compression are captured as the layer's
// content descriptor.
GZIPOutputStream compressorStream = new GZIPOutputStream(compressedDigestOutputStream);
DescriptorDigest diffId = unwrittenLayer.getBlob().writeTo(compressorStream).getDigest();
// The GZIPOutputStream must be closed in order to write out the remaining compressed data.
compressorStream.close();
BlobDescriptor compressedBlobDescriptor = compressedDigestOutputStream.toBlobDescriptor();
// Renames the temporary layer file to the correct filename. If the file already exists, we
// skip renaming and use the existing file. This happens if a new layer happens to have the
// same content as a previously-cached layer.
Path layerFile = getLayerFile(compressedBlobDescriptor.getDigest());
Files.move(tempLayerFile, layerFile, StandardCopyOption.REPLACE_EXISTING);
CachedLayer cachedLayer = new CachedLayer(layerFile, compressedBlobDescriptor, diffId);
LayerMetadata layerMetadata = LayerMetadata.from(layerBuilder.getSourceFiles(), FileTime.from(Instant.now()));
cache.addLayerToMetadata(cachedLayer, layerMetadata);
return cachedLayer;
}
}
use of com.google.cloud.tools.jib.blob.BlobDescriptor in project jib by google.
the class CountingDigestOutputStream method toBlobDescriptor.
/**
* Builds a {@link BlobDescriptor} with the hash and size of the bytes written.
*/
public BlobDescriptor toBlobDescriptor() {
try {
byte[] hashedBytes = digest.digest();
// Encodes each hashed byte into 2-character hexadecimal representation.
StringBuilder stringBuilder = new StringBuilder(2 * hashedBytes.length);
for (byte b : hashedBytes) {
stringBuilder.append(String.format("%02x", b));
}
String hash = stringBuilder.toString();
DescriptorDigest digest = DescriptorDigest.fromHash(hash);
return new BlobDescriptor(totalBytes, digest);
} catch (DigestException ex) {
throw new RuntimeException("SHA-256 algorithm produced invalid hash: " + ex.getMessage(), ex);
}
}
Aggregations