►
Description
This is a recording of the Knowledge Transfer session about making Promoted Builds plugin Pipeline-compatible while retaining binary compatibility (Jun 04, 2019). This session could be useful to Jenkins Developers who migrate their plugins to Pipeline.
Meeting notes: https://docs.google.com/document/d/1SRLb8IeIKy3Ih83de0bDSHdJQdtmygloPfMMNRArkvo/edit#
GSoC project link: https://jenkins.io/projects/gsoc/2019/artifact-promotion-plugin-for-jenkins-pipeline/
A
B
A
A
B
A
B
Anyway,
that
was
that
was
the
part,
because
I
want
to
show
just
yeah
proposed
agenda
that
from
stick
put
in
the
Kidder.
Yes,
I.
Think
yes,
yeah,
then
there's
just
talk
it
through
this
I
think
about
the
last
part
about
breaking
down
talks.
It
should
be
somewhat
easy
to
do
it
offline.
So
there's
no
need
to
use
your
time
all
night.
To
this
so
I
say
that's
why
I
should
take
it
at
last,
there's
just
just
to
wrote
an
example
of
the
one
of
the
issues
we
should
break
down
so
anyway.
B
C
A
C
A
A
A
Just
the
can't
evolve
in
java-based
EPX,
oh
yeah,
you
remember.
We
have
already
seen
this
patient.
Oh
yeah.
These
documents
are
rather
2
main
guidelines
describing
how
you
could
do
that
so
yeah.
This
documentation
is
probably
not
enough
for
but
yeah
some
topics
so
yeah.
Let's
take
a
look
at
our
particular
example
believe
it's
loading,
promoting
bills,
yeah.
A
A
Okay,
sorry,
a
ski,
and
we
have
a
method
which
takes
abstract
build.
So,
yes,
we
discussed
that
the
previous
session,
when
you
use
the
abstract,
build
apps
from
project
another
types.
It
should
be
read
for
you
that
it's
not
compatible
this
pipeline
and
have
a
problem
here,
because
we
have
a
method
and
we
already
have
a
extension
points
which
increment
this
method,
probably
we
have
extension
points
outside
the
plug-in.
A
A
shape
change
of
type
of
formal
parameter,
it's
actually
a
breaking
compatibility,
even
if
you
upstream
the
type,
so
it
might
not
be
obvious,
sometimes
because
yeah
there
are
some
documentation
tool.
So
it
you
retain
source
compatibility
here
by
changing
the
type
by,
but
you
do
not
retain
binary
time.
Peabody
can
so
what
we
do
instead.
A
So
something
like
that.
So
now
we
keep
this
method
as
this,
but
we
stopped
eating
in
any
you
method.
So,
for
example,
yeah
now
it
will
be
run
so,
firstly,
what
you
need
to
keep
in
mind
here
that
AVMA,
if
you
have
a
new
method
here,
you
can
get
in
the
source
code
which
I
mean
with
so
you
cannot
retain
the
same
method,
usually
how
it's
being
done,
for
example,
you
can
pass
built
listener
here
or
it's
doing
the
configuration
resting
up,
so
you
have
a
new
method
actually
built.
A
A
A
A
A
A
A
A
C
A
A
Yeah
and
then
you
know
what
else
do
we
need
me
to
pass
environment?
That's
it
so
here
we
invoke
the
vault
method.
So
what
it
means
is
that
when
this
matrices
in
row
to
be
full
but
to
the
all
the
implementation,
then
here
yeah
we
can
keep
it
uses.
But
ID
have
invitation
here
which
comes
from
our
status.
So
you
me
see
that
it
also
uses
all
PPI
and
we
have
to
do
pretty
much
the
same
here.
So
we
create
deprecated
method
here.
A
Okay,
yeah
so
yeah.
You
will
be
able
to
polish
up
this
implementation
later
and
just
show
how
it
works
so
yeah
we
have
a
new
method,
but
then
what
we
need
to
do.
We
need
to
see
you
who
uses
to
this
old
method,
1
method
which
is
getting
environment
so,
and
you
may
see
that
it
actually
already
receives
task
listener.
A
So
what
we
discovered
here
that
you
will
have
a
method
which
all
the
game
has
login
attention
which
you
haven't
even
before,
so
we
pass
the
listener
here
but
yeah.
If
we
do
that
there
is
type
conflicts,
because
we
assumed
that
all
listeners
actually
build
listeners.
So
the
most
simple
way
to
fix
that
and
to
retain
will
actually
go
to
definition.
Decoration
just
say
the
turkey.
It
will
be
task
listener.
It
doesn't
really
matter
fault,
because
this
is
just
an
abstraction
class.
But
here
you
just
say
task.
A
A
A
A
A
A
For
historical
reasons,
so
yeah
this
method
is
fixed
and
there
is
also
a
manual
condition,
which
also
has
a
saw
promotion
which
you
can
see
it's
no,
but
in
Monell
condition
you
also
have
bad.
She
believed
yet
he
he
was
at
the
beach
and
he
which
he
wheels
have
built
and
first
method.
So
here
we
do
the
same.
A
A
Good
clothes
and
yeah
here
you
can
see
a
problem
which
is
going
here
because
yeah
more
than
is
instance
of
promotion,
a
factor
to
support
pipeline
emotion
types
so
again,
I
just
want
to
do
so
that
we
don't
touch
it
now.
So
what
you
can
do
here,
I
just
will
give
you
a
hint.
So
here
you
have
a
promotion.
C
A
A
C
A
A
C
A
A
C
A
C
A
C
A
A
It's
a
part
of
Jenkins
for
actually,
but
you
may
see
that
the
base
material
is
already
duplicated
and
we
have
a
new
method
for
runs,
so
what
it
means.
Firstly,
that
if
you
want
to
make
it
efficient,
we
would
need
to
provide
to
a
built
environment
for
promoted
run,
but
since
we
are
not
fully
sure
what
would
be
the
interface
of
promotion
run.
For
example,
me
yeah,
one
of
the
ways
is
to
say
that
promotion
run
is
always
a
run.
C
C
A
C
A
C
A
A
Promotion
run
so
we
implemented
these
two
interfaces
here,
but
now
we
need
to
understand
what
we
actually
returned
here,
because
now
obviously
not
an
option
but
yeah.
Here
we
have
here
we
have
a
good
target,
so
the
target
is
the
Builder
that
this
promotion
from
outed
so
yeah.
My
interface
is
just
the
target
here:
yeah
well
yeah
you
can
rename
it
later.
Maybe
it
should
be
just
a
good
target
of
its
source
whatever,
and
here
you
get
promotion
run.
We
just
return
this
actually
because.
C
A
A
A
C
A
C
A
C
C
A
C
A
Writing
pipeline
compatible
plugins
defining
symbols.
Yes,
everything
is
important,
so
you
will
have
to
go
through
this
guide.
But
the
entry
point
for
you
here,
there's
a
there
is
a
dual
step
thing
and
yeah.
This
build
step
think
actually
recommends
using
simple,
build
step
because
simple,
build
step
is
really
simple:
okay,
simple
bills
up
for
quickly
the
problem
there
that
it
will
require
workspace.
A
So
it's
probably
okay
for
now,
so,
let's
see
whether
I
can
access
simple
I
feel
step
yep.
So
it's
probably
the
most
straightforward
way:
yeah
use
pipeline
step,
okay
for
advanced
fields.
So
for
me
it
would
be
fine
if
you
start
from
simple
build
step,
though
it
has
its
own
limitations
but
yeah
the
advantage
of
it.
It's
really
simple.
C
A
C
A
C
A
A
C
To
ask
like,
in
this
conventional
method
of
passing
the
promotion
parameters
through
the
web,
UI
I,
guess,
there's
something
called
a
descriptor
list
in
the
promotion
condition
that
registers
the
input
the
desired
input
right.
How
is
it
passed?
How
is
it
passed
from
the
UI
with
parameters
or
which
variables
are
through
which
these
inputs
are
being
passed?
Okay,.
A
Condition
which
have
already
touched
so
you
may
see
that
there
is
actually
a
bunch
of
code,
but
what
you
can
see
that
there
are
parameter
definitions
there.
No,
it
means
that
promotion,
condition,
I,
know,
condition,
stores
its
own
definitions,
and
these
definitions
actually
get
retrieved
by
promotion.
C
A
A
C
A
What
it
means
that
South
promotion
condition
is
not
parameterize
about:
let's
take
a
look
at
the
its
implementation,
so
he
it's
almost
nothing
except
one
completed
handler
Rashida's
promotion,
but
it
gives
promotion
and
just
does
of
execution.
Let's
take
a
look
at
the
web,
viewing
so
its
resources,
conditions
of
promotion,
condition
on
and
again
there
is
no
parameterization
here
at
all.
So
what
I
believe
that
self
promotion
has
no
parameterization?
A
C
A
Let's
try
to
stick
in
the
coat
again
so
yeah
just
cause
other
passes.
Okay,
so
here
we
have
self
promotion
condition.
If
you
stall
down,
you
can
see
that
there
is
a
wrong
listener,
is
extension
point
which
actually
mean
monitors
completions
of
jobs.
So
he
monitor
completions
of
abstract
bills.
So
obviously
you
you
will
have
to
work
it
for
pipeline,
but
this
extension
point
here,
probably
looking
to
just
rename
it
here
and
call
it
my
not
compatibility
breakage
so
something
to
discuss
later.
A
C
A
So
these
job
properties
promotions,
your
property
and
when
it
exists,
we
assume
that
this
is
a
job
which
has
promotion
logic
defined.
Then
we
go
to
promotion
processes
and
for
which
process
we
check
conditions
and
they,
if
any
process
has
a
condition
with
self
promotion
condition,
then
self
promotion,
so
its
promotion
process
I
can
see
the
promotional
and
we
he
we
go
to
be
schooled.
Actually
it
just
goes
through
all
approvals,
so
yeah.
If
all
approvals
are
past,
whether
it's
my
approval
so
whatever,
then
we
just
execute
promotion.
That's
it.
A
C
C
A
Here
so
there
is
no
magic
there
so
get
to
that
using
the
code.
So
here
the
only
code
related
to
promote
is
can
see
the
promotion
here
we
process
all
the
conditions,
so
I
would
assume
that
yeah.
Then
there
is
a
method
here
which
is
considered
sorry.
There
is
the
matter
to
consider
promotion.
Here
we
can
get
remotely
built
actions
action
a
so.
We
okay.
A
Yes,
oh
yeah:
if
there
is
no
promotion,
we
just
go
forward
and
yeah.
There
is
a
magic
called
remote,
so
yeah,
let's
go
filter
in
the
code
implementation
remote.
Then
there
is
action
and
he
we
actually
have
that
there
is
a
code
code
stubs
qualification.
So
we
need
to
return
back
because
yeah
they
met.
It
was
actually
so.
The
quarter
comes
from
qualifications
promotion,
so
it
might
be
here
might
be
here,
but
we
need
to
go
back
to
consider
promotion
so
and
you
can
see
the
promotion.
A
Know
it's
a
promotion
condition
or
whatever
so
yeah.
This
stuff
would
be
generated
when
promotion
conditions
are
met,
and
now
we
need
to
understand
where
the
bed
is
just
injected.
I
focused
that
it's
gets
involved
here
but
illustrate
to
find
a
way
it
comes
from
in
the
code,
so
go
to
declaration
hey
we
have
addiction
or
whatever
so
promoted,
build
action
and
I
believe
that
it
contains
budgets
right.
C
A
Right
so
the
one
we
were
watching,
so,
let's
take
a
look:
well,
it
actually
gets
used,
but
yeah
it
will
be
everything
current
status,
so
yeah.
You
may
see
that
register
start
in
status
as
we
discussed
so
what
it
means
that
when
we
had
a
qualification
in
this
code,
so
here
oh
here,
we
actually
at
qualification
with
these
badges
to
the
action.
So
it
means
that
it's
just
information
about
badges.
Let's,
let's
take
a
look.
A
The
pages
actually
get
generated
for
these
status,
so
you
can
just
look
for
usages
of
this
parameter
and
he
would
see
we
have
value
right.
We
have
only
one
execution,
I,
it's
in
the
constructor.
So
when
we
construct
status,
we
put
all
the
edges
here.
It
said
the
only
way
to
modify
badges
and,
let's
take
a
look.
This
logic
was
made.
Yeah
we
come
again
to.
This
is
much
mattered.
So
therefore,
so
here
is
might
for
promotion
torches,
and
so
we
passed
all
conditions
disk
and
each
condition
it's
a
bridge.
A
C
Okay,
we
get
okay,
badges
are
assigned
from
this:
okay,
okay,
okay,
okay,
that
is
pretty
much
it
and
like
I,
had
like
redefined
one
task
in
JIRA
that
I
will
be
making
at
least
ni.
Yes,
yes,
the
next
question
is
okay.
This
is
done.
Okay,
badges
is
done,
since
we
were
working
for
pipelines
now,
promotion
trigger
this
class
promotion
trigger.
How
would
we
implement
this
in
pipeline
because
we'll
be
triggering
a
new
job?
Okay,
so
now
badges
have
been
assigned,
badges
have
been
a
sign
now.
How
is
triggering
done?
Oh
yeah.
A
C
A
A
Okay,
so
let's
go
to
the
super
method.
You
may
see
that
it's
part
of
abstract
mute
but
effectively
it's
executed
after
execution
of
the
guild,
so
yeah
we
can
just
find
usages
but
yep.
Basically,
when
the
build
finishes
in
abstract
build,
then
we
go
through
this
code
in
order
to
invoke
emotion
triggers
so.
A
Probably
dead,
but
not
in
this
implementation,
because
this
implementation
was
likely
created
the
in
ancient
times
and
now
what
we
have
already
seen
in
this
view
that
there
is
redundant
sneer
so
maybe
for
the
new
implementation.
It's
enough
to
have
done
this
in
yet
which
actually
checks,
promotion
triggers
so
run.
Listener
just
verifies
that
the
build
is
completed
and
the
once
it's
completed
a
it
can
consult
with
promotion
triggers
and
trigger
other
bits.
A
A
A
C
C
A
Right
because,
for
example,
if
you
take
a
look,
we
have
created
a
pretty
insulated
logic
for
promotion
batch.
So
if
there
was
a
separate
ticket
for
promotion
which
we
could
have
reviewed
to
this
pool
request
separately
and
this
request
separately
before
you
touch
other
things.
So
then
now
you
can
deliver
mentally
in
smaller
chunks.