aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/build-release.yml
blob: af314d29da540f37200023b838b9cb7e9ed4b601 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
name: Build/publish release

on: [push, pull_request]

jobs:
  publish:
    name: Binary ${{ matrix.target }} (on ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    outputs:
      version: ${{ steps.extract_version.outputs.version }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: armv7-unknown-linux-musleabihf
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: armv7-unknown-linux-gnueabihf
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: arm-unknown-linux-musleabihf
            compress: true
            cargo_flags: ""
          - os: ubuntu-latest
            target: riscv64gc-unknown-linux-gnu
            compress: false
            cargo_flags: "--no-default-features"
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            compress: true
            cargo_flags: ""
          - os: windows-latest
            target: i686-pc-windows-msvc
            compress: true
            cargo_flags: ""
          - os: macos-latest
            target: x86_64-apple-darwin
            compress: false
            cargo_flags: ""
          - os: macos-latest
            target: aarch64-apple-darwin
            compress: false
            cargo_flags: ""
          - os: ubuntu-latest
            target: x86_64-unknown-freebsd
            compress: false
            cargo_flags: ""

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - run: sudo apt install musl-tools
        if: startsWith(matrix.os, 'ubuntu')

      - name: cargo build
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          args: --release --locked ${{ matrix.cargo_flags }}
          target: ${{ matrix.target }}

      - name: Set exe extension for Windows
        run: echo "EXE=.exe" >> $env:GITHUB_ENV
        if: startsWith(matrix.os, 'windows')

      - name: Compress binaries
        uses: svenstaro/upx-action@v2
        with:
          files: target/${{ matrix.target }}/release/miniserve${{ env.EXE }}
          args: --best --lzma
          strip: false  # We're stripping already in Cargo.toml
        if: ${{ matrix.compress }}

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.target }}
          path: target/${{ matrix.target }}/release/miniserve${{ env.EXE }}

      - name: Get version from tag
        id: extract_version
        run: |
          echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
        shell: bash

      - name: Install CHANGELOG parser
        uses: taiki-e/install-action@parse-changelog

      - name: Get CHANGELOG entry
        run: parse-changelog CHANGELOG.md ${{ steps.extract_version.outputs.version }} | tee changelog_entry
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'
        shell: bash

      - name: Read changelog entry from file
        id: changelog_entry
        uses: juliangruber/read-file-action@v1
        with:
          path: ./changelog_entry
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'

      - name: Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/${{ matrix.target }}/release/miniserve${{ env.EXE }}
          tag: ${{ github.ref_name }}
          asset_name: miniserve-${{ steps.extract_version.outputs.version }}-${{ matrix.target }}${{ env.EXE }}
          body: ${{ steps.changelog_entry.outputs.content }}
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'

  container-images:
    name: Publish images
    runs-on: ubuntu-latest
    needs: publish
    # Run for tags and pushes to the default branch
    if: (startsWith(github.ref_name, 'v') && github.ref_type == 'tag') || github.event.repository.default_branch == github.ref_name

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Download artifact aarch64-unknown-linux-gnu
        uses: actions/download-artifact@v4
        with:
          name: aarch64-unknown-linux-gnu
          path: target/aarch64-unknown-linux-gnu/release

      - name: Download artifact x86_64-unknown-linux-gnu
        uses: actions/download-artifact@v4
        with:
          name: x86_64-unknown-linux-gnu
          path: target/x86_64-unknown-linux-gnu/release

      - name: Download artifact armv7-unknown-linux-gnueabihf
        uses: actions/download-artifact@v4
        with:
          name: armv7-unknown-linux-gnueabihf
          path: target/armv7-unknown-linux-gnueabihf/release

      - name: Download artifact aarch64-unknown-linux-musl
        uses: actions/download-artifact@v4
        with:
          name: aarch64-unknown-linux-musl
          path: target/aarch64-unknown-linux-musl/release

      - name: Download artifact x86_64-unknown-linux-musl
        uses: actions/download-artifact@v4
        with:
          name: x86_64-unknown-linux-musl
          path: target/x86_64-unknown-linux-musl/release

      - name: Download artifact armv7-unknown-linux-musleabihf
        uses: actions/download-artifact@v4
        with:
          name: armv7-unknown-linux-musleabihf
          path: target/armv7-unknown-linux-musleabihf/release

      - name: podman login
        run: podman login --username ${{ secrets.DOCKERHUB_USERNAME }} --password ${{ secrets.DOCKERHUB_TOKEN }} docker.io

      - name: podman build linux/arm64
        run: podman build --format docker --platform linux/arm64/v8 --manifest miniserve -f Containerfile target/aarch64-unknown-linux-gnu/release

      - name: podman build linux/amd64
        run: podman build --format docker --platform linux/amd64 --manifest miniserve -f Containerfile target/x86_64-unknown-linux-gnu/release

      - name: podman build linux/arm
        run: podman build --format docker --platform linux/arm/v7 --manifest miniserve -f Containerfile target/armv7-unknown-linux-gnueabihf/release

      - name: podman manifest push latest
        run: podman manifest push miniserve docker.io/svenstaro/miniserve:latest

      - name: podman manifest push tag version
        run: podman manifest push miniserve docker.io/svenstaro/miniserve:${{ needs.publish.outputs.version }}
        if: startsWith(github.ref_name, 'v')

      - name: podman build linux/arm64 (alpine edition)
        run: podman build --format docker --platform linux/arm64/v8 --manifest miniserve-alpine -f Containerfile.alpine target/aarch64-unknown-linux-musl/release

      - name: podman build linux/amd64 (alpine edition)
        run: podman build --format docker --platform linux/amd64 --manifest miniserve-alpine -f Containerfile.alpine target/x86_64-unknown-linux-musl/release

      - name: podman build linux/arm (alpine edition)
        run: podman build --format docker --platform linux/arm/v7 --manifest miniserve-alpine -f Containerfile.alpine target/armv7-unknown-linux-musleabihf/release

      - name: podman manifest push latest (alpine edition)
        run: podman manifest push miniserve-alpine docker.io/svenstaro/miniserve:alpine

      - name: podman manifest push tag version (alpine edition)
        run: podman manifest push miniserve-alpine docker.io/svenstaro/miniserve:${{ needs.publish.outputs.version }}-alpine
        if: startsWith(github.ref_name, 'v')