Skip to content

Nightly Release for macOS #16

Nightly Release for macOS

Nightly Release for macOS #16

# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# This workflow creates a GitHub "release" of a nightly build of the project.
#
# Note: This is just an initial rough attempt, there is a lot of future work
# needed here. A brief summary of TODOs:
#
# - Configure a nice release notes template and switch to generating the title
# and notes instead of hard coding them.
#
# - Do some amount of testing prior to building and uploading the release.
# - Tempting to try to examine existing testing workflow, but maybe better to
# allow re-using any complex parts and do our own testing. That would, for
# example, allow us to narrow or expand the set of tests uses for
# pre-release testing to potentially be different from continuous testing.
# - Some questions around what to do in the event of a failure... error? Where
# does the error go? Create a draft, unpublished release instead?
#
# - Build artifacts for all the different OSes we have GitHub runners for rather
# than just x86 Linux.
name: Nightly Release for macOS
on:
# schedule:
# - cron: '0 9 * * *'
# Enable manual runs for testing or manually (re-)creating a nightly release.
workflow_dispatch:
permissions:
contents: write # For creating and uploading to releases.
jobs:
build-amd64:
runs-on: macos-12
outputs:
release_version_macos12: ${{ steps.extract_release.outputs.release_version_macos12 }}
steps:
- name: Get nightly date
run: |
echo "nightly_date=$(date '+%Y.%m.%d')" >> $GITHUB_ENV
- name: Harden Runner
uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0
with:
egress-policy: audit
- name: Checkout branch
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: ./.github/actions/build-setup-common
with:
matrix_runner: macos-12
- name: Build release
run: |
./scripts/run_bazel.py \
--attempts=5 --jobs-on-last-attempt=4 \
test -c opt --remote_download_toplevel \
--pre_release=nightly --nightly_date=${{ env.nightly_date }} \
//toolchain/install:prefix_root/bin/carbon \
//toolchain/install:carbon_toolchain_tar_gz_rule \
//toolchain/install:carbon_toolchain_tar_gz_test \
//language_server:language_server
- name: Install npm dependencies
working-directory: utils/vscode
run: npm install
- name: Package VS Code extension
working-directory: utils/vscode
run: npm run package
- name: Extract the release version
id: extract_release
run: |
# Make sure we can run the toolchain to get the version.
./bazel-bin/toolchain/install/prefix_root/bin/carbon version
# Now stash it in a variable and export it.
VERSION=$( \
./bazel-bin/toolchain/install/prefix_root/bin/carbon version \
| cut -d' ' -f5 | cut -d'+' -f1,2)
echo "release_version_macos12=$VERSION" >> $GITHUB_OUTPUT
echo "release_version_macos12=$VERSION" >> $GITHUB_ENV
- name: Calculate SHA256 hash
run: |
FILE="bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos12 }}-macos-amd64"
if [[ -f "${FILE}.tar.gz" ]]; then
shasum -a 256 "${FILE}.tar.gz" | awk '{ print $1 }' > "${FILE}.sha256"
fi
VSCODE_EXTENSION_FILE="utils/vscode/out/carbon.vsix"
if [[ -f "${VSCODE_EXTENSION_FILE}" ]]; then
shasum -a 256 "${VSCODE_EXTENSION_FILE}" | awk '{ print $1 }' > "${VSCODE_EXTENSION_FILE}.sha256"
fi
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: artifact-amd64
path: |
bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos12 }}-macos-amd64.tar.gz
bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos12 }}-macos-amd64.sha256
utils/vscode/out/carbon.vsix
utils/vscode/out/carbon.vsix.sha256
build-arm64:
runs-on: macos-14
outputs:
release_version_macos14: ${{ steps.extract_release.outputs.release_version_macos14 }}
steps:
- name: Get nightly date
run: |
echo "nightly_date=$(date '+%Y.%m.%d')" >> $GITHUB_ENV
- name: Harden Runner
uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0
with:
egress-policy: audit
- name: Checkout branch
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: ./.github/actions/build-setup-common
with:
matrix_runner: macos-14
- name: Build release
run: |
./scripts/run_bazel.py \
--attempts=5 --jobs-on-last-attempt=4 \
test -c opt --remote_download_toplevel \
--pre_release=nightly --nightly_date=${{ env.nightly_date }} \
//toolchain/install:prefix_root/bin/carbon \
//toolchain/install:carbon_toolchain_tar_gz_rule \
//toolchain/install:carbon_toolchain_tar_gz_test \
//language_server:language_server
- name: Install npm dependencies
working-directory: utils/vscode
run: npm install
- name: Package VS Code extension
working-directory: utils/vscode
run: npm run package
- name: Extract the release version
id: extract_release
run: |
# Make sure we can run the toolchain to get the version.
./bazel-bin/toolchain/install/prefix_root/bin/carbon version
# Now stash it in a variable and export it.
VERSION=$( \
./bazel-bin/toolchain/install/prefix_root/bin/carbon version \
| cut -d' ' -f5 | cut -d'+' -f1,2)
echo "release_version_macos14=$VERSION" >> $GITHUB_OUTPUT
echo "release_version_macos14=$VERSION" >> $GITHUB_ENV
- name: Calculate SHA256 hash
run: |
FILE="bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos14 }}-macos-arm64"
if [[ -f "${FILE}.tar.gz" ]]; then
shasum -a 256 "${FILE}.tar.gz" | awk '{ print $1 }' > "${FILE}.sha256"
fi
VSCODE_EXTENSION_FILE="utils/vscode/out/carbon.vsix"
if [[ -f "${VSCODE_EXTENSION_FILE}" ]]; then
shasum -a 256 "${VSCODE_EXTENSION_FILE}" | awk '{ print $1 }' > "${VSCODE_EXTENSION_FILE}.sha256"
fi
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: artifact-arm64
path: |
bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos14 }}-macos-arm64.tar.gz
bazel-bin/toolchain/install/carbon_toolchain-${{ env.release_version_macos14 }}-macos-arm64.sha256
utils/vscode/out/carbon.vsix
utils/vscode/out/carbon.vsix.sha256
release:
runs-on: macos-14
needs: [build-amd64, build-arm64]
steps:
- name: Checkout branch
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Rename VS Code extension artifacts
run: |
mv ./artifact-amd64/utils/vscode/out/carbon.vsix ./artifact-amd64/utils/vscode/out/carbon-amd64.vsix
mv ./artifact-amd64/utils/vscode/out/carbon.vsix.sha256 ./artifact-amd64/utils/vscode/out/carbon-amd64.vsix.sha256
mv ./artifact-arm64/utils/vscode/out/carbon.vsix ./artifact-arm64/utils/vscode/out/carbon-arm64.vsix
mv ./artifact-arm64/utils/vscode/out/carbon.vsix.sha256 ./artifact-arm64/utils/vscode/out/carbon-arm64.vsix.sha256
- name: Create the release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
FILE_AMD64="./artifact-amd64/bazel-bin/toolchain/install/carbon_toolchain-${{ needs.build-amd64.outputs.release_version_macos12 }}-macos-amd64"
FILE_ARM64="./artifact-arm64/bazel-bin/toolchain/install/carbon_toolchain-${{ needs.build-arm64.outputs.release_version_macos14 }}-macos-arm64"
VSCODE_EXTENSION_AMD64="./artifact-amd64/utils/vscode/out/carbon-amd64.vsix"
VSCODE_EXTENSION_ARM64="./artifact-arm64/utils/vscode/out/carbon-arm64.vsix"
if [[ ! -f "${FILE_AMD64}.tar.gz" ]]; then
echo "Missing ${FILE_AMD64}.tar.gz"
exit 1
fi
if [[ ! -f "${FILE_AMD64}.sha256" ]]; then
echo "Missing ${FILE_AMD64}.sha256"
exit 1
fi
if [[ ! -f "${FILE_ARM64}.tar.gz" ]]; then
echo "Missing ${FILE_ARM64}.tar.gz"
exit 1
fi
if [[ ! -f "${FILE_ARM64}.sha256" ]]; then
echo "Missing ${FILE_ARM64}.sha256"
exit 1
fi
if [[ ! -f "${VSCODE_EXTENSION_AMD64}" ]]; then
echo "Missing ${VSCODE_EXTENSION_AMD64}"
exit 1
fi
if [[ ! -f "${VSCODE_EXTENSION_AMD64}.sha256" ]]; then
echo "Missing ${VSCODE_EXTENSION_AMD64}.sha256"
exit 1
fi
if [[ ! -f "${VSCODE_EXTENSION_ARM64}" ]]; then
echo "Missing ${VSCODE_EXTENSION_ARM64}"
exit 1
fi
if [[ ! -f "${VSCODE_EXTENSION_ARM64}.sha256" ]]; then
echo "Missing ${VSCODE_EXTENSION_ARM64}.sha256"
exit 1
fi
gh release create \
--title "Nightly build ${{ needs.build-arm64.outputs.release_version_macos14 }}" \
--generate-notes \
--prerelease \
v${{ needs.build-arm64.outputs.release_version_macos14 }} \
"${FILE_AMD64}.tar.gz" \
"${FILE_AMD64}.sha256" \
"${FILE_ARM64}.tar.gz" \
"${FILE_ARM64}.sha256" \
"${VSCODE_EXTENSION_AMD64}" \
"${VSCODE_EXTENSION_AMD64}.sha256" \
"${VSCODE_EXTENSION_ARM64}" \
"${VSCODE_EXTENSION_ARM64}.sha256"