►
From YouTube: Hacksgiving: Intro to Plugin Development Workshop
Description
schristou gives his "Intro to Plugin Development" workshop. This is from Day Two of Hacksgiving 2015.
A
Okay,
so
this
is
the
hacks
giving
can
I
like
plugin
intro
arm
into
the
plug
and
development,
along
with,
like
a
sudden
plug
and
development
training
type
stuff,
so
I
I'm
gonna
first
start
off
by
saying
you
know
who
am
I.
I
am
stephen
cristo
realize
your
screen
presenting
it
should
be.
A
You
guys
see:
ok,
I,
sorry
about
that,
so
I
guess
we
can
restart.
So
this
is
the
plug-in
intro
training
for
x
giving
so
everyone
probably
wondering
you
know
who
am
I.
I
I'm
stephen
hirst.
Oh,
I
am
currently
a
cloud-based
support,
engineer
working
on
jenkins
and
I
am
also
a
lead
developer
of
coverture,
which
is
a
code
coverage
tool
for
java.
A
I've
been
doing
Jenkins
coding
for
a
couple
years
now
so
and
I've
done
this
training
in
the
past
so
and
a
lot
of
people
have
liked
it
so
so
kind
of
the
first
thing
you
know
usually
I.
Ask
myself
when
I'm
doing
things
like
you
know,
first
time
plug-in
development,
so
so
usually
I
ask
you
know,
does
something
like
this
already
exists?
So
usually
what
happens
is
I
will
get
an
idea?
Something
like
you
know
the
like.
A
A
However,
if
something
doesn't
exist
already,
the
next
thing
I
Jewish,
usually
ask
myself,
is:
can
I
make
some
improvements
to
something
that
is
very
close
to
what
I
want
and
if
I
can,
then
you
know
why
not
implement
a
new
improvement
or
add
a
new
feature
or
you
know,
fix
a
bug
that
way.
You
know
everyone
can
benefit.
The
entire
community
can
benefit
instead
of
you
know
just
me
so
the
so.
A
If,
for
example,
you,
if
you
meet
the
criteria,
you
know,
if
you
say,
okay
I
want
to,
you
know
help
improve
a
pre-existing
plugin
or
if
I
want
to.
You
know,
continue
some
work.
This
is
some
of
the
basics
that
you
would
have
to
kind
of
learn
about
in
order
to
get
a
little
bit
started
with
some
of
the
plug
and
development.
A
So
the
first
part
is
the
extension
arm,
and
this
is
one
of
the
really
I
like
to
call
the
the
key
components
of
jenkins
that
makes
it
like
really
powerful
on
it's
basically,
and
so
this
is
in
java
coding,
it's
an
annotation
and
it
goes
around
certain
classes
arm
and
I'll
kind
of
explain
that
a
little
bit
later,
what
that
means,
so,
basically,
what
it
does
is
it
tells
Jenkins
to
I
call
it
a
register
this
class,
so
what
it
will
do
is
it
will
take.
A
You
know
it
would
take
this
class
and
add
it
to
the
pre-existing
list,
if
you
will
of
certain
extension
points.
So
the
extension
point
is
really
just
I
like
to
think
of
it
as
like:
a
giant
list
of
available
classes
for
that
specific
type
and
the
extension
allows
you
to
take
a
class
and
add
it
to
that
list
to
make
it
available
for
Jenkins
core
actually
already
has
a
very
large
number
of
these
predefined
extension
points
they
exist.
You
know
they
exist
for
a
long
time.
A
A
A
So
anything
you
know
so
like
me
as
myself,
you
know
I'm
not
implementing
a
new
version
of
an
extension
for
I'm,
just
adding
to
the
pre-existing
element.
So,
like
a
builder
as
an
example
that
already
exists.
So
basically,
all
that
you're
doing
is
just
adding
this
annotation
and
Jenkins.
It
automatically
figures
out.
You
know
where
it
needs
to
go
and
adds
it
to
that
list.
A
So,
right
to
like
simply
put
you
know,
it's
just
taking
the
class
that
you
have
and
just
you
know
it
registers
it
or
it
adds
it
to
that
existing
list.
So
the
first
one
that
we're
actually
going
to
look
at
is
something
called
a
route
action,
and
everyone
probably
is
wondering
you
know
what
is
an
action
and
inaction
is,
is
basically.
A
A
So
and
I
will
explain
this
I
know
and
right
now
we're
going
to
do
kind
of
a
demo
of
this
route
action.
So
let
me
open
up
my
IDE
here
so
before
the
meeting
I,
everyone
should
probably
run
the
command
maven
hpi
create
to
kind
of
create.
This
template,
unfortunately,
can't
expand
it
over
here,
but
it
kind
of
creates
like
a
tree,
so
the
hpi
create
will
create
like
a
very
simple,
like
template.
Aversion
of
you
know
a
hello
world
up
program
and
asked
you
for
like
a
few
parameters
and
based
on
that.
A
It
creates
this
hello
world
plugin,
but
in
this
demo,
we're
not
going
to
actually
work
with
the
hello
world
at
all.
We're
going
to
be
doing
our
own
I
also
suggest
checking
out
this
hello
world
builder,
as
it
does
on
a
very
large.
It
has
a
very
large
number
of
comments
and
it
kind
of
describes
in
more
detail
a
lot
of
stuff
that
I'm
talking
about
so
the
first
thing
we're
going
to
do
actually
I'm
going
to
just
sorry
I'm,
going
to
clean
up
my
directories
as
as
I
was
compiling
some
stuff
earlier
today.
A
A
So
if
I
go
to
localhost
colon
8080,
slash
jenkins,
you
will
see
that
it's
coming
up
with
a
new
instance
and
it
will
automatically
install
the
plugin
that
I
specify
or
the
plugin
that
I'm
running
from
within,
so
the
root
action
is
something
that
I
would
like
to
add
kind
of
on
this
right-hand
hear
that
kind
of
like
a
new
page,
so
I.
The
first
thing
is,
you
know:
there's
there's
three
components
for
this
piece
right
here.
A
Like
an
example,
is
this
credentials
part
there's
three
main
components:
there's
this
image,
there's
the
text
and
then
there's
a
link.
So
these
three
are
the
big
components
to
make
this
this
link
right
here
and
we're
going
to
basically
add
our
own
down
here.
A
So
if
I
open
up
so,
if
I
add
a
new
Java
class
and
I
call
it
a
hex
giving
root
action,
I
click
OK,
it's
going
to
create
the
class
and
I
also
forgot
to
mention
that
I
you
have
to
actually
extend
the
specific
class.
So
we
need
to
implement
the
root
action,
and
in
doing
so
we
have
to
implement
the
necessary
methods
which
were
I,
the
icon
name.
A
A
So
basically,
what
this
will
do
is
it
will
and
the
route
drinkin's
page.
It
will
add
the
icon,
like
a
little
gear,
it'll,
say
hacks,
giving
2015
and
when
I
click
on
it
it
will
go
here.
And
the
part
of
the
extension
point
is
that,
if
I,
so,
if
I
add
this
at
extension,
fast
there,
what
it
will
do
is
it
will
see
that
it's
a
route
action
and
add
it
to
the
route
action
list.
So
as
long
as
I
implement
or
I
extend
a
extension
point.
A
A
A
A
A
So
right,
so
this
kind
of
just
you
know
shows
very
simply.
You
know
how
you
know.
Just
adding
this
add
extension,
you
know
it
kind
of
it
figures
out.
You
know
where
to
kind
of
put
this
class
and
where
to
kind
of
move
it
around.
So
the
next
part
is,
you
know
this
is
great,
but
what
happened
if,
for
example,
I
wanted
to
do
a
little
bit
more
and
I
wanted
to
on?
A
A
Another
thing
you
can
do
so:
instead
of
specifying
the
URL
name,
what
you
would
do
is
you
would
specify
so,
instead
of
a
specific
URL,
you
would
specify
something
like
hacks
giving
2015
and
what
this
will
do
is
when
I
click
on
this
link
oops
sorry
wrong
way.
So
when
I
click
on
this
link,
it
will
go
to
a
slash
hacks,
giving
2015.
A
So,
as
you
can
see
here,
there's
hacks
giving
at
the
bottom
you
can
see.
The
link
is
pointing
to
axe
giving
2015
and
it's
the
hello
world
hack,
schema
page.
So
so
this
is
very
nice.
However,
as
you
can
see
here,
you
know
it's
very
static
right
it.
It
doesn't
look
that
good.
You
know
you
would
want
something
like
this
to
be
a
little
bit
more
dynamic,
so
it
so
this
act
you
actually
can
implement
something,
that's
a
little
more
dynamic.
A
So
if
I
remove
this
hello
world
builder
or
hello
world
section,
you
can
actually
ask
it
to
call
a
java
method
directly.
So
if
I
do
dollar
sign
a
curly
brace,
I
can
actually,
you
know
invoke
something
like
this
get
display
name.
So
I
would
like
to
display
this
hacks
giving
2015
on
this
index
such
le
are
so
I
would
like
it
to
display
it
up
here.
A
So
to
do
that
there
is
a
variable
called
IP,
which
is
the
instance
are
the
kind
of
like
the
instant
of
this
and
then,
if
I
say
display
name
it
will
automatically
wreck,
it
will
automatically
call
this
get
display,
name
and
return.
Hacks
given
2015,
so
if
I
the
other
nice
thing
too,
is
that
if
you
modify
only
the
jelly
file
I,
you
do
not
have
to
recompile
everything
you
just
have
to
refresh
the
page.
A
So
so
you
can
like
render
your
own
pages
from
within
Jenkins.
So
this
is
really
nice.
However,
there's
a
small
problem
I
think
and
that
it
doesn't
have
things
like
the
the
header
and
the
footer
or
like
the
the
top
section
up
here
and
the
bottom
section
down
here.
Okay
and
I
would
like
it
to
actually
have
that
when
I
click
here
so
within
jelly,
you
can
actually
tell
it.
This
is
to
inherit
the
layout
from
any
previous
odd,
so
you
can
inherit
the
layouts.
Are
you
from
Jenkins
so
to
do
that
in
jelly?
A
A
So
what
this
will
do
is
on
that
main
panel
page.
It
will
so
you'll
have
the
header.
So
if
I
go
back,
you
will
have
the
header
and
footer
or
header
and
I
guess
footer,
and
then
in
this
main
page
right
here
it
will
render
the
hello
world
or
hex
giving
2015,
and
this
is
a
hacks
giving
page.
So,
as
you
can
see
here,
this
is
like
the
main
panels
section
right
here,
so
you
know
you:
can
you
still
inherit
the
like
all
the
other
options
up
above
and
below?
A
A
So
the
so
right,
so
it's
very
easy
to
add
it.
You
know
you
just
create
the
class.
You
know
you
implement
the
methods
that
are
needed
and
you
add
the
add,
extension
and
you're
pretty
much
done.
We
also
saw
that
you
know
using
jelly.
We
were
able
to
kind
of
take
the
page
and
render
it
a
little
bit
better
to
make
it
dynamic
the
page
to
be
able
to
call
things
like
Java
code
things
like
that,
so
it's
it
could
be
really
powerful.
A
So
the
I
assume
that
everyone
is
probably
asking
you
know
where
do
I
find
more
of
these
extension
points
and
if
you
go
so
drink,
Authority
has
a
lot
of
predefined
extension
points
on.
So,
if
you
go
to
the
wiki
page
and
just
search
extension
points
on,
and
it
should
also
be
in
the
notes
page,
the
thing
is
that
it
will
be
available,
so
you
can
actually
do
searches,
so
you
can
actually
search
from
within
their.
You
know.
The
other
extension
points
that
exists
currently.
A
So
the
next
part
I'm
going
to
talk
about
is
these
things
called
descriptors.
So
the
definition
of
a
descriptor
is
like
an
object
that
holds
a
metadata
about
like
a
describable
object,
so
I
think
of
it
like
kind
of
like
a
singleton
and
how
the
way
you
kind
of
use.
You
create
a
new
instance
of
what
you
know
it's
kind
of
describing
you
know,
kind
of
a
fresh,
install
of
a
specific
item
or
a
specific
class.
You
know
I,
usually
think
of
it
as
the
class
and
object
in
object-oriented
programming.
A
So
it's
very
you
know,
you
know
you
have
your
class
and
then
you
have
your
object.
You
know
it's
kind
of
like
that,
so
it's
like
that
type
of
relationship.
So
right
so
it
the
descriptor
holds
like
this
information
for
what
it's
basically
kind
of
describing
so
I,
also
like
to
think
of
it.
It's
like
it
contains
like
static
information
I
in
Java,
but
not
like
literal
static,
but
you
know
it
contains.
A
Information
about
the
specific
class
and
Jenkins
actually
uses
the
descriptor
to
kind
of
consult,
how
it
should
create
a
new
instance
of
this
specific
type
and
I'll
kind
of
explain
that
in
the
next
slide
you
know
how
it
kind
of
does
that
so
so
this
thing
also
holds
other
things
like
helper
methods.
A
So,
like
a
save
and
a
load
operation,
it
also
holds
things
like
a
the
deuced
star
method,
so
I
these
do
star
methods
what
they
do
is
basically,
when
I
think
other
people
have
seen
like
when
they
open
up.
You
know
a
Jenkins
installation,
and
you
know
the
field,
it's
kind
of
like
a
pre
validated
field,
so
it
like
verifies
that
you
know
the
field
you
entered
is
correct.
A
Like
the
name
is
correct
or
you
know
the
spelling
is
correct,
or
if
you
entered
a
invalid
or
valid
number
there's
these
operations
like
a
check
method
based
on
the
object
name
itself,
and
then
you
can
also
do
things
like
a
bill.
Operations
like
I
can
fill
in
a
a
drop-down
list
dynamically.
A
So,
and
I
will
explain,
I
will
show
how
to
kind
of
do
this
in
the
demo.
To
kind
of
like
allow
you
to
create
your
own
on,
like
validation
fields,
so
the
next
thing
I'd
like
to
talk
about
is
the
databank
constructor
and
this
basically,
it
contains
kind
of
like
the
information.
That's
past,
you
know
from
the
jelly
and
groovy
and
it
passes
that
information
from
the
brow
certain
to
Java
DC
realises
the
JSON
into
a
Java
object.
A
So
you
know
you
add
it
to
the
constructor
and
it
automatically
knows
to
deserialize
the
the
JSON
object,
and
you
know
it.
It
knows
how
to
deserialize
the
JSON
and
I
right.
So
it
knows
how
to
deserialize
it
into
a
JSON
or
Java
object,
so
I'm
going
to
kind
of
demo
the
builder
for
now.
A
So
so,
if
we
come
back
here,
what
I'm
going
to
do
is
I'm
going
to
create
a
new,
a
new
class,
and
I'm
going
to
call
this
a
hex
giving
sleep
builder,
and
this
is
basically
going
to
in
this
example.
All
I'm
going
to
do
is
I'm
just
going
to
sleep,
for
you
know
a
few
minutes
or
a
few
seconds.
A
You
know,
however
long
you
specify
I
within
their
it's
going
to
to
kind
of
sleep
forth,
so
the
first
thing
is
to
kind
of
know
so
I
kind
of
cheated
ahead
of
time
and
I
looked
at
the
extension
list
and
I
saw
which
and
put
which
methods
I
needed
to
implement.
So
there's
if
I
extend
bill,
if
I
extend
builder,
what
this
does
is
it
adds
it
to
the
build
section.
So
when
I
create
a
new
job,
I
call
it
a
pasture
up
it.
So
if
I
create
a
freestyle
project.
A
A
So,
however,
I'm
also
going
to
implement
a
simple
build
step.
So
this
is
not
a
very
complex
tepid,
it's
very
basic,
so
this
is
going
to
tell
me
what
method
I
actually
need
to
implement.
So
let
me
it's
out
a
little
bit,
so
it's
all
on
the
same
page.
So
so,
as
you
can
see
here,
this
simple
build
step,
told
me
to
only
override
this
perform
method.
A
So
I,
that's
basically
all
I'm
going
to
do
is
just
override
this
perform
method.
So,
in
order
for
us
to
actually
sleep,
we
need
some
time.
We
need
like
a
set
time
to
kind
of
sleep
right
so
private
long
time
and
most
likely,
we
will
need
a
constructor
for
this.
The
public
hex,
giving
sleep
builder
that
takes
a
long
time
and.
A
Right,
so
we
have
some
very
simple
things:
you
know
be
getters
and
setters.
They
add
you
know
the
ability
yeah
so
like
I
can
create,
and
I
can
add
stuff
arm
so
in
this
perform
method.
What
you
do
is
you
a
happy
operation
that
you
would
like
to
perform
in
this
example,
I'm
just
going
to
do
your
thread
that
sleep
for
the
amount
of
time.
A
However,
this
would
not
be
good
right
if
I
see
this
as
of
right.
Now
it's
just
going
to
sleep
and
it's
never
going
to
tell
me
anything.
You
know
it's
not
going
to
tell
me
what
is
going
on
and
if
I
run
it
right
now,
it's
it's
not
going
to
tell
me
you
know,
hey
I'm,
sleeping
right
now,
so
we
would
like
to
kind
of
display
a
message
that
says
you
know
hey
I'm
sleeping
this
is
the
amount
I'm
I'm
sleeping
for
on.
A
A
So
when
you
execute
a
new
build,
this
is
actually
a
stream
and
it
contains
so
this
task
listener
is
the
stream
that
kind
of
you
know
has
the
you
have
the
ability
to
kind
of
like
add
newlines
here.
So
if
I
do
listener
that
get
logger
dot
print
line,
I
can
add
you
know
a
message
to
here
to
kind
of
say
you
know
this:
is
I'm
sleepy
for
this
amount
of
time
so
I'm
going
to
add
sleeping
for
us,
I'm
sleeping
for
or-
and
it
tells
me.
A
A
D
describable
remember
the
so
we
have
to
implement
that
describable
method
or
the
describable
class,
which
is
going
to
describe
this
asleep
method
or
these
hacks
giving
sleep
builder
for
us.
So
what
we
would
have
to
do
is
we
have
to
create
a
static
final
de
script.
I
I
usually
use
the
scripture
in
pole
arm,
which
is
going
to
extend
oh,
so
class,
give
the
info,
which
extends
the
descriptor
and,
within
that
descriptor
it's
using
it's
a
type
of
builder.
C
A
Right,
so
I'm
not
sure
why
and
allow
that
before
I,
so
so,
okay,
so
it's
it's
asking
me
basically
for
this
descriptor
on
there
are
certain
methods
I
need
to
implement
and
the
better
than
you
can
implement
is
at
least
like
a
bare
minimum.
I
need
the
display
name.
So
what
what
it
should
basically
have
when
I.
So
if
I
come
over
to
the
test
rub
the
display
name
is
what
will
appear
right
here
on
this
list
here.
So
at
least
this
it
would
need.
A
So
in
this
case,
I'm
going
to
do
Thanksgiving
sleep
builder,
that's
the
name
I'm
going
to
call
it
and
with
in
doing
so,
I
need
to
tell
Jenkins
to
use
this
to
add
this
descriptor
to
the
list
of
builders.
So
if
I
use
extension,
the
at
extension
annotation
it's
going
to
find
the
list
of
builders
and
add
it
to
that
list.
For
me.
A
So
let
me
let's
see
so,
okay
and
okay,
so
I
guess
the
other
thing
I
forgot
to
mention
was
we
also
because
we're
also
creating
a
new
version
of
this.
So
the
problem
is
that
you
know
by
default.
We
don't
have
a
time
right
and
one
thing
we
would
like
to
do
is
kind
of
get
the
user
to
kind
of
enter
the
time
right.
We
would
like
to
you
know
it
would
be
nice,
you
know
we,
we
don't
have
anything
in
the
constructor
we
would
like.
A
A
So
on
the
configuration
page,
so
when
you
create
the
config
dot
jelly,
it's
going
to
basically
allow
you
to
add
the
things
like
in
here
so
like
the
command
section
I
from
within
a
Jenkins,
so
you
can
kind
of
you
know
tell
it
what
fields
and
items
are
what
fields
and
methods.
You
would
like
to
sorry
what
fields
you
would
like
to
instantiate.
So
in
this
example,
what
we're
going
to
do
is
we're
just
going
to
do
something
like
a
text
box
that
just
basically
displays
the
time.
A
A
A
So
what
I'm
going
to
do
is
I'm
going
to
add
a
text
box
for
this
time
field
and
in
doing
so
because
I
create
this
jelly
file
and
I
have
to
I
would
like
I
Jenkins
to
kind
of
add
this
a
field
this
time
to
the
class
over
here.
The
one
thing
is
that
I
would
like
I
would
like
it
to
kind
of
find
the
the
time
variable
to
the
time
over
here
automatically.
A
A
C
A
A
So
this
is
fairly.
You
know
fairly
nice
right,
like
you
know,
I
get
the
you
I,
you
know,
I
can
actually
perform
a
sleep
operation,
but
there's
a
small
problem
with
this
on
in
that
I
can
enter
any
time.
I
would
like
so
I
can
enter
negative
15
for
the
time
you
know
it
still
will
allow
me
to
you
know
it
doesn't
display
any
warnings
or
error
messages
or
anything.
A
So
that's
a
small
problem,
so
we
would
like
to
kind
of
do
some
validation
on
that
right.
We
would
like
to
make
sure
that
you
know
if
you
are
setting
it
to
negative
15.
You
know
you're
kind
of
told
not
to
so
I
had
mentioned
earlier,
that
there's
these
these
do
check
methods
that
allow
you
to
you
know,
add
your
own
version
of
it.
So
I
can
add
a
a
do
check
for
this
specific
time
field
and
have
it
tell
me
or
error,
you
know
if
I'm
doing
something
wrong.
A
So
if
I
do
public,
oh,
this
is
actually
a
form.
Validation
particular
has
this
form
validation
so
that
when
you
click
right
here,
you
know
if
you
enter
something
in
Ron,
it's
gonna
the
validation
who
fail
for
the
for
this
specific
form
or
form.
So
if
I
do
do
check
time,
and
what
I
wanted
to
do
is
that
I
wanted
to
query.
A
A
A
A
If
I
come
over
here
and
I
say
negative
15,
it
says
please
enter
a
positive
number,
so
it's
kind
of
giving
me
a
warning,
saying:
hey,
you
know
you
entered
a
wrong
number
in.
Please
enter
something
else
now,
there's
also
a
problem
in
that
I
could
also
enter
letters
and
it
still
passes.
So
we
need
to
kind
of
fix
this
up
a
little
bit
to
you,
know
kind
of
handle
this
situation
to
make
sure
that
it's
a
valid
right,
so
the
the
numbers
are.
A
The
letter
should
not
be
valid,
so
we
would
have
to
come
back
here,
and
the
thing
is
that,
instead
of
us
accepting
along,
if
we
accept
a
string,
we
can
basic
lycée
I.
You
know
if
we
wrap
this
thing
up
in
a
try-catch
block
or
try
of
x-ray
it'll
be
right
here
catch
with
the
number
format
exception.
We
could
do
something
like
long
value
of
time.
A
A
You
know
this
is
kind
of
adding
the
extra
validation.
No
it
says
here.
Please
enter
a
number.
You
know
it
allows
you
to
kind
of
do
this,
so
it's
you
know
fairly
easy.
You
know,
I
mean
all
I
did
was
just
you
know,
reimplement
this
check
time
method
and
basically
it
it
did
a
check
on
this.
You
know
field
right
here
to
make
sure
that
it
was
work
or
it
correctly
fits
this
criteria.
A
A
The
other
thing
I
could
do
is
let's
say,
for
example,
if
I
want
to
only
make
this
available
to
freestyle
projects,
so
I
do
not
want
this
made
available
to
something
like
a
maven
project
type.
So
if
I
build
a
maven
project-
okay,
you
know
it
should
be
available
within
here
I.
A
A
So
public
actually.
C
A
A
A
And
it
writes,
it
says
it's
applicable,
so
the
thing
is
that
there
are
different
types
of
descriptors,
so
the
first
one
that
implementer
was
the
very
basic
descriptor.
However,
since
odd
I
would
like
more
flexibility
with
this
build
step,
you
know
I
would
like
to
say
you
know.
Is
it
applicable
to
this
specific?
You
know
job,
you
know.
A
The
thing
is
that
you
know
I
wanted
to
say
you
know,
I
wanted
to
kind
of
error
or
not
displayed
if
it's
not
available
and
the
build
step
descriptor
is
like
a
generic
version
for
the
builder
type.
So
if
you
return
true,
you
know
it
always
is
applicable.
However,
the
thing
is
that,
like
I'd
mentioned
previously,
I
don't
want
this
to
be
available
to
the
I,
only
want
it
to
be
available,
sorry
to
the
Freestyle
project.
So
if
I
say
job
type
equals
equals
the
Freestyle
project
and
I
return.
True
else
return
false.
A
A
I
come
down
here:
I,
don't
see
it
anymore,
so
it
doesn't
apply
to
this
specific
type.
So
it
ignores
it.
However,
if
I
go
to
this
test,
job.
A
A
Right
sure
that
should
be
under
have
okay,
so
right,
so
you
should
you
can
kind
of
tell
it.
You
know
where
you
want
it
to
go
and
okay,
so.
A
The
next
part,
which
is
kind
of
what
I
have
been
getting
some
requests
from
in
the
mailing
list,
is
to
or
sorry
the
on
the
list
is
kind
of
how
to
localize
arm
certain
things.
So,
like
this
hacks
giving
a
sleep
builder,
we
would
like
to
kind
of
be
able
to
localize
this.
A
So
you
know
adding
different
languages.
Is
you
know
fairly
easy
for
you
know
something
like
this,
so
the
thing
is
that
in
Java
there
is
this
thing.
There's
this
messages
that
properties
file.
So
if
I
add
it
to
the
oops,
so
if
I
add
it
to
my
resources,
folder
I
can
basically
tell
it.
You
know
kind
of
what
I.
So
if
I
create
this
messages
that
properties
I
can
actually
tell
it,
you
know
I
want
it
to
be
this
specific
text
and
I
want
to
use
that
text.
A
So
so
let
me
copy
this
and
if
I
say
something
like
a
display
name
equals
this,
there's
a
special
type
of
compile
so
by
default.
It
will
compile
this,
however,
because
we're
doing
localized
if
we
click
double
click.
If
we
actually
do
localized
colon
generate
what
it
will
do,
is
it
will
create
on
in
the
generative,
folder
or
generated
sources
this
messages
class
here
and
basically,
what
this
does
is
it
has
the
content
of
the
display
name,
so
it
basically
goes
out
and
it
gets.
A
A
So
let
me
kind
of
minimize
certain
things
here.
So
what
this
will
do
is
this.
You
know
I
I'm,
basically
taking
all
the
these
strings.
That
are,
you
know
visible
from
the
UI,
so
like
an
example
is
like
the
tax
giving
sleep
builder
and
I
can
basically
I
can
put
it
right
here
and
tell
it.
You
know
to
use
this
specific
display
name.
So
if,
for
example,
we
need
to
add
it
for
a
different
language,
you
know
all
they're
doing
is
just
converting
this
one.
A
C
A
So
you
know
the
I
could
leave
if
you
add
messages,
dot
or
messages
fashion
in
another
language,
it
automatically.
Does
it
handles
the
you
know
the
correct
language
I
should
be
using,
so
this
is
kind
of
how
the
way
you
would
localize
all
these
string
values
to
make
them
available.
So
right
and
I
kind
of
the
final
thing
that
I
wanted
to
go
over.
That
was
a
requested.
A
lot
was
kind
of
writing
a
unit
test
for
this.
A
A
However,
for
this
example
I'm
just
going
to
write
kind
of
like
a
a
simple
unit
tests
to
verify
that
you
know,
unfortunately,
I
can't
verify
that
the
thread
that
sleep
occurred,
however,
I,
can
verify
that
this
I
tax
cut
properly
input
it.
So
so
that's
what
I'm
going
to
kind
of
task
with
this.
So
in
this
hello,
we'll
build
it
if
I
right
click
on
the
perform.
A
If
I
go
to
the
test,
so
there
it
doesn't
exist
a
test
currently
so
I
would
like
to
write.
A
new
test
does
not
have
my
okay,
so
what
I
would
like
to
do
is
have
this
be
a
test,
so
Jenkins
actually
uses
the.
So
I'm
going
to
write
this
with
j
unit
4,
so
there's
the
rules
on
that.
Allow
you
to
drink
it.
Has
this
drinking
the
rule.
A
To
my
list
here
so
this
should.
A
A
A
So
so,
if
I
do,
this
Jenkins
rule
allows
me
to
kind
of
add
this.
So
if
I
do.
A
I,
just
basically
add
you
know:
I
just
basically
created
a
freestyle
project
and
what
I'm
going
to
do
next
is
I'm
going
to
add
this
builder
to
the
list
of
builders
for
this
job.
So
if
I
say
p,
dot
get
builders
list
dot
add
I
can
say
I
want
to
well.
First,
let
me
actually
create
acts.
Giving
sleep
builder
equals
new
x,
given
sleep
builder,
with
a
time
of
one
two,
three
four
five.
A
So
you
know
I
set
the
time
specifically
its
1
2
3
4
5,
I'm
basically
telling
jenkins
to
or
I'm
creating
a
new
object,
a
new
builder.
With
that
specific
time
I
create
the
freestyle
project.
I
add
it
to
the
list
on
the
project
page
and,
if
I'd
say
p,
dot
schedule
a
build
40
seconds
so
start
immediately
on.
This
will
actually
return
a
future.
A
A
I
right
so
I
want
to
get
the
build
from
this,
so
I
scheduled
a
build
and
I
would
like
to
block
until
it
finishes
so
once
this
finishes,
I
guess.
A
Sir
equals
actually.
A
True,
I
would
like
to
assert
that
the
text
for
with
this
milliseconds-
so
if
I
say
bill-
oh
god,
get
log
dot
paints
be.
A
A
C
C
A
So
oh
I
think
I
know
why
it's
because
it's
a
ok,
I
think
I
know
why
sorry
about
this,
you
actually
have
to
create
a
specific
test.
Sorry,
because
I
kind
of
realized
that
I
put
it
in
the
the
main
part,
so
the
directory,
the
test
directory
and
the
Java.
So
within
here
mark
direct,
oh,
it's
ready
to
test
directory.
So.
C
Okay,
I.
A
That
it
looks
good
okay,
so
there,
so
I
guess
it
was
partially
my
fault,
because
I
put
in
the
wrong
directory.
So,
as
you
can
see
here
after
executing
the
sleep,
build
their
tests,
it's
starting
up
a
new
Jenkins
instance-
and
it's
you
know
executing
this.
A
A
A
Basic
unit
tests
to
kind
of
you
know
it
does
some
type
of
interaction
you
know
it.
It
performs.
You
know
asleep
operation,
however
I
mentioned,
but
previously
there's
things
like
the
acceptance
has
harness
that
do
a
lot
nicer,
like
you
I
interactions,
so
they
do
like
clicking
like
the
verification,
the
clicking.
So
you
can
see
here
that
it's
as
sleeping
for
you
know
this
time.
You
know
you
know
it
started.
It
succeeded.
A
You
know,
here's
the
output
for
it
and
everything,
so
that
was
what
I
kind
of
wanted
to
demonstrate
really,
and
so
this
also
leads
to
kind
of
like
another
question
like
how
can
I
on,
like
you
know,
can
I
improve,
like
the
pre-existing
plugins
and
an
example
is
that
you
know
I
like
to
point
to
the
ant
plugin,
specifically,
because
this
is
one
that's
currently
being
up
for
adoption.
So
if
I
go
into
I,
you
know
this
exact,
this
exact
method.
A
A
Stock
options,
but
that's
you
know
it's
probably
that's
to
be
kind
of
like
expected.
You
know,
there's
a
perform
method
here,
so
it's
performing
some
action.
You
know
it's
performing
right,
so
it's
performing
its
action.
You
know
it
has
the
build
step.
Descriptor
does
its
own
validation,
so
this
one
actually
will
not.
It
does
not
look
like
it
actually
does
the
do
checks.
However,
you
know
you
can
kind
of
see
that
you
know
they
have.
It
doesn't
apply
to
any
job.
A
You
know
it
does
usually
so
there
that
also,
so
you
know
it
kind
of
applies
to
like
real
world
as
well,
and
so
that
was
that
this
presentation,
if
you
have
questions
you,
can
ask
in
the
IRC
channel
hashtag
Jenkins
I,
you
know
you
can
mention
me
I'm
s,
Cristo,
oh,
that
should
actually
be
s
crystal,
not
as
crystal
88
or
someone
else
from
the
hacks
giving
page
and
the
Q
and
a
question
for
this
is
actually
not
tomorrow,
but
it's
right
after
this
session,
which
I
kind
of
went
over
a
little
bit.