1on:
2  push:
3    tags:
4      - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
5
6name: Containerd Release
7
8jobs:
9  check:
10    name: Check Signed Tag
11    runs-on: ubuntu-18.04
12    timeout-minutes: 5
13    outputs:
14      stringver: ${{ steps.contentrel.outputs.stringver }}
15
16    steps:
17      - name: Checkout code
18        uses: actions/checkout@v2
19        with:
20          ref: ${{ github.ref }}
21          path: src/github.com/containerd/containerd
22
23      - name: Check signature
24        run: |
25          releasever=${{ github.ref }}
26          releasever="${releasever#refs/tags/}"
27          TAGCHECK=$(git tag -v ${releasever} 2>&1 >/dev/null) ||
28          echo "${TAGCHECK}" | grep -q "error" && {
29              echo "::error::tag ${releasever} is not a signed tag. Failing release process."
30              exit 1
31          } || {
32              echo "Tag ${releasever} is signed."
33              exit 0
34          }
35        working-directory: src/github.com/containerd/containerd
36
37      - name: Release content
38        id: contentrel
39        run: |
40          RELEASEVER=${{ github.ref }}
41          echo "::set-output name=stringver::${RELEASEVER#refs/tags/v}"
42          git tag -l ${RELEASEVER#refs/tags/} -n20000 | tail -n +3 | cut -c 5- >release-notes.md
43        working-directory: src/github.com/containerd/containerd
44
45      - name: Save release notes
46        uses: actions/upload-artifact@v2
47        with:
48          name: containerd-release-notes
49          path: src/github.com/containerd/containerd/release-notes.md
50
51  build:
52    name: Build Release Binaries
53    runs-on: ${{ matrix.os }}
54    needs: [check]
55    timeout-minutes: 10
56
57    strategy:
58      matrix:
59        os: [ubuntu-18.04, windows-2019]
60
61    steps:
62      - name: Install Go
63        uses: actions/setup-go@v2
64        with:
65          go-version: '1.16.8'
66
67      - name: Set env
68        shell: bash
69        env:
70          MOS: ${{ matrix.os }}
71        run: |
72          releasever=${{ github.ref }}
73          releasever="${releasever#refs/tags/}"
74          os=linux
75          [[ "${MOS}" =~ "windows" ]] && {
76            os=windows
77          }
78          echo "RELEASE_VER=${releasever}" >> $GITHUB_ENV
79          echo "GOPATH=${{ github.workspace }}" >> $GITHUB_ENV
80          echo "OS=${os}" >> $GITHUB_ENV
81          echo "${{ github.workspace }}/bin" >> $GITHUB_PATH
82
83      - name: Checkout containerd
84        uses: actions/checkout@v2
85        with:
86          repository: containerd/containerd
87          ref: ${{ github.ref }}
88          path: src/github.com/containerd/containerd
89
90      - name: HCS Shim commit
91        id: hcsshim_commit
92        if: startsWith(matrix.os, 'windows')
93        shell: bash
94        run: echo "::set-output name=sha::$(grep 'Microsoft/hcsshim ' go.mod | awk '{print $2}')"
95        working-directory: src/github.com/containerd/containerd
96
97      - name: Checkout hcsshim source
98        if: startsWith(matrix.os, 'windows')
99        uses: actions/checkout@v2
100        with:
101          repository: Microsoft/hcsshim
102          ref: ${{ steps.hcsshim_commit.outputs.sha }}
103          path: src/github.com/Microsoft/hcsshim
104
105      - name: Make
106        shell: bash
107        run: |
108          make build
109          make binaries
110          rm bin/containerd-stress*
111          [[ "${OS}" == "windows" ]] && {
112              (
113                bindir="$(pwd)/bin"
114                cd ../../Microsoft/hcsshim
115                GO111MODULE=on go build -mod=vendor -o "${bindir}/containerd-shim-runhcs-v1.exe" ./cmd/containerd-shim-runhcs-v1
116              )
117          }
118          TARFILE="containerd-${RELEASE_VER#v}-${OS}-amd64.tar.gz"
119          tar czf ${TARFILE} bin/
120          sha256sum ${TARFILE} >${TARFILE}.sha256sum
121        working-directory: src/github.com/containerd/containerd
122
123      - name: Save build binaries
124        uses: actions/upload-artifact@v2
125        with:
126          name: containerd-binaries-${{ matrix.os }}
127          path: src/github.com/containerd/containerd/*.tar.gz*
128
129      - name: Make cri-containerd tar
130        shell: bash
131        env:
132          RUNC_FLAVOR: runc
133        run: |
134          if [[ "${OS}" == "linux" ]]; then
135            sudo apt-get update
136            sudo apt-get install -y gperf
137            sudo -E PATH=$PATH script/setup/install-seccomp
138          fi
139          make cri-cni-release
140        working-directory: src/github.com/containerd/containerd
141
142      - name: Save cri-containerd binaries
143        uses: actions/upload-artifact@v2
144        with:
145          name: cri-containerd-binaries-${{ matrix.os }}
146          path: src/github.com/containerd/containerd/releases/cri-containerd-cni-*.tar.gz*
147
148  release:
149    name: Create containerd Release
150    runs-on: ubuntu-18.04
151    timeout-minutes: 10
152    needs: [build, check]
153
154    steps:
155      - name: Download builds and release notes
156        uses: actions/download-artifact@v2
157        with:
158          path: builds
159      - name: Catalog build assets for upload
160        id: catalog
161        run: |
162          _filenum=1
163          for i in "ubuntu-18.04" "windows-2019"; do
164            for f in `ls builds/containerd-binaries-${i}`; do
165              echo "::set-output name=file${_filenum}::${f}"
166              let "_filenum+=1"
167            done
168            for f in `ls builds/cri-containerd-binaries-${i}`; do
169              echo "::set-output name=file${_filenum}::${f}"
170              let "_filenum+=1"
171            done
172          done
173      - name: Create Release
174        id: create_release
175        uses: actions/create-release@v1.1.2
176        env:
177          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
178        with:
179          tag_name: ${{ github.ref }}
180          release_name: containerd ${{ needs.check.outputs.stringver }}
181          body_path: ./builds/containerd-release-notes/release-notes.md
182          draft: false
183          prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
184      - name: Upload Linux containerd tarball
185        uses: actions/upload-release-asset@v1
186        env:
187          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
188        with:
189          upload_url: ${{ steps.create_release.outputs.upload_url }}
190          asset_path: ./builds/containerd-binaries-ubuntu-18.04/${{ steps.catalog.outputs.file1 }}
191          asset_name: ${{ steps.catalog.outputs.file1 }}
192          asset_content_type: application/gzip
193      - name: Upload Linux sha256 sum
194        uses: actions/upload-release-asset@v1
195        env:
196          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
197        with:
198          upload_url: ${{ steps.create_release.outputs.upload_url }}
199          asset_path: ./builds/containerd-binaries-ubuntu-18.04/${{ steps.catalog.outputs.file2 }}
200          asset_name: ${{ steps.catalog.outputs.file2 }}
201          asset_content_type: text/plain
202      - name: Upload Linux cri containerd tarball
203        uses: actions/upload-release-asset@v1
204        env:
205          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
206        with:
207          upload_url: ${{ steps.create_release.outputs.upload_url }}
208          asset_path: ./builds/cri-containerd-binaries-ubuntu-18.04/${{ steps.catalog.outputs.file3 }}
209          asset_name: ${{ steps.catalog.outputs.file3 }}
210          asset_content_type: application/gzip
211      - name: Upload Linux cri sha256 sum
212        uses: actions/upload-release-asset@v1
213        env:
214          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
215        with:
216          upload_url: ${{ steps.create_release.outputs.upload_url }}
217          asset_path: ./builds/cri-containerd-binaries-ubuntu-18.04/${{ steps.catalog.outputs.file4 }}
218          asset_name: ${{ steps.catalog.outputs.file4 }}
219          asset_content_type: text/plain
220      - name: Upload Windows containerd tarball
221        uses: actions/upload-release-asset@v1
222        env:
223          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
224        with:
225          upload_url: ${{ steps.create_release.outputs.upload_url }}
226          asset_path: ./builds/containerd-binaries-windows-2019/${{ steps.catalog.outputs.file5 }}
227          asset_name: ${{ steps.catalog.outputs.file5 }}
228          asset_content_type: application/gzip
229      - name: Upload Windows sha256 sum
230        uses: actions/upload-release-asset@v1
231        env:
232          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
233        with:
234          upload_url: ${{ steps.create_release.outputs.upload_url }}
235          asset_path: ./builds/containerd-binaries-windows-2019/${{ steps.catalog.outputs.file6 }}
236          asset_name: ${{ steps.catalog.outputs.file6 }}
237          asset_content_type: text/plain
238      - name: Upload Windows cri containerd tarball
239        uses: actions/upload-release-asset@v1
240        env:
241          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
242        with:
243          upload_url: ${{ steps.create_release.outputs.upload_url }}
244          asset_path: ./builds/cri-containerd-binaries-windows-2019/${{ steps.catalog.outputs.file7 }}
245          asset_name: ${{ steps.catalog.outputs.file7 }}
246          asset_content_type: application/gzip
247      - name: Upload Windows cri sha256 sum
248        uses: actions/upload-release-asset@v1
249        env:
250          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
251        with:
252          upload_url: ${{ steps.create_release.outputs.upload_url }}
253          asset_path: ./builds/cri-containerd-binaries-windows-2019/${{ steps.catalog.outputs.file8 }}
254          asset_name: ${{ steps.catalog.outputs.file8 }}
255          asset_content_type: text/plain
256