Skip to content

Commit 7620a61

Browse files
committed
Build in Github Actions
1 parent f166297 commit 7620a61

File tree

3 files changed

+192
-60
lines changed

3 files changed

+192
-60
lines changed

.circleci/config.yml

Lines changed: 0 additions & 59 deletions
This file was deleted.

.circleci/whitelist-dependencies.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

.github/workflows/haskell.yml

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
name: Binaries
2+
3+
defaults:
4+
run:
5+
shell: bash
6+
7+
on:
8+
push:
9+
branches:
10+
- main
11+
pull_request:
12+
13+
jobs:
14+
build:
15+
runs-on: ${{ matrix.os }}
16+
17+
strategy:
18+
fail-fast: false
19+
matrix:
20+
ghc: ["8.10.4", "8.8.4", "8.6.5"]
21+
os: [ubuntu-latest, macOS-latest]
22+
23+
steps:
24+
- uses: actions/checkout@v2
25+
26+
- name: Select optimal cabal version
27+
run: |
28+
case "$OS" in
29+
Windows_NT) echo "CABAL_VERSION=3.4.0.0-rc5" >> $GITHUB_ENV;;
30+
*) echo "CABAL_VERSION=3.4.0.0" >> $GITHUB_ENV;;
31+
esac
32+
33+
- uses: haskell/actions/setup@v1
34+
id: setup-haskell
35+
with:
36+
ghc-version: ${{ matrix.ghc }}
37+
cabal-version: ${{ env.CABAL_VERSION }}
38+
39+
- name: Set some window specific things
40+
if: matrix.os == 'windows-latest'
41+
run: echo 'EXE_EXT=.exe' >> $GITHUB_ENV
42+
43+
- name: Configure project
44+
run: cabal configure --enable-tests --enable-benchmarks --write-ghc-environment-files=ghc8.4.4+
45+
46+
- name: Restore cabal cache
47+
uses: haskell-works/cabal-cache-action@v1
48+
env:
49+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
50+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
51+
BINARY_CACHE_REGION: ${{ secrets.BINARY_CACHE_REGION }}
52+
BINARY_CACHE_THREADS: ${{ secrets.BINARY_CACHE_THREADS }}
53+
BINARY_CACHE_URI: ${{ secrets.BINARY_CACHE_URI }}
54+
with:
55+
args: |
56+
sync-from-archive \
57+
--threads "$BINARY_CACHE_THREADS" \
58+
--archive-uri "$BINARY_CACHE_URI" \
59+
--region "$BINARY_CACHE_REGION" \
60+
--store-path "${{ steps.setup-haskell.outputs.cabal-store }}"
61+
62+
- name: Build
63+
# Try building it twice in case of flakey builds on Windows
64+
run: |
65+
cabal build all --enable-tests --enable-benchmarks --write-ghc-environment-files=ghc8.4.4+ || \
66+
cabal build all --enable-tests --enable-benchmarks --write-ghc-environment-files=ghc8.4.4+ -j1
67+
68+
- name: Test
69+
run: |
70+
cabal test all --enable-tests --enable-benchmarks --write-ghc-environment-files=ghc8.4.4+
71+
72+
- name: Save cabal cache
73+
uses: haskell-works/cabal-cache-action@v1
74+
if: ${{ always() }}
75+
env:
76+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
77+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
78+
BINARY_CACHE_REGION: ${{ secrets.BINARY_CACHE_REGION }}
79+
BINARY_CACHE_THREADS: ${{ secrets.BINARY_CACHE_THREADS }}
80+
BINARY_CACHE_URI: ${{ secrets.BINARY_CACHE_URI }}
81+
with:
82+
args: |
83+
sync-to-archive \
84+
--threads "$BINARY_CACHE_THREADS" \
85+
--archive-uri "$BINARY_CACHE_URI" \
86+
--region "$BINARY_CACHE_REGION" \
87+
--store-path "${{ steps.setup-haskell.outputs.cabal-store }}"
88+
89+
check:
90+
needs: build
91+
runs-on: ubuntu-latest
92+
outputs:
93+
tag: ${{ steps.tag.outputs.tag }}
94+
95+
steps:
96+
- uses: actions/checkout@v2
97+
98+
- name: Check if cabal project is sane
99+
run: |
100+
PROJECT_DIR=$PWD
101+
mkdir -p $PROJECT_DIR/build/sdist
102+
for i in $(git ls-files | grep '\.cabal'); do
103+
cd $PROJECT_DIR && cd `dirname $i`
104+
cabal check
105+
done
106+
107+
- name: Tag new version
108+
id: tag
109+
if: ${{ github.ref == 'refs/heads/main' }}
110+
env:
111+
server: http://hackage.haskell.org
112+
username: ${{ secrets.HACKAGE_USER }}
113+
password: ${{ secrets.HACKAGE_PASS }}
114+
run: |
115+
package_version="$(cat *.cabal | grep '^version:' | cut -d : -f 2 | xargs)"
116+
117+
echo "Package version is v$package_version"
118+
119+
git fetch --unshallow origin
120+
121+
if git tag "v$package_version"; then
122+
echo "Tagging with new version "v$package_version""
123+
124+
if git push origin "v$package_version"; then
125+
echo "Tagged with new version "v$package_version""
126+
127+
echo "::set-output name=tag::v$package_version"
128+
fi
129+
fi
130+
131+
release:
132+
needs: [build, check]
133+
runs-on: ubuntu-latest
134+
if: ${{ needs.check.outputs.tag != '' }}
135+
outputs:
136+
upload_url: ${{ steps.create_release.outputs.upload_url }}
137+
138+
steps:
139+
- uses: actions/checkout@v2
140+
141+
- name: Create source distribution
142+
run: |
143+
PROJECT_DIR=$PWD
144+
mkdir -p $PROJECT_DIR/build/sdist
145+
for i in $(git ls-files | grep '\.cabal'); do
146+
cd $PROJECT_DIR && cd `dirname $i`
147+
cabal v2-sdist -o $PROJECT_DIR/build/sdist
148+
done;
149+
150+
- name: Publish to hackage
151+
env:
152+
server: http://hackage.haskell.org
153+
username: ${{ secrets.HACKAGE_USER }}
154+
password: ${{ secrets.HACKAGE_PASS }}
155+
candidate: false
156+
run: |
157+
package_version="$(cat *.cabal | grep '^version:' | cut -d : -f 2 | xargs)"
158+
159+
for PACKAGE_TARBALL in $(find ./build/sdist/ -name "*.tar.gz"); do
160+
PACKAGE_NAME=$(basename ${PACKAGE_TARBALL%.*.*})
161+
162+
if ${{ env.candidate }}; then
163+
TARGET_URL="${{ env.server }}/packages/candidates";
164+
DOCS_URL="${{ env.server }}/package/$PACKAGE_NAME/candidate/docs"
165+
else
166+
TARGET_URL="${{ env.server }}/packages/upload";
167+
DOCS_URL="${{ env.server }}/package/$PACKAGE_NAME/docs"
168+
fi
169+
170+
HACKAGE_STATUS=$(curl --silent --head -w %{http_code} -XGET --anyauth --user "${{ env.username }}:${{ env.password }}" ${{ env.server }}/package/$PACKAGE_NAME -o /dev/null)
171+
172+
if [ "$HACKAGE_STATUS" = "404" ]; then
173+
echo "Uploading $PACKAGE_NAME to $TARGET_URL"
174+
175+
curl -X POST -f --user "${{ env.username }}:${{ env.password }}" $TARGET_URL -F "package=@$PACKAGE_TARBALL"
176+
echo "Uploaded $PACKAGE_NAME"
177+
else
178+
echo "Package $PACKAGE_NAME" already exists on Hackage.
179+
fi
180+
done
181+
182+
- name: Create Release
183+
id: create_release
184+
uses: actions/create-release@v1
185+
env:
186+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
187+
with:
188+
tag_name: ${{ github.ref }}
189+
release_name: Release ${{ github.ref }}
190+
body: Undocumented
191+
draft: true
192+
prerelease: false

0 commit comments

Comments
 (0)