Jump to: navigation, search

Difference between revisions of "StarlingX/Developer Guide"

(Download Source Code Repositories)
 
(27 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
 +
 +
See the [https://docs.starlingx.io/contributor/index.html StarlingX Build Guide] for the latest information regarding StarlingX development practices.
 +
This wiki page has been deprecated.
 +
 +
<!--
 +
 
This section contains the steps for building a StarlingX ISO from Master branch.
 
This section contains the steps for building a StarlingX ISO from Master branch.
  
Line 67: Line 74:
 
<ol start="1"><li>Under your $HOME directory, clone the &lt;stx-tools&gt; project
 
<ol start="1"><li>Under your $HOME directory, clone the &lt;stx-tools&gt; project
  
<source lang="sh">$ cd $HOME
+
<source lang="sh">
$ git clone https://git.starlingx.io/stx-tools
+
$ git -C $HOME clone https://git.starlingx.io/stx-tools
 
</source></li></ol>
 
</source></li></ol>
  
Line 84: Line 91:
 
=== Setup Repository Docker Container ===
 
=== Setup Repository Docker Container ===
  
Run the following commands under a terminal identified as "One". <br>
+
Run the following commands under a ''terminal identified as'' "'''One'''". <br>
  
 
<ol start="1"><li>Navigate to the ''&lt;$HOME/stx-tools&gt;/centos-mirror-tool'' project directory:
 
<ol start="1"><li>Navigate to the ''&lt;$HOME/stx-tools&gt;/centos-mirror-tool'' project directory:
Line 269: Line 276:
 
$ repo sync -j`nproc`
 
$ repo sync -j`nproc`
 
</source></li>
 
</source></li>
 
<li><strong> Temporal! Only Branch Master </strong> Check if the following Gerrit Reviews are merged, if not, cherry pick them <br>
 
None <br>
 
</li>
 
  
 
<li> Tarballs Repository
 
<li> Tarballs Repository
Line 299: Line 302:
 
===Build Packages===
 
===Build Packages===
  
<ol start="1"><li>Back to the Building Docker container, terminal identified as "Two"</li>
+
<ol start="1"><li>Back to the Building Docker container, terminal identified as "'''Two'''"</li>
  
 
<li><strong>Temporal!</strong> Build-Pkgs Errors
 
<li><strong>Temporal!</strong> Build-Pkgs Errors
Line 324: Line 327:
 
</source>
 
</source>
 
</ol>
 
</ol>
 +
 
==Build StarlingX ISO==
 
==Build StarlingX ISO==
  
Line 380: Line 384:
 
* In order to get the first boot working this complete procedure needs to be done. However, once the init files are created, these can be stored in a shared location where different developers can make use of them. Updating these files is not a frequent task and should be done whenever the kernel is upgraded.
 
* In order to get the first boot working this complete procedure needs to be done. However, once the init files are created, these can be stored in a shared location where different developers can make use of them. Updating these files is not a frequent task and should be done whenever the kernel is upgraded.
 
* StarlingX is in active development, so it is possible that in the future the '''0.2''' version will change to a more generic solution.
 
* StarlingX is in active development, so it is possible that in the future the '''0.2''' version will change to a more generic solution.
 +
 +
 +
==Build Avoidance==
 +
 +
===Purpose===
 +
 +
Greatly reduce build times after a repo sync for designers working within a regional office.  Starting from a new workspace, build-pkgs typically requires 3+ hours. Build avoidance typically reduces this step to ~20min
 +
 +
===Limitations===
 +
 +
* Little or no benefit for designers who refresh a pre-existing workspace at least daily. (download_mirror.sh, repo sync, generate-cgcs-centos-repo.sh, build-pkgs, build-iso).  In these cases an incremental build (reuse of same workspace without a 'build-pkgs --clean') is often just as efficient.
 +
* Not likely to be useful to solo designers, or teleworkers that wish to compile on there home computers.  Build avoidance downloads build artifacts from a reference build, and WAN speeds are generally to slow.
 +
 +
===Method (in brief)===
 +
 +
<ol start="1"><li> Reference Builds
 +
* A server in the regional office performs a regular (daily?), automated builds using existing methods.  Call these the reference builds.
 +
* The builds are timestamped, and preserved for some time.  (a few weeks)
 +
* A build CONTEXT is captured. This is a file produced by build-pkgs at location '$MY_WORKSPACE/CONTEXT'.  It is a bash script that can cd to each and every git and checkout the SHA that contributed to the build.
 +
* For each package built, a file shall capture he md5sums of all the source code inputs to the build of that package.  These files  are also produced by build-pkgs at location '$MY_WORKSPACE/<build-type>/rpmbuild/SOURCES/<pkg-name>/srpm_reference.md5'.
 +
* All these build products are accessible locally (e.g. a regional office) via rsync (other protocols can be added later)
 +
</li>
 +
 +
<li> Designers
 +
* Request a build avoidance build.  Recommended after you have just done a repo sync.  e.g.<source>
 +
repo sync
 +
generate-cgcs-centos-repo.sh
 +
populate_downloads.sh
 +
build-pkgs --build-avoidance
 +
</source>
 +
* Additional arguments, and/or environment variables, and/or a config file unique to the regional office, are used to specify a URL to the reference builds.
 +
** Using a config file to specify location of your reference build<source>
 +
mkdir -p $MY_REPO/local-build-data
 +
 +
cat <<- EOF > $MY_REPO/local-build-data/build_avoidance_source
 +
# Optional, these are already the default values.
 +
BUILD_AVOIDANCE_DATE_FORMAT="%Y%m%d"
 +
BUILD_AVOIDANCE_TIME_FORMAT="%H%M%S"
 +
BUILD_AVOIDANCE_DATE_TIME_DELIM="T"
 +
BUILD_AVOIDANCE_DATE_TIME_POSTFIX="Z"
 +
BUILD_AVOIDANCE_DATE_UTC=1
 +
BUILD_AVOIDANCE_FILE_TRANSFER="rsync"
 +
 +
# Required, unique values for each regional office
 +
BUILD_AVOIDANCE_USR="jenkins"
 +
BUILD_AVOIDANCE_HOST="stx-builder.mycompany.com"
 +
BUILD_AVOIDANCE_DIR="/localdisk/loadbuild/jenkins/StarlingX_Reference_Build"
 +
EOF
 +
</source>
 +
** Using command line args to specify location of your reference build<source>
 +
build-pkgs --build-avoidance --build-avoidance-dir /localdisk/loadbuild/jenkins/StarlingX_Reference_Build --build-avoidance-host stx-builder.mycompany.com --build-avoidance-user jenkins
 +
</source>
 +
* Prior to your build attempt, you need to accept the host key.  This will prevent rsync failures on a yes/no prompt. (you should only have to do this once)<source>
 +
grep -q $BUILD_AVOIDANCE_HOST $HOME/.ssh/known_hosts
 +
if [ $? != 0 ]; then
 +
    ssh-keyscan $BUILD_AVOIDANCE_HOST >> $HOME/.ssh/known_hosts
 +
fi
 +
</source>
 +
* build-pkgs will:
 +
** From newest to oldest, scan the CONTEXTs of the various reference builds.  Select the first (most recent) context which satisfies the following requirement.  For every git, the SHA specified in the CONTEXT is present.
 +
** The selected context might be slightly out of date, but not by more than a day (assuming daily reference builds).
 +
** If the context has not been previously downloaded, then download it now.  Meaning download select portions of the reference build workspace into the designer's workspace.  This includes all the SRPMS, RPMS, MD5SUMS, and misc supporting files.  (~10 min over office LAN)
 +
** The designer may have additional commits not present in the reference build, or uncommitted changes.  Affected packages will identified by the differing md5sum's, and the package is re-built. (5+ min, depending on what packages have changed)
 +
</li>
 +
 +
* What if no valid reference build is found?  Then build-pkgs will fall back to a regular build.
 +
</ol>
 +
 +
===Reference builds===
 +
 +
* The regional office implements an automated build that pulls the latest StarlingX software and builds it on a regular basis.  e.g. a daily.  Perhaps implemented by Jenkins, cron, or similar tools.
 +
* Each build is saved to a unique directory, and preserved for a time that is reflective of how long a designer might be expected to work on a private branch without syncronizing with the master branch.  e.g. 2 weeks.
 +
* The MY_WORKSPACE directory for the build shall have a common root directory, and a leaf directory that is a sortable time stamp. Suggested format YYYYMMDDThhmmss.  e.g. <source lang="sh">$ sudo apt-get update
 +
BUILD_AVOIDANCE_DIR="/localdisk/loadbuild/jenkins/StarlingX_Reference_Build"
 +
BUILD_TIMESTAMP=$(date -u '+%Y%m%dT%H%M%SZ')
 +
MY_WORKSPACE=${BUILD_AVOIDANCE_DIR}/${BUILD_TIMESTAMP}
 +
</source>
 +
* Designers can access all build products over the internal network of the regional office.  The current prototype employs rsync. Other protocols that can efficiently share/copy/transfer large directories of content can be added as needed.
 +
 +
==== Advanced usage ====
 +
 +
Can the reference build itself use build avoidance? Yes<br>
 +
Can it reference itself?  Yes.<br>
 +
In either case we advise caution.  To protect against any possible 'divergence from reality', you should limit how many steps removed a build avoidance build is from a full build.<br>
 +
Suppose we want to implement a self referencing daily build, except that a full build occurs every Saturday.  To protect ourselves from a build failure on Saturday we also want a limit of 7 days since last full build.  You build script might look like this ...<source>
 +
...
 +
BUILD_AVOIDANCE_DIR="/localdisk/loadbuild/jenkins/StarlingX_Reference_Build"
 +
BUILD_AVOIDANCE_HOST="stx-builder.mycompany.com"
 +
FULL_BUILD_DAY="Saturday"
 +
MAX_AGE_DAYS=7
 +
 +
LAST_FULL_BUILD_LINK="$BUILD_AVOIDANCE_DIR/latest_full_build"
 +
LAST_FULL_BUILD_DAY=""
 +
NOW_DAY=$(date -u "+%A")
 +
BUILD_TIMESTAMP=$(date -u '+%Y%m%dT%H%M%SZ')
 +
MY_WORKSPACE=${BUILD_AVOIDANCE_DIR}/${BUILD_TIMESTAMP}
 +
 +
# update software
 +
repo init -u ${BUILD_REPO_URL} -b ${BUILD_BRANCH}
 +
repo sync --force-sync
 +
$MY_REPO_ROOT_DIR/stx-tools/toCOPY/generate-cgcs-centos-repo.sh
 +
$MY_REPO_ROOT_DIR/stx-tools/toCOPY/populate_downloads.sh
 +
 +
# User can optionally define BUILD_METHOD equal to one of 'FULL', 'AVOIDANCE', or 'AUTO'
 +
# Sanitize BUILD_METHOD
 +
if [ "$BUILD_METHOD" != "FULL" ] && [ "$BUILD_METHOD" != "AVOIDANCE" ]; then
 +
    BUILD_METHOD="AUTO"
 +
fi
 +
 +
# First build test
 +
if [ "$BUILD_METHOD" != "FULL" ] && [ ! -L $LAST_FULL_BUILD_LINK ]; then
 +
    echo "latest_full_build symlink missing, forcing full build"
 +
    BUILD_METHOD="FULL"
 +
fi
 +
 +
# Build day test
 +
if [ "$BUILD_METHOD" == "AUTO" ] && [ "$NOW_DAY" == "$FULL_BUILD_DAY" ]; then
 +
    echo "Today is $FULL_BUILD_DAY, forcing full build"
 +
    BUILD_METHOD="FULL"
 +
fi
 +
 +
# Build age test
 +
if [ "$BUILD_METHOD" != "FULL" ]; then
 +
    LAST_FULL_BUILD_DATE=$(basename $(readlink $LAST_FULL_BUILD_LINK) | cut -d '_' -f 1)
 +
    LAST_FULL_BUILD_DAY=$(date -d $LAST_FULL_BUILD_DATE "+%A")
 +
    AGE_SECS=$(( $(date "+%s") - $(date -d $LAST_FULL_BUILD_DATE "+%s") ))
 +
    AGE_DAYS=$(( $AGE_SECS/60/60/24 ))
 +
    if [ $AGE_DAYS -ge $MAX_AGE_DAYS ]; then
 +
        echo "Haven't had a full build in $AGE_DAYS days, forcing full build"
 +
        BUILD_METHOD="FULL"
 +
    fi
 +
    BUILD_METHOD="AVOIDANCE"
 +
fi
 +
 +
#Build it
 +
if [ "$BUILD_METHOD" == "FULL" ]; then
 +
    build-pkgs --no-build-avoidance
 +
else
 +
    build-pkgs --build-avoidance --build-avoidance-dir $BUILD_AVOIDANCE_DIR --build-avoidance-host $BUILD_AVOIDANCE_HOST --build-avoidance-user $USER
 +
fi
 +
if [ $? -ne 0 ]; then
 +
    echo "Build failed in build-pkgs"
 +
    exit 1
 +
fi
 +
 +
build-iso
 +
if [ $? -ne 0 ]; then
 +
    echo "Build failed in build-iso"
 +
    exit 1
 +
fi
 +
 +
if [ "$BUILD_METHOD" == "FULL" ]; then
 +
    # A successful full build.  Set last full build symlink.
 +
    if [ -L $LAST_FULL_BUILD_LINK ]; then
 +
        rm -rf $LAST_FULL_BUILD_LINK
 +
    fi
 +
    ln -sf $MY_WORKSPACE $LAST_FULL_BUILD_LINK
 +
fi
 +
...
 +
</source>
 +
 +
One final wrinkle.
 +
We can ask build avoidance to preferentially use the full build day rather than the most recent build, as the reference point of the next avoidance build via use of  '--build-avoidance-day <day-name>'. e.g. substitute this line into the above.  <source>
 +
build-pkgs --build-avoidance --build-avoidance-dir $BUILD_AVOIDANCE_DIR --build-avoidance-host $BUILD_AVOIDANCE_HOST --build-avoidance-user $USER --build-avoidance-day $FULL_BUILD_DAY
 +
 +
# or perhaps, with a bit more shuffling of the above script.
 +
 +
build-pkgs --build-avoidance --build-avoidance-dir $BUILD_AVOIDANCE_DIR --build-avoidance-host $BUILD_AVOIDANCE_HOST --build-avoidance-user $USER --build-avoidance-day $LAST_FULL_BUILD_DAY
 +
</source>
 +
The advantage is that our build is never more than one step removed from a full build (assuming the full build was successful).<br>
 +
The disadvantage is that by end of week the reference build is getting rather old.  During active weeks, builds times might be approaching that of a full build.
 +
 +
-->

Latest revision as of 18:46, 16 July 2019


See the StarlingX Build Guide for the latest information regarding StarlingX development practices. This wiki page has been deprecated.