From e15efa7e08fdadfc613f5dd5353447b1e9de4a81 Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Thu, 21 May 2015 16:43:09 +0300 Subject: [PATCH] Add CI services info and integration examples. --- .../droneci-platformio-integration-1.png | Bin 0 -> 22188 bytes .../droneci-platformio-integration-2.png | Bin 0 -> 41980 bytes docs/ci/appveyor.rst | 201 ++++++++++++++++++ docs/ci/circleci.rst | 73 +++++++ docs/ci/drone.rst | 70 ++++++ docs/ci/index.rst | 4 + docs/ci/shippable.rst | 76 +++++++ 7 files changed, 424 insertions(+) create mode 100644 docs/_static/droneci-platformio-integration-1.png create mode 100644 docs/_static/droneci-platformio-integration-2.png create mode 100644 docs/ci/appveyor.rst create mode 100644 docs/ci/circleci.rst create mode 100644 docs/ci/drone.rst create mode 100644 docs/ci/shippable.rst diff --git a/docs/_static/droneci-platformio-integration-1.png b/docs/_static/droneci-platformio-integration-1.png new file mode 100644 index 0000000000000000000000000000000000000000..303e30f66a2b367e9658c9cff85cfaec45c188b7 GIT binary patch literal 22188 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 literal 0 HcmV?d00001 diff --git a/docs/_static/droneci-platformio-integration-2.png b/docs/_static/droneci-platformio-integration-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b76e479b717666a7c94aac5933669b719b64d90 GIT binary patch literal 41980 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%0DuLttJJjkOqOmTC&&t@JZ0t-5y?M*Rt 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 literal 0 HcmV?d00001 diff --git a/docs/ci/appveyor.rst b/docs/ci/appveyor.rst new file mode 100644 index 00000000..ea603a46 --- /dev/null +++ b/docs/ci/appveyor.rst @@ -0,0 +1,201 @@ +.. _ci_appveyor: + +AppVeyor +======== + +`AppVeyor `_ is an open-source hosted, +distributed continuous integration service used to build and test projects hosted at `GitHub `_ on Windows family systems. + +AppVeyor is configured by adding a file named ``appveyor.yml``, which is a +`YAML `_ format text file, to the root +directory of the GitHub repository. + +AppVeyor automatically detects when a commit has been made and pushed to a +GitHub repository that is using AppVeyor, and each time this happens, it will +try to build the project using :ref:`cmd_ci` command. This includes commits to +all branches, not just to the master branch. AppVeyor will also build and run +pull requests. When that process has completed, it will notify a developer in +the way it has been configured to do so — for example, by sending an email +containing the build results (showing success or failure), or by posting a +message on an IRC channel. It can be configured to build project on a range of +different :ref:`platforms`. + +Integration +----------- + +Please put ``appveyor.yml`` to the root directory of the GitHub repository. + +.. code-block:: yaml + + build: off + environment: + matrix: + - PLATFORMIO_CI_SRC=pathto\\source\\file.c + - PLATFORMIO_CI_SRC=pathto\\source\\file.ino + - PLATFORMIO_CI_SRC=pathto\\source\\directory + + install: + cmd: python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + + script: + - platformio ci --lib="." --lib="c:\spi4teensy" --board=uno --board=teensy31 --board=due' + + +For more details as for PlatformIO build process please look into :ref:`cmd_ci` +command. + +Examples +-------- + +1. Integration for `USB_Host_Shield_2.0 `_ + project. The ``appveyor.yml`` configuration file: + +.. code-block:: yaml + + build: off + environment: + global: + WITH_COMPILER: "cmd /E:ON /V:ON /C .\\scripts\\appveyor\\run_with_compiler.cmd" + matrix: + - PLATFORMIO_CI_SRC: "examples\\Bluetooth\\PS3SPP\\PS3SPP.ino" + PLATFORMIO_CI_SRC: "examples\\pl2303\\pl2303_gps\\pl2303_gps.ino" + WINDOWS_SDK_VERSION: "v7.0" + PYTHON_HOME: "C:\\Python27-x64" + PYTHON_VERSION: "2.7" + PYTHON_ARCH: "64" + install: + - "git submodule update --init --recursive" + - "powershell scripts\\appveyor\\install.ps1" + before_test: + - cmd: SET PATH=%PATH%;%PYTHON_HOME%;%PYTHON_HOME%\Scripts + - cmd: git clone https://github.com/xxxajk/spi4teensy3.git c:\spi4teensy + test_script: + - "%PYTHON_HOME%\\Scripts\\pip --version" + - '%WITH_COMPILER% %PYTHON_HOME%\\Scripts\\platformio ci --lib="." --lib="c:\spi4teensy" --board=uno --board=teensy31 --board=due' + +The ``install.ps1`` script file: + +.. code-block:: none + + $BASE_URL = "https://www.python.org/ftp/python/" + $GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" + $GET_PIP_PATH = "C:\get-pip.py" + + + function DownloadPython ($python_version, $platform_suffix) { + $webclient = New-Object System.Net.WebClient + $filename = "python-" + $python_version + $platform_suffix + ".msi" + $url = $BASE_URL + $python_version + "/" + $filename + + $basedir = $pwd.Path + "\" + $filepath = $basedir + $filename + if (Test-Path $filename) { + Write-Host "Reusing" $filepath + return $filepath + } + + # Download and retry up to 5 times in case of network transient errors. + Write-Host "Downloading" $filename "from" $url + $retry_attempts = 3 + for($i=0; $i -lt $retry_attempts; $i++){ + try { + $webclient.DownloadFile($url, $filepath) + break + } + Catch [Exception]{ + Start-Sleep 1 + } + } + Write-Host "File saved at" $filepath + return $filepath + } + + + function InstallPython ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "" + } else { + $platform_suffix = ".amd64" + } + $filepath = DownloadPython $python_version $platform_suffix + Write-Host "Installing" $filepath "to" $python_home + $args = "/qn /i $filepath TARGETDIR=$python_home" + Write-Host "msiexec.exe" $args + Start-Process -FilePath "msiexec.exe" -ArgumentList $args -Wait -Passthru + Write-Host "Python $python_version ($architecture) installation complete" + return $true + } + + + function InstallPip ($python_home) { + $pip_path = $python_home + "/Scripts/pip.exe" + $python_path = $python_home + "/python.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) + Write-Host "Executing:" $python_path $GET_PIP_PATH + Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru + } else { + Write-Host "pip already installed." + } + } + + function InstallPackage ($python_home, $pkg) { + $pip_path = $python_home + "/Scripts/pip.exe" + & $pip_path install $pkg + } + + function InstallScons ($python_home) { + Write-Host "Start installing Scons" + $pip_path = $python_home + "/Scripts/pip.exe" + & $pip_path install --egg "http://sourceforge.net/projects/scons/files/latest/download" + Write-Host "Scons installed" + } + + function main () { + InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON_HOME + InstallPip $env:PYTHON_HOME + InstallPackage $env:PYTHON_HOME setuptools + InstallScons $env:PYTHON_HOME + } + + main + +The ``run_with_compiler.cmd`` script file: + +.. code-block:: none + + @ECHO OFF + + SET COMMAND_TO_RUN=%* + SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows + + SET MAJOR_PYTHON_VERSION="%PYTHON_VERSION:~0,1%" + IF %MAJOR_PYTHON_VERSION% == "2" ( + SET WINDOWS_SDK_VERSION="v7.0" + ) ELSE IF %MAJOR_PYTHON_VERSION% == "3" ( + SET WINDOWS_SDK_VERSION="v7.1" + ) ELSE ( + ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" + EXIT 1 + ) + + IF "%PYTHON_ARCH%"=="64" ( + ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture + SET DISTUTILS_USE_SDK=1 + SET MSSdk=1 + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) ELSE ( + ECHO Using default MSVC build environment for 32 bit architecture + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) diff --git a/docs/ci/circleci.rst b/docs/ci/circleci.rst new file mode 100644 index 00000000..357ae00d --- /dev/null +++ b/docs/ci/circleci.rst @@ -0,0 +1,73 @@ +.. _ci_circleci: + +Circle CI +========= + +`Circle CI `_ is a hosted cloud +platform that provides hosted continuous integration, deployment, and testing +to `GitHub `_ repositories. + +Circle CI is configured by adding a file named ``circle.yml``, which is a +`YAML `_ format text file, to the root +directory of the GitHub repository. + +Circle CI automatically detects when a commit has been made and pushed to a +GitHub repository that is using Circle CI, and each time this happens, it will +try to build the project using :ref:`cmd_ci` command. This includes commits to +all branches, not just to the master branch. Circle CI will also build and run +pull requests. When that process has completed, it will notify a developer in +the way it has been configured to do so — for example, by sending an email +containing the build results (showing success or failure), or by posting a +message on an IRC channel. It can be configured to build project on a range of +different :ref:`platforms`. + +Integration +----------- + +Please put ``circle.yml`` to the root directory of the GitHub repository. + +.. code-block:: yaml + + machine: + + environment: + - PLATFORMIO_CI_SRC=path/to/source/file.c + - PLATFORMIO_CI_SRC=path/to/source/file.ino + - PLATFORMIO_CI_SRC=path/to/source/directory + + dependencies: + pre: + - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + + test: + override: + - platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N + + +For more details as for PlatformIO build process please look into :ref:`cmd_ci` +command. + +Examples +-------- + +1. Integration for `USB_Host_Shield_2.0 `_ + project. The ``circle.yml`` configuration file: + +.. code-block:: yaml + + machine: + environment: + PLATFORMIO_CI_SRC: examples/Bluetooth/PS3SPP/PS3SPP.ino + PLATFORMIO_CI_SRC: examples/pl2303/pl2303_gps/pl2303_gps.ino + + dependencies: + pre: + - sudo apt-get install python2.7-dev + - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + - sudo pip install --egg http://sourceforge.net/projects/scons/files/latest/download + - wget https://github.com/xxxajk/spi4teensy3/archive/master.zip -O /tmp/spi4teensy3.zip + - unzip /tmp/spi4teensy3.zip -d /tmp + + test: + override: + - platformio ci --lib="." --lib="/tmp/spi4teensy3-master" --board=uno --board=teensy31 --board=due diff --git a/docs/ci/drone.rst b/docs/ci/drone.rst new file mode 100644 index 00000000..f4792ef6 --- /dev/null +++ b/docs/ci/drone.rst @@ -0,0 +1,70 @@ +.. _ci_drone: + +Drone +===== + +`Drone `_ is a hosted continuous integration service. +It enables you to conveniently set up projects to automatically build, test, +and deploy as you make changes to your code to +`GitHub `_ and +`BitBucket `_ repositories. + +Drone is configured by modifying settings in your project control panel. + +Drone automatically detects when a commit has been made and pushed to a +GitHub repository that is using Drone, and each time this happens, it will +try to build the project using :ref:`cmd_ci` command. This includes commits to +all branches, not just to the master branch. Drone will also build and run +pull requests. When that process has completed, it will notify a developer in +the way it has been configured to do so — for example, by sending an email +containing the build results (showing success or failure). It can be +configured to build project on a range of different :ref:`platforms`. + +Integration +----------- + +Please fill all fields for your project in the Drone control panel: + +`Environment Variables`: + +.. code-block:: bash + + PLATFORMIO_CI_SRC=path/to/source/file.c + PLATFORMIO_CI_SRC=path/to/source/file.ino + PLATFORMIO_CI_SRC=path/to/source/directory + +`Commands`: + +.. code-block:: bash + + python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N + +.. image:: ../_static/droneci-platformio-integration-1.png + +For more details as for PlatformIO build process please look into :ref:`cmd_ci` +command. + +Examples +-------- + +1. Integration for `USB_Host_Shield_2.0 `_ + project. The ``circle.yml`` configuration file: + +`Environment Variables`: + +.. code-block:: bash + + PLATFORMIO_CI_SRC=examples/Bluetooth/PS3SPP/PS3SPP.ino + PLATFORMIO_CI_SRC=examples/pl2303/pl2303_gps/pl2303_gps.ino + +`Commands`: + +.. code-block:: bash + + pip install --egg http://sourceforge.net/projects/scons/files/latest/download + wget https://github.com/xxxajk/spi4teensy3/archive/master.zip -O /tmp/spi4teensy3.zip + unzip /tmp/spi4teensy3.zip -d /tmp + platformio ci --lib="." --lib="/tmp/spi4teensy3-master" --board=uno --board=teensy31 --board=due + +.. image:: ../_static/droneci-platformio-integration-2.png diff --git a/docs/ci/index.rst b/docs/ci/index.rst index d619bc24..480974bf 100644 --- a/docs/ci/index.rst +++ b/docs/ci/index.rst @@ -17,4 +17,8 @@ easily. .. toctree:: :maxdepth: 2 + appveyor + circleci + drone + shippable travis diff --git a/docs/ci/shippable.rst b/docs/ci/shippable.rst new file mode 100644 index 00000000..9d27df52 --- /dev/null +++ b/docs/ci/shippable.rst @@ -0,0 +1,76 @@ +.. _ci_shippable: + +Shippable +========= + +`Shippable `_ is a hosted cloud +platform that provides hosted continuous integration, deployment, and testing +to `GitHub `_ and +`BitBucket `_ repositories. +Shippable's continuous integration service is built using Docker. + +Shippable is configured by adding a file named ``shippable.yml``, which is a +`YAML `_ format text file, to the root +directory of the GitHub repository or you can use your Travis CI configuration +file ``.travis.yml``. + +Shippable automatically detects when a commit has been made and pushed to a +GitHub repository that is using Shippable, and each time this happens, it will +try to build the project using :ref:`cmd_ci` command. This includes commits to +all branches, not just to the master branch. Shippable will also build and run +pull requests. When that process has completed, it will notify a developer in +the way it has been configured to do so — for example, by sending an email +containing the build results (showing success or failure), or by posting a +message on an IRC channel. It can be configured to build project on a range of +different :ref:`platforms`. + +Integration +----------- + +Please put ``shippable.yml`` or ``.travis.yml`` to the root directory of the +GitHub repository. + +.. code-block:: yaml + + language: python + python: + - "2.7" + + env: + - PLATFORMIO_CI_SRC=path/to/source/file.c + - PLATFORMIO_CI_SRC=path/to/source/file.ino + - PLATFORMIO_CI_SRC=path/to/source/directory + + install: + - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + + script: + - platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N + + +For more details as for PlatformIO build process please look into :ref:`cmd_ci` +command. + +Examples +-------- + +1. Integration for `USB_Host_Shield_2.0 `_ + project. The ``shippable.yml`` or ``.travis.yml`` configuration file: + +.. code-block:: yaml + + language: python + python: + - "2.7" + + env: + - PLATFORMIO_CI_SRC=examples/Bluetooth/PS3SPP/PS3SPP.ino + - PLATFORMIO_CI_SRC=examples/pl2303/pl2303_gps/pl2303_gps.ino + + install: + - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)" + - wget https://github.com/xxxajk/spi4teensy3/archive/master.zip -O /tmp/spi4teensy3.zip + - unzip /tmp/spi4teensy3.zip -d /tmp + + script: + - platformio ci --lib="." --lib="/tmp/spi4teensy3-master" --board=uno --board=teensy31 --board=due