1name: CI
2
3on:
4 push:
5 branches:
6 - main
7 - "v[0-9]+.[0-9]+.x"
8 tags:
9 - "v*"
10 pull_request:
11 branches:
12 - "**"
13
14env:
15 CARGO_TERM_COLOR: always
16 CARGO_INCREMENTAL: 0
17 RUST_BACKTRACE: 1
18
19jobs:
20 rustfmt:
21 name: Check formatting
22 runs-on:
23 - self-hosted
24 - test
25 steps:
26 - name: Checkout repo
27 uses: actions/checkout@v3
28 with:
29 clean: false
30 submodules: "recursive"
31
32 - name: Set up default .cargo/config.toml
33 run: cp ./.cargo/ci-config.toml ~/.cargo/config.toml
34
35 - name: Run rustfmt
36 uses: ./.github/actions/check_formatting
37
38 tests:
39 name: Run tests
40 runs-on:
41 - self-hosted
42 - test
43 needs: rustfmt
44 steps:
45 - name: Checkout repo
46 uses: actions/checkout@v3
47 with:
48 clean: false
49 submodules: "recursive"
50
51 - name: Run tests
52 uses: ./.github/actions/run_tests
53
54 - name: Build collab
55 run: cargo build -p collab
56
57 - name: Build other binaries
58 run: cargo build --workspace --bins --all-features
59
60 bundle:
61 name: Bundle app
62 runs-on:
63 - self-hosted
64 - bundle
65 if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-build-dmg') }}
66 needs: tests
67 env:
68 MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
69 MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
70 APPLE_NOTARIZATION_USERNAME: ${{ secrets.APPLE_NOTARIZATION_USERNAME }}
71 APPLE_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_NOTARIZATION_PASSWORD }}
72 steps:
73 - name: Install Rust
74 run: |
75 rustup set profile minimal
76 rustup update stable
77 rustup target add aarch64-apple-darwin
78 rustup target add x86_64-apple-darwin
79 rustup target add wasm32-wasi
80
81 - name: Install Node
82 uses: actions/setup-node@v3
83 with:
84 node-version: "18"
85
86 - name: Checkout repo
87 uses: actions/checkout@v3
88 with:
89 clean: false
90 submodules: "recursive"
91
92 - name: Limit target directory size
93 run: script/clear-target-dir-if-larger-than 100
94
95 - name: Determine version and release channel
96 if: ${{ startsWith(github.ref, 'refs/tags/v') }}
97 run: |
98 set -eu
99
100 version=$(script/get-crate-version zed)
101 channel=$(cat crates/zed/RELEASE_CHANNEL)
102 echo "Publishing version: ${version} on release channel ${channel}"
103 echo "RELEASE_CHANNEL=${channel}" >> $GITHUB_ENV
104
105 expected_tag_name=""
106 case ${channel} in
107 stable)
108 expected_tag_name="v${version}";;
109 preview)
110 expected_tag_name="v${version}-pre";;
111 nightly)
112 expected_tag_name="v${version}-nightly";;
113 *)
114 echo "can't publish a release on channel ${channel}"
115 exit 1;;
116 esac
117 if [[ $GITHUB_REF_NAME != $expected_tag_name ]]; then
118 echo "invalid release tag ${GITHUB_REF_NAME}. expected ${expected_tag_name}"
119 exit 1
120 fi
121
122 - name: Generate license file
123 run: script/generate-licenses
124
125 - name: Create app bundle
126 run: script/bundle
127
128 - name: Upload app bundle to workflow run if main branch or specific label
129 uses: actions/upload-artifact@v3
130 if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-build-dmg') }}
131 with:
132 name: Zed_${{ github.event.pull_request.head.sha || github.sha }}.dmg
133 path: target/release/Zed.dmg
134
135 - uses: softprops/action-gh-release@v1
136 name: Upload app bundle to release
137 if: ${{ env.RELEASE_CHANNEL == 'preview' || env.RELEASE_CHANNEL == 'stable' }}
138 with:
139 draft: true
140 prerelease: ${{ env.RELEASE_CHANNEL == 'preview' }}
141 files: target/release/Zed.dmg
142 body: ""
143 env:
144 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}