summaryrefslogtreecommitdiffstats
path: root/.github/workflows/automated-build.yml
blob: bcf4b9d24e31057cb8c7e438bff2b4daa250e438 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
name: Automated build
env:
  CI_INTERMEDIATES_DIR: "_ci-intermediates"
on:
  release:
    types: [created]
  push:
    tags:
      - 'v*'
jobs:
  build:
    name: ${{ matrix.job.os }} (${{ matrix.job.target }})
    runs-on: ${{ matrix.job.os }}
    strategy:
      fail-fast: false
      matrix:
        job:
          - {os: ubuntu-20.04, target: arm-unknown-linux-gnueabihf, use-cross: true}
          - {os: ubuntu-20.04, target: arm-unknown-linux-musleabihf, use-cross: true}
          - {os: ubuntu-20.04, target: aarch64-unknown-linux-musl, use-cross: true}
          - {os: ubuntu-20.04, target: aarch64-unknown-linux-gnu, use-cross: true}
          - {os: ubuntu-20.04, target: x86_64-unknown-linux-musl, use-cross: true}
          - {os: ubuntu-20.04, target: x86_64-unknown-linux-gnu}
          - {os: macos-latest, target: aarch64-apple-darwin}
          - {os: macos-13, target: x86_64-apple-darwin}
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2
      - name: Install prerequisites
        shell: bash
        run: |
          case ${{ matrix.job.target }} in
            arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
            aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
          esac
      - name: Extract crate information
        shell: bash
        run: |
          echo "PROJECT_NAME=joshuto" >> $GITHUB_ENV
          echo "PROJECT_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
          echo "PROJECT_MAINTAINER=$(sed -n 's/^authors = \["\(.*\)"\]/\1/p' Cargo.toml)" >> $GITHUB_ENV
          echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: ${{ matrix.job.target }}
          override: true
          profile: minimal # minimal component installation (ie, no documentation)
      - name: Show version information (Rust, cargo, GCC)
        shell: bash
        run: |
          gcc --version || true
          rustup -V
          rustup toolchain list
          rustup default
          cargo -V
          rustc -V
      - name: Build
        uses: actions-rs/cargo@v1
        with:
          use-cross: ${{ matrix.job.use-cross }}
          command: build
          args: --offline --release --target=${{ matrix.job.target }}
      - name: Create tarball
        id: package
        shell: bash
        run: |
          # Figure out suffix of binary
          EXE_suffix=""
          case ${{ matrix.job.target }} in
            *-pc-windows-*) EXE_suffix=".exe" ;;
          esac;

          BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
          PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
          PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }}
          PKG_NAME=${PKG_BASENAME}${PKG_suffix}
          PKG_STAGING="${{ env.CI_INTERMEDIATES_DIR }}/package"
          ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
          mkdir -p "${ARCHIVE_DIR}"

          # Binary
          cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "$ARCHIVE_DIR"

          # base compressed package
          pushd "${PKG_STAGING}/" >/dev/null
          case ${{ matrix.job.target }} in
            *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;;
            *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;;
          esac;
          popd >/dev/null

          # Let subsequent steps know where to find the compressed package
          echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_ENV
          echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_ENV
          echo "PKG_STAGING=${PKG_STAGING}" >> $GITHUB_ENV
      - name: "Generate checksum"
        id: checksum
        shell: bash
        run: |
          SUM_NAME=${{ env.PKG_NAME }}.sha256sum
          SUM_PATH=${PKG_STAGING}/${SUM_NAME}
          OS="$(uname -s)"

          if [ "$OS" == "Linux" ]; then
            sha256sum ${PKG_PATH} > ${SUM_PATH}
          elif [ "$OS" == "Darwin" ]; then
            shasum -a 256 ${PKG_PATH} > ${SUM_PATH}
          fi

          echo "SUM_NAME=${SUM_NAME}" >> $GITHUB_ENV
          echo "SUM_PATH=${SUM_PATH}" >> $GITHUB_ENV
      - name: "Artifact upload: tarball"
        uses: actions/upload-artifact@master
        with:
          name: ${{ env.PKG_NAME }}
          path: ${{ env.PKG_PATH }}
      - name: "Artifact upload: checksum"
        uses: actions/upload-artifact@master
        with:
          name: ${{ env.SUM_NAME }}
          path: ${{ env.SUM_PATH }}
      - name: Check for release
        id: is-release
        shell: bash
        run: |
          unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
          echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_ENV
      - name: Publish archives and packages
        uses: softprops/action-gh-release@v1
        if: env.IS_RELEASE
        with:
          files: |
            ${{ env.PKG_PATH }}
            ${{ env.SUM_PATH }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}