name: CI on: push: pull_request: release: types: [published] env: CI: "ON" # We can detect this in the build system and other vendors implement it HOMEBREW_NO_ANALYTICS: "ON" # Make Homebrew installation a little quicker HOMEBREW_NO_AUTO_UPDATE: "ON" HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK: "ON" HOMEBREW_NO_GITHUB_API: "ON" HOMEBREW_NO_INSTALL_CLEANUP: "ON" jobs: build: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] gcc_v: [9] # Version of GFortran we want to use. include: - os: ubuntu-latest os-arch: linux-x86_64 release-flags: --flag '--static -g -fbacktrace -O3' - os: macos-latest os-arch: macos-x86_64 release-flags: --flag '-g -fbacktrace -O3' - os: windows-latest os-arch: windows-x86_64 release-flags: --flag '--static -g -fbacktrace -O3' exe: .exe env: FC: gfortran GCC_V: ${{ matrix.gcc_v }} steps: - name: Checkout code uses: actions/checkout@v1 - name: Install GFortran macOS if: contains(matrix.os, 'macos') run: | ln -s /usr/local/bin/gfortran-${GCC_V} /usr/local/bin/gfortran which gfortran-${GCC_V} which gfortran - name: Install GFortran Linux if: contains(matrix.os, 'ubuntu') run: | sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_V} 100 \ --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-${GCC_V} \ --slave /usr/bin/gcov gcov /usr/bin/gcov-${GCC_V} - name: Install GFortran Windows if: contains(matrix.os, 'windows') run: | Invoke-WebRequest -Uri $Env:GCC_DOWNLOAD -OutFile mingw-w64.zip Expand-Archive mingw-w64.zip echo "$pwd\mingw-w64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append env: GCC_DOWNLOAD: "https://github.com/brechtsanders/winlibs_mingw/releases/download/9.4.0-9.0.0-msvcrt-r2/winlibs-x86_64-posix-seh-gcc-9.4.0-mingw-w64-9.0.0-r2.zip" # Phase 1: Bootstrap fpm with existing version - name: Install fpm uses: fortran-lang/setup-fpm@v3 with: fpm-version: 'v0.3.0' - name: Remove fpm from path shell: bash run: | mv $(which fpm) fpm-bootstrap${{ matrix.exe }} echo "BOOTSTRAP=$PWD/fpm-bootstrap" >> $GITHUB_ENV - name: Build Fortran fpm (bootstrap) shell: bash run: | ${{ env.BOOTSTRAP }} build - name: Run Fortran fpm (bootstrap) shell: bash run: | ${{ env.BOOTSTRAP }} run ${{ env.BOOTSTRAP }} run -- --version ${{ env.BOOTSTRAP }} run -- --help - name: Test Fortran fpm (bootstrap) shell: bash run: | ${{ env.BOOTSTRAP }} test - name: Install Fortran fpm (bootstrap) shell: bash run: | ${{ env.BOOTSTRAP }} install # Phase 2: Bootstrap fpm with itself - name: Replace bootstrapping version shell: bash run: | ${{ env.BOOTSTRAP }} run --runner cp -- fpm-debug${{ matrix.exe }} rm -v ${{ env.BOOTSTRAP }} echo "FPM=$PWD/fpm-debug" >> $GITHUB_ENV - name: Get version (normal) if: github.event_name != 'release' shell: bash run: | VERSION=$(git rev-parse --short HEAD) echo "VERSION=$VERSION" >> $GITHUB_ENV - name: Get version (release) if: github.event_name == 'release' shell: bash run: | VERSION=$(echo ${{ github.ref }} | cut -dv -f2) echo "VERSION=$VERSION" >> $GITHUB_ENV FPM_VERSION=$(${{ env.FPM }} --version | grep -o '${{ env.REGEX }}') [ "$VERSION" = "$FPM_VERSION" ] env: REGEX: '[0-9]\{1,4\}\.[0-9]\{1,4\}\.[0-9]\{1,4\}' - name: Build example packages shell: bash run: | ci/run_tests.sh "${{ env.FPM }}" - name: Build Fortran fpm shell: bash run: | ${{ env.FPM }} build ${{ matrix.release-flags }} - name: Run Fortran fpm shell: bash run: | ${{ env.FPM }} run ${{ matrix.release-flags }} ${{ env.FPM }} run ${{ matrix.release-flags }} -- --version ${{ env.FPM }} run ${{ matrix.release-flags }} -- --help - name: Test Fortran fpm shell: bash run: | ${{ env.FPM }} test ${{ matrix.release-flags }} - name: Install Fortran fpm shell: bash run: | ${{ env.FPM }} install ${{ matrix.release-flags }} - name: Package release version shell: bash run: | ${{ env.FPM }} run ${{ matrix.release-flags }} --runner cp -- ${{ env.EXE }} rm -v ${{ env.FPM }} echo "FPM_RELEASE=${{ env.EXE }}" >> $GITHUB_ENV env: EXE: fpm-${{ env.VERSION }}-${{ matrix.os-arch }}${{ matrix.exe }} - name: Run release version shell: bash run: | ci/run_tests.sh "$PWD/${{ env.FPM_RELEASE }}" - name: Upload artifact uses: actions/upload-artifact@v2 with: name: ${{ env.FPM_RELEASE }} path: ${{ env.FPM_RELEASE }} make-installer: if: ${{ github.event_name == 'release' && contains(github.ref, 'v') || github.event_name == 'push' }} runs-on: windows-latest needs: - build steps: - uses: actions/checkout@v2 - name: Download Artifacts uses: actions/download-artifact@v2 with: path: ${{ github.workspace }} # This will download all files - name: Get version (normal) if: github.event_name != 'release' shell: bash run: | VERSION=$(git rev-parse --short HEAD) echo "VERSION=$VERSION" >> $GITHUB_ENV - name: Get version (release) if: github.event_name == 'release' shell: bash run: | VERSION=$(echo ${{ github.ref }} | cut -dv -f2) echo "VERSION=$VERSION" >> $GITHUB_ENV env: REGEX: '[0-9]\{1,4\}\.[0-9]\{1,4\}\.[0-9]\{1,4\}' - name: Setup MinGW (MSYS2) uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: false install: >- wget unzip - name: Fetch Windows executable shell: msys2 {0} run: | cp fpm-*/fpm*.exe ./ci/fpm.exe - name: Fetch Git for Windows shell: msys2 {0} run: | cd ./ci wget ${{ env.git_download }} -O MinGit.zip unzip MinGit.zip -d MinGit env: git_download: "https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/MinGit-2.33.1-64-bit.zip" - name: Fetch EnVar Plugin for NSIS shell: msys2 {0} run: | cd ./ci wget ${{ env.envar_download }} -O EnVar-Plugin.zip mkdir EnVar_plugin unzip EnVar-Plugin.zip -d EnVar_plugin env: envar_download: "https://github.com/GsNSIS/EnVar/releases/download/v0.3.1/EnVar-Plugin.zip" - name: Generate installer run: | cd ./ci makensis fpm-installer.nsi move fpm-installer.exe fpm-installer-${{ env.VERSION }}.exe - name: Upload artifact uses: actions/upload-artifact@v2 with: name: fpm-installer path: ci/fpm-installer-${{ env.VERSION }}.exe upload-artifacts: if: ${{ github.event_name == 'release' && contains(github.ref, 'v') || github.event_name == 'push' }} runs-on: ubuntu-latest needs: - build - make-installer steps: - id: deploy-on-push if: ${{ github.event_name == 'push' }} run: echo "::set-output name=result::${{ env.DEPLOY_BRANCH }}" env: DEPLOY_BRANCH: ${{ secrets.DEPLOY_BRANCH && contains(github.ref, secrets.DEPLOY_BRANCH) && 1 || 0 }} - uses: actions/checkout@v2 if: ${{ github.event_name == 'push' }} - name: Download Artifacts uses: actions/download-artifact@v2 with: path: ${{ github.workspace }} # This will download all files - name: Normalize file names for continuous delivery if: ${{ github.event_name == 'push' }} run: | for output in fpm-*/fpm*; do pushd $(dirname "$output") mv -v $(basename $output) $(basename $output | sed -E '${{ env.replace }}') popd done env: replace: 's/-([0-9]+\.[0-9]+\.[0-9]+-[0-9]+-g)?[0-9a-f]+//' - name: Create SHA256 checksums run: | for output in fpm-*/fpm*; do pushd $(dirname "$output") sha256sum $(basename "$output") | tee $(basename "$output").sha256 popd done - name: Move/Create continuous tag if: ${{ github.event_name == 'push' && steps.deploy-on-push.outputs.result != 0 }} run: | git tag --force 'current' ${{ github.sha }} git push --tags --force - name: Upload assets uses: svenstaro/upload-release-action@v2 if: ${{ github.event_name == 'release' || steps.deploy-on-push.outputs.result != 0 }} with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: fpm-*/fpm* file_glob: true tag: ${{ github.event_name == 'release' && github.ref || 'current'}} overwrite: true