This commit is contained in:
Thomas Klaehn 2016-04-28 15:03:04 +02:00
parent 44bb058368
commit 64bda9fe50
4 changed files with 263 additions and 124 deletions

View File

@ -1,7 +1,7 @@
\section{Gitlab workflow} \label{sec:glw} \section{Gitlab workflow} \label{sec:glw}
\begin{figure} \begin{figure}
\begin{center} \begin{center}
\input{img_gitlab_rel.tex} \input{img_gitlab.tex}
\caption{Gitlab workflow} \caption{Gitlab workflow}
\label{fig:gitlab_workflow} \label{fig:gitlab_workflow}
\end{center} \end{center}
@ -40,6 +40,9 @@ code freeze. Code freeze means each for the upcoming release planned
feature is implemented and merged to the main branch (normally master) of feature is implemented and merged to the main branch (normally master) of
the project's git repository (see figure \ref{fig:gitlab_workflow}). For the project's git repository (see figure \ref{fig:gitlab_workflow}). For
the upcoming release a "\texttt{release/...}" named branch is created. the upcoming release a "\texttt{release/...}" named branch is created.
For a proper release configuration it is necessary to configure the ci
build job before creating the release branch (see section \ref{sec:ci_conf})
.
\subsection{Release phase} \subsection{Release phase}
Any release relevant issue that is detected while release phase has to be Any release relevant issue that is detected while release phase has to be
fixed at the release branch. The release phase is splitted into different fixed at the release branch. The release phase is splitted into different
@ -68,9 +71,78 @@ constant high code quality, the ci system is used for various tasks:
\item Internal release deployment \item Internal release deployment
\item External release deployment \item External release deployment
\end{itemize} \end{itemize}
\subsection{Internal release deployment} \label{sec:ci_int}
For a branch named \texttt{release/...} an internal release is triggered
automatically. The internal release is processing the following steps:\\
\begin{enumerate}
\item Build project variant specific configuration
\item Name the release depending on the release naming convention
\item Deploy the release to the project's internal deploy path
\end{enumerate}
\subsection{External release deployment} \label{sec:ci_ext}
To create an external release the commit to be released must be tagged
using the following naming convention:\\
\texttt{release/<project\_specific\_name>}.\\
The project specific naming convention for Agricola ruby is:\\
\texttt{release/174\_AG*}.\\
\subsection{Configuring the build jobs} \label{sec:ci_conf}
The configuration of gitlab-ci is made in the \texttt{.gitlab-ci.yml} file
in the root directory of the project's repository. The certain build stages
are using variables to customize the build. These variables are defined in
the \texttt{variables} section of the config file.\\\\
\begin{tabular}{l l}
variable & meaning\\
PRODUCT\_ID & Id of the product\\
PRODUCT\_NAME & Short of the product name\\
PRODUCT\_VARIANT & Short of the product variant\\
PROJECT\_VERSION & ??\\
SW\_MAJOR\_INTERNAL & Software major number for internal\\
& releases\\
SW\_MAJOR\_EXTERNAL & Software major number for external\\
& releases\\
SW\_MINOR\_INTERNAL & Software minor number for internal\\
& releases\\
SW\_MINOR\_EXTERNAL & Software minor number for external\\
& releases\\
EXEC\_PATH\_INTERNAL & Location of the built executable for\\
& internal release\\
EXEC\_PATH\_EXTERNAL & Location of the built executable for\\
& external release\\
DEPLOY\_PATH\_INTERNAL & Location to deploy internal releases to\\
DEPLOY\_PATH\_EXTERNAL & Location to deploy external releases to\\\\
\end{tabular}
\newline
In listing \ref{lst:ag_cfg} an example configuration for an Agricola North
America variant release is shown.
\lstsetbash
\begin{lstlisting}[caption=variables configuration, label=lst:ag_cfg]
variables:
PRODUCT_ID: "174"
PRODUCT_NAME: "AG"
PRODUCT_VARIANT: "NA"
PROJECT_VERSION: "10"
SW_MAJOR_INTERNAL: "1"
SW_MAJOR_EXTERNAL: "1"
SW_MINOR_INTERNAL: "1"
SW_MINOR_EXTERNAL: "2"
EXEC_PATH_INTERNAL: "./exec/NAR_release/NAR_release.hex"
EXEC_PATH_EXTERNAL: "./exec/NAR_release_customer/\
NAR_release_customer.hex"
DEPLOY_PATH_INTERNAL: "http://dabsvn01.internal.novero.\
com/svn/0_31X_P0070_agricola/trunk/development/\
software/releases/internal"
DEPLOY_PATH_EXTERNAL: "http://dabsvn01.internal.novero.\
com/svn/0_31X_P0070_agricola/trunk/development/\
software/releases/external"
\end{lstlisting}
Remember, it is a good idea to change these values before creating the
release branch, creating (and pushing) the branch triggers the build of an
internal release.
%\subsection{External release deployment} \label{sec:ci_ext} \begin{figure}
%An external release must be tagged with following naming convention:\\ \begin{center}
%\texttt{release/<project\_specific\_name>}.\\ \input{img_history.tex}
%The project specific naming convention for Agricola ruby is:\\ \caption{Git commit history}
%\texttt{release/174\_AG*}.\\ \label{fig:git_commit_history}
\end{center}
\end{figure}

View File

@ -1,31 +1,29 @@
\psset{griddots=0,gridlabels=8pt,subgriddiv=5} \psset{griddots=0,gridlabels=8pt,subgriddiv=5}
\psset{xunit=10mm,yunit=10mm} \psset{xunit=10mm,yunit=10mm}
\begin{pspicture}(14,20) \begin{pspicture}(14,16)
% \psgrid % \psgrid
\newcommand{\clr}{black} \newcommand{\clr}{black}
% phases % phases
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,18)(14,18) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,2)(14,2)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,12)(14,12) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,8)(14,8)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,4)(14,4) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,14)(14,14)
\rput{0}(1.5,12){ \rput{0}(1.5,8){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
\psset{framearc=.5} \psset{framearc=.5}
\psframebox{\textcolor{\clr}{code freeze}} \psframebox{\textcolor{\clr}{code freeze}}
} }
\psline[linewidth=1pt,linecolor=\clr]{->}(13.5,17)(13.5,17.9) \psline[linewidth=1pt,linecolor=\clr]{<->}(13.5,2)(13.5,8)
\psline[linewidth=1pt,linecolor=\clr]{->}(13.5,13)(13.5,12.1) \rput{90}(13.5,5){
\rput{90}(13.5,15){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
\psset{framearc=.5} \psset{framearc=.5}
\psframebox{\textcolor{\clr}{implementation phase}} \psframebox{\textcolor{\clr}{implementation phase}}
} }
\psline[linewidth=1pt,linecolor=\clr]{->}(13.5,9.2)(13.5,11.9) \psline[linewidth=1pt,linecolor=\clr]{<->}(13.5,8)(13.5,14)
\psline[linewidth=1pt,linecolor=\clr]{->}(13.5,6.6)(13.5,4.1) \rput{90}(13.5,11){
\rput{90}(13.5,8){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
@ -36,15 +34,14 @@
% master % master
\newcommand{\masterx}{7} \newcommand{\masterx}{7}
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\masterx,19)(\masterx,1) \psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\masterx,1)(\masterx,15)
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,18) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,2)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,17) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,3)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,15) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,7)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,13) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,12) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,14)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,4) \rput(\masterx,0.5){
\rput(\masterx,19.5){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
@ -54,33 +51,39 @@
% feature/anti_osc % feature/anti_osc
\renewcommand{\clr}{ForestGreen} \renewcommand{\clr}{ForestGreen}
\newcommand{\featurex}{5} \newcommand{\featurex}{5}
\psline[linewidth=2pt,linecolor=\clr](\masterx,18)(\featurex,17) \psline[linewidth=2pt,linecolor=\clr](\masterx,2)(\featurex,3)
\psline[linewidth=2pt,linecolor=\clr](\featurex,17)(\featurex,14) \psline[linewidth=2pt,linecolor=\clr](\featurex,3)(\featurex,7)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\featurex,14)(\masterx,13) \psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\featurex,7)(\masterx,8)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\featurex,18)(\featurex,13) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\featurex,2)(\featurex,8)
\multido{\nA=14+1.5}{3}{ \multido{\nA=3+2}{3}{
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\featurex,\nA) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\featurex,\nA)
} }
\rput(\featurex,18.5){ \rput(\featurex,1.5){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
\psset{framearc=.5} \psset{framearc=.5}
\psframebox{\textcolor{\clr}{feature/anti\_osc}} \psframebox{\textcolor{\clr}{feature/anti\_osc}}
} }
% old_branch
\renewcommand{\clr}{Gray}
\newcommand{\xpos}{9}
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\xpos,2)(\masterx,3)
\psline[linewidth=2pt,linecolor=\clr](\xpos,1)(\xpos,2)
% fix/calibration_crc % fix/calibration_crc
\renewcommand{\clr}{Maroon} \renewcommand{\clr}{Maroon}
\newcommand{\fixx}{9} \newcommand{\fixx}{9}
\psline[linewidth=2pt,linecolor=\clr](\masterx,17)(\fixx,16) \psline[linewidth=2pt,linecolor=\clr](\masterx,3)(\fixx,4)
\psline[linewidth=2pt,linecolor=\clr](\fixx,16)(\fixx,13) \psline[linewidth=2pt,linecolor=\clr](\fixx,4)(\fixx,6)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,13)(\masterx,12) \psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,6)(\masterx,7)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,17)(\fixx,12) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,3)(\fixx,7)
\multido{\nA=13+1.5}{3}{ \multido{\nA=4+2}{2}{
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,\nA) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,\nA)
} }
\rput(\fixx,17.5){ \rput(\fixx,2.5){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
@ -90,10 +93,10 @@
% feature/dynamic_monitoring % feature/dynamic_monitoring
\renewcommand{\clr}{RoyalBlue} \renewcommand{\clr}{RoyalBlue}
\renewcommand{\fixx}{11} \renewcommand{\fixx}{11}
\psline[linewidth=2pt,linecolor=\clr](\masterx,15)(\fixx,13) \psline[linewidth=2pt,linecolor=\clr](\masterx,3)(\fixx,4)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,13)(\fixx,8.5) \psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,4)(\fixx,12)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,14)(\fixx,9) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,3)(\fixx,4)
\rput(\fixx,14.5){ \rput(\fixx,12.5){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
@ -101,24 +104,25 @@
\psframebox{\textcolor{\clr}{feature/dyn\_mon}} \psframebox{\textcolor{\clr}{feature/dyn\_mon}}
} }
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,13) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,4)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,11.5) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,6)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,10) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,10)
% release/NAR_C0 % release/NAR_C0
\renewcommand{\clr}{RedOrange} \renewcommand{\clr}{RedOrange}
\renewcommand{\fixx}{5} \renewcommand{\fixx}{5}
\psline[linewidth=2pt,linecolor=\clr](\masterx,12)(\fixx,11) \psline[linewidth=2pt,linecolor=\clr](\masterx,8)(\fixx,9)
\psline[linewidth=2pt,linecolor=\clr](\fixx,11)(\fixx,5) \psline[linewidth=2pt,linecolor=\clr](\fixx,9)(\fixx,13)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,12)(\fixx,4) \psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,8)(\fixx,14)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,5)(\masterx,4) \psline[linewidth=2pt,linecolor=\clr,linestyle=dashed,arrowsize=15pt]{->}(\fixx,13)(\masterx,14)
\rput(\fixx,12.5){ \rput(\fixx,14.5){
\psset{fillcolor=white} \psset{fillcolor=white}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
\psset{framearc=.5} \psset{framearc=.5}
\psframebox{\textcolor{\clr}{release/NAR\_C0}} \psframebox{\textcolor{\clr}{release/NAR\_C0}}
} }
\rput(2.5,5){ \rput(2.5,13){
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psset{fillstyle=solid} \psset{fillstyle=solid}
\psset{linecolor=\clr} \psset{linecolor=\clr}
@ -126,9 +130,7 @@
\psframebox{\textcolor{white}{\shortstack{tags/release/\\174\_AG\_NA\_10-01.02}}} \psframebox{\textcolor{white}{\shortstack{tags/release/\\174\_AG\_NA\_10-01.02}}}
} }
\psset{fillcolor=\clr} \psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,9)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,11) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,11)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,9.5) \psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,13)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,6.5)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,5)
\end{pspicture} \end{pspicture}

View File

@ -1,71 +0,0 @@
\psset{griddots=0,gridlabels=8pt,subgriddiv=5}
\psset{xunit=10mm,yunit=10mm}
\begin{pspicture}(12,11)
% \psgrid
% master
\newcommand{\clr}{black}
\newcommand{\masterx}{6}
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\masterx,9)(\masterx,1)
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,7)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,3)
\rput(\masterx,9.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{master}}
}
% feature/anti_osc
\renewcommand{\clr}{ForestGreen}
\newcommand{\featurex}{4}
\psline[linewidth=2pt,linecolor=\clr](\masterx,8)(\featurex,7)
\psline[linewidth=2pt,linecolor=\clr](\featurex,7)(\featurex,4)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\featurex,4)(\masterx,3)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\featurex,8)(\featurex,3)
\multido{\nA=4+1.5}{3}{
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\featurex,\nA)
}
\rput(\featurex,8.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{feature/anti\_osc}}
}
\rput(2,4){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{merge request}}
}
% fix/calibration_crc
\renewcommand{\clr}{Maroon}
\newcommand{\fixx}{8}
\psline[linewidth=2pt,linecolor=\clr](\masterx,7)(\fixx,6)
\psline[linewidth=2pt,linecolor=\clr](\fixx,6)(\fixx,3)
\psline[linewidth=2pt,linecolor=\clr,linestyle=dashed,arrowsize=15pt]{->}(\fixx,3)(\masterx,2)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,7)(\fixx,2)
\multido{\nA=3+1.5}{3}{
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,\nA)
}
\rput(\fixx,7.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{fix/calibration\_crc}}
}
\rput(10,3){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{merge request}}
}
\end{pspicture}
\captionof{figure}{development workflow}

136
img_history.tex Normal file
View File

@ -0,0 +1,136 @@
\psset{griddots=0,gridlabels=8pt,subgriddiv=5}
\psset{xunit=10mm,yunit=10mm}
\begin{pspicture}(14,16)
% \psgrid
\newcommand{\clr}{black}
% phases
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,2)(14,2)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,8)(14,8)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](0,14)(14,14)
\rput{0}(1.5,8){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{code freeze}}
}
\psline[linewidth=1pt,linecolor=\clr]{<->}(13.5,2)(13.5,8)
\rput{90}(13.5,5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{implementation phase}}
}
\psline[linewidth=1pt,linecolor=\clr]{<->}(13.5,8)(13.5,14)
\rput{90}(13.5,11){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{release phase}}
}
% master
\newcommand{\masterx}{7}
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\masterx,1)(\masterx,15)
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,2)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,3)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,7)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\masterx,14)
\rput(\masterx,0.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{master}}
}
% feature/anti_osc
\renewcommand{\clr}{ForestGreen}
\newcommand{\featurex}{5}
\psline[linewidth=2pt,linecolor=\clr](\masterx,2)(\featurex,3)
\psline[linewidth=2pt,linecolor=\clr](\featurex,3)(\featurex,7)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\featurex,7)(\masterx,8)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\featurex,2)(\featurex,8)
\multido{\nA=3+2}{3}{
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\featurex,\nA)
}
\rput(\featurex,1.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{feature/anti\_osc}}
}
% old_branch
\renewcommand{\clr}{Gray}
\newcommand{\xpos}{9}
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\xpos,2)(\masterx,3)
\psline[linewidth=2pt,linecolor=\clr](\xpos,1)(\xpos,2)
% fix/calibration_crc
\renewcommand{\clr}{Maroon}
\newcommand{\fixx}{9}
\psline[linewidth=2pt,linecolor=\clr](\masterx,3)(\fixx,4)
\psline[linewidth=2pt,linecolor=\clr](\fixx,4)(\fixx,6)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,6)(\masterx,7)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,3)(\fixx,7)
\multido{\nA=4+2}{2}{
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,\nA)
}
\rput(\fixx,2.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{fix/calibration\_crc}}
}
% feature/dynamic_monitoring
\renewcommand{\clr}{RoyalBlue}
\renewcommand{\fixx}{11}
\psline[linewidth=2pt,linecolor=\clr](\masterx,3)(\fixx,4)
\psline[linewidth=2pt,linecolor=\clr,arrowsize=15pt]{->}(\fixx,4)(\fixx,12)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,3)(\fixx,4)
\rput(\fixx,12.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{feature/dyn\_mon}}
}
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,4)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,6)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,8)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,10)
% release/NAR_C0
\renewcommand{\clr}{RedOrange}
\renewcommand{\fixx}{5}
\psline[linewidth=2pt,linecolor=\clr](\masterx,8)(\fixx,9)
\psline[linewidth=2pt,linecolor=\clr](\fixx,9)(\fixx,13)
\psline[linewidth=1pt,linecolor=\clr,linestyle=dashed](\fixx,8)(\fixx,14)
\psline[linewidth=2pt,linecolor=\clr,linestyle=dashed,arrowsize=15pt]{->}(\fixx,13)(\masterx,14)
\rput(\fixx,14.5){
\psset{fillcolor=white}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{\clr}{release/NAR\_C0}}
}
\rput(2.5,13){
\psset{fillcolor=\clr}
\psset{fillstyle=solid}
\psset{linecolor=\clr}
\psset{framearc=.5}
\psframebox{\textcolor{white}{\shortstack{tags/release/\\174\_AG\_NA\_10-01.02}}}
}
\psset{fillcolor=\clr}
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,9)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,11)
\psdot[dotsize=10pt,dotstyle=o,linecolor=\clr](\fixx,13)
\end{pspicture}