@@ -85,12 +85,47 @@ defmodule Makina.Applications do
8585 end
8686 end
8787
88+ def update_application ( % Server { } = server , % Application { } = app ) do
89+ if Server . connected? ( server ) do
90+ do_update ( server , app )
91+ else
92+ connect_and_update ( server , app )
93+ end
94+ end
95+
96+ def do_update ( % Server { } = server , % Application { } = app ) do
97+ IO . puts ( " Updating \" #{ app . name } \" " )
98+
99+ # rename current app to {name}__stale
100+ with { :ok , _ } <- mark_app_as_stale ( server , app ) ,
101+ { :ok , _ } <- do_deploy ( server , app ) ,
102+ { :ok , _ } <- stop_stale_app ( server , app ) do
103+ { :ok , :updated }
104+ end
105+ end
106+
107+ def connect_and_update ( % Server { } = server , % Application { } = app ) do
108+ server = Servers . connect_to_server ( server )
109+ result = do_update ( server , app )
110+ Servers . disconnect_from_server ( server )
111+
112+ result
113+ end
114+
88115 defp do_stop ( % Server { } = server , % Application { } = app ) do
89116 IO . puts ( " Stopping \" #{ app . name } \" " )
90117
91118 Docker . stop ( server , app ) |> SSH . execute ( )
92119 end
93120
121+ defp mark_app_as_stale ( % Server { } = server , % Application { } = app ) do
122+ Docker . rename_container ( server , app , suffix: "__stale" ) |> SSH . execute ( )
123+ end
124+
125+ defp stop_stale_app ( % Server { } = server , % Application { } = app ) do
126+ Docker . stop ( server , "#{ Docker . app_name ( app ) } __stale" ) |> SSH . execute ( )
127+ end
128+
94129 defp connect_and_stop ( % Server { } = server , % Application { } = app ) do
95130 server = Servers . connect_to_server ( server )
96131 result = do_stop ( server , app )
@@ -118,7 +153,7 @@ defmodule Makina.Applications do
118153 else
119154 { :ok , _container } ->
120155 Logger . debug ( "A version of #{ app . name } is already running, skipping." )
121- { :ok , :skipping }
156+ do_update ( server , app )
122157
123158 { :error , reason } ->
124159 { :error , reason }
0 commit comments