compose: Add --ex-jigdo-output-rpm

Part of the goal of jigdo ♲📦 is to support organizations switching to *only*
providing RPMs. An intermediate step there is to "lock" the repo and jigdo
together; we don't want to update the ref if building the jigdoRPM fails.

Add an option to perform `rpm-ostree compose tree` and `rpm-ostree ex
commit2jigdo` together; notably we generate a commit, but only update the ref
once the jigdoRPM is built.

Closes: #1165
Approved by: jlebon
This commit is contained in:
Colin Walters 2017-12-21 05:11:24 +01:00 committed by Atomic Bot
parent 4ad627f69b
commit 79f4b4b861
3 changed files with 60 additions and 0 deletions

View File

@ -196,3 +196,13 @@ It supports the following parameters:
and further, we don't want to encourage `/sysroot` to be writable.
For host system composes, we recommend turning this on; it's left off
by default to ease the transition.
Experimental options
--------
All options listed here are subject to change or removal in a future
version of `rpm-ostree`.
* `ex-jigdo-spec`: string, optional: If specified, will also cause
a run of `rpm-ostree ex commit2jigdo` on changes. Also requires the
`--ex-jigdo-output-rpm` commandline option.

View File

@ -39,6 +39,7 @@
#include "rpmostree-bwrap.h"
#include "rpmostree-core.h"
#include "rpmostree-json-parsing.h"
#include "rpmostree-jigdo-build.h"
#include "rpmostree-postprocess.h"
#include "rpmostree-passwd-util.h"
#include "rpmostree-libbuiltin.h"
@ -55,6 +56,7 @@ static gboolean opt_cache_only;
static gboolean opt_ex_unified_core;
static char *opt_proxy;
static char *opt_output_repodata_dir;
static char *opt_ex_jigdo_output_rpm;
static char **opt_metadata_strings;
static char *opt_metadata_json;
static char *opt_repo;
@ -75,6 +77,7 @@ static GOptionEntry install_option_entries[] = {
{ "cachedir", 0, 0, G_OPTION_ARG_STRING, &opt_cachedir, "Cached state", "CACHEDIR" },
{ "download-only", 0, 0, G_OPTION_ARG_NONE, &opt_download_only, "Like --dry-run, but download RPMs as well; requires --cachedir", NULL },
{ "ex-unified-core", 0, 0, G_OPTION_ARG_NONE, &opt_ex_unified_core, "Use new \"unified core\" codepath", NULL },
{ "ex-jigdo-output-rpm", 0, 0, G_OPTION_ARG_STRING, &opt_ex_jigdo_output_rpm, "Directory to write jigdoRPM", NULL },
{ "proxy", 0, 0, G_OPTION_ARG_STRING, &opt_proxy, "HTTP proxy", "PROXY" },
{ "dry-run", 0, 0, G_OPTION_ARG_NONE, &opt_dry_run, "Just print the transaction and exit", NULL },
{ "output-repodata-dir", 0, 0, G_OPTION_ARG_STRING, &opt_output_repodata_dir, "Save downloaded repodata in DIR", "DIR" },
@ -111,6 +114,7 @@ typedef struct {
OstreeRepo *pkgcache_repo;
OstreeRepoDevInoCache *devino_cache;
char *ref;
char *jigdo_spec;
char *previous_checksum;
JsonParser *treefile_parser;
@ -138,6 +142,7 @@ rpm_ostree_tree_compose_context_free (RpmOstreeTreeComposeContext *ctx)
g_clear_object (&ctx->pkgcache_repo);
g_clear_pointer (&ctx->devino_cache, (GDestroyNotify)ostree_repo_devino_cache_unref);
g_free (ctx->ref);
g_free (ctx->jigdo_spec);
g_free (ctx->previous_checksum);
g_clear_object (&ctx->treefile_parser);
g_clear_pointer (&ctx->serialized_treefile, (GDestroyNotify)g_bytes_unref);
@ -752,6 +757,11 @@ rpm_ostree_compose_context_new (const char *treefile_pathstr,
if (opt_workdir_tmpfs)
g_print ("note: --workdir-tmpfs is deprecated and will be ignored\n");
/* jigdo implies unified core mode currently */
if (opt_ex_jigdo_output_rpm)
opt_ex_unified_core = TRUE;
if (opt_ex_unified_core)
{
if (opt_workdir)
@ -861,6 +871,13 @@ rpm_ostree_compose_context_new (const char *treefile_pathstr,
if (!self->ref)
return FALSE;
g_autoptr(GFile) treefile_dir = g_file_get_parent (self->treefile_path);
const char *jigdo_spec = NULL;
if (!_rpmostree_jsonutil_object_get_optional_string_member (self->treefile, "ex-jigdo-spec", &jigdo_spec, error))
return FALSE;
if (jigdo_spec)
self->jigdo_spec = g_build_filename (gs_file_get_path_cached (treefile_dir), jigdo_spec, NULL);
*out_context = g_steal_pointer (&self);
return TRUE;
}
@ -1187,6 +1204,17 @@ impl_commit_tree (RpmOstreeTreeComposeContext *self,
&new_revision, cancellable, error))
return FALSE;
if (opt_ex_jigdo_output_rpm)
{
if (!self->jigdo_spec)
return glnx_throw (error, "No ex-jigdo-spec provided");
if (!rpmostree_commit2jigdo (self->repo, self->pkgcache_repo,
new_revision, self->jigdo_spec,
opt_ex_jigdo_output_rpm,
cancellable, error))
return FALSE;
}
/* --write-commitid-to overrides writing the ref */
if (self->ref && !opt_write_commitid_to)
{

View File

@ -0,0 +1,22 @@
#!/bin/bash
# Test rpm-ostree compose tree --ex-jigdo-output-rpm
set -xeuo pipefail
dn=$(cd $(dirname $0) && pwd)
. ${dn}/libcomposetest.sh
. ${dn}/../common/libtest.sh
prepare_compose_test "compose2jigdo"
pysetjsonmember "ex-jigdo-spec" '"fedora-atomic-host-oirpm.spec"'
mkdir cache
mkdir jigdo-output
runcompose --ex-jigdo-output-rpm $(pwd)/jigdo-output --cachedir $(pwd)/cache --add-metadata-string version=42.0
rev=$(ostree --repo=repo-build rev-parse ${treeref})
find jigdo-output -name '*.rpm' | tee rpms.txt
assert_file_has_content rpms.txt 'fedora-atomic-host-42.0.*x86_64'
grep 'fedora-atomic-host.*x86_64\.rpm' rpms.txt | while read p; do
rpm -qp --provides ${p} >>provides.txt
done
assert_file_has_content_literal provides.txt "rpmostree-jigdo-commit(${rev})"
echo "ok compose2jigdo"