Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate GitLab CI to GitHub Actions #729

Merged
merged 8 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/issue_templates/nightly_run_failed.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
title: staking-miner integration tests failed against latest polkadot build.
---

Go to {{ env.GITLAB_PIPELINE_URL }} to see details about the failure.
Go to [job logs]({{ env.FAILED_WORKFLOW_RUN_URL }}) to see details about the failure.
262 changes: 262 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
name: Polkadot Staking Miner CI

on:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main

env:
IMAGE: paritytech/ci-unified:bullseye-1.74.0-2023-11-01-v20231204
IMAGE_NAME: paritytech/polkadot-staking-miner
RUST_INFO: rustup show && cargo --version && rustup +nightly show && cargo +nightly --version

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
set-image:
# GitHub Actions does not allow using 'env' in a container context.
# This workaround sets the container image for each job using 'set-image' job output.
runs-on: ubuntu-latest
outputs:
IMAGE: ${{ steps.set_image.outputs.IMAGE }}
steps:
- id: set_image
run: echo "IMAGE=${{ env.IMAGE }}" >> $GITHUB_OUTPUT

check-fmt:
name: Check formatting
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Check formatting
run: |
${{ env.RUST_INFO }}
cargo +nightly fmt --all -- --check

check-clippy:
name: Clippy
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Run Clippy
run: |
${{ env.RUST_INFO }}
cargo clippy --all-targets

check-docs:
name: Check documentation
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Check documentation
run: |
${{ env.RUST_INFO }}
RUSTDOCFLAGS="--cfg docsrs --deny rustdoc::broken_intra_doc_links" cargo doc --verbose --workspace --no-deps --document-private-items --all-features

check-cargo-hack:
name: Check code using cargo-hack
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}

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

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Check code using cargo-hack
run: |
${{ env.RUST_INFO }}
cargo hack check --workspace --each-feature --all-targets

check-staking-miner-playground:
name: Check staking-miner-playground
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Check staking-miner-playground
run: |
${{ env.RUST_INFO }}
cargo check --manifest-path staking-miner-playground/Cargo.toml

test:
name: Run tests
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Run tests on Ubuntu
run: |
${{ env.RUST_INFO }}
RUST_LOG=info cargo test --workspace -- --nocapture

build:
name: Build polkadot-staking-miner binary
runs-on: ubuntu-latest
needs: [set-image]
container: ${{ needs.set-image.outputs.IMAGE }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}

- name: Build staking-miner
run: |
${{ env.RUST_INFO }}
cargo build --release --locked

- name: Move polkadot-staking-miner binary
run: mv ./target/release/polkadot-staking-miner .

- name: Collect artifacts
uses: actions/upload-artifact@v3
with:
name: build-artifacts
path: |
./polkadot-staking-miner
./Dockerfile

build-docker-image:
name: Test Docker image build
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
needs: [check-fmt,
check-clippy,
check-docs,
check-cargo-hack,
check-staking-miner-playground,
test,
build]
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: build-artifacts
path: ./artifacts

- name: Set permissions
run: chmod +x ./artifacts/polkadot-staking-miner

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build Docker image
uses: docker/build-push-action@v5
with:
push: false
context: ./artifacts
file: ./artifacts/Dockerfile
build-args: |
VCS_REF="${{ github.sha }}"
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
tags: |
${{ env.IMAGE_NAME }}:test

publish-docker-image:
name: Build and publish Docker image
if: ${{ github.ref == 'refs/heads/main' || github.ref_type == 'tag' }}
runs-on: ubuntu-latest
environment: main_and_tags
needs: [check-fmt,
check-clippy,
check-docs,
check-cargo-hack,
check-staking-miner-playground,
test,
build]
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: build-artifacts
path: ./artifacts

- name: Prepare Docker environment
run: |
echo IMAGE_TAG=$(if [ "$GITHUB_REF" == "refs/heads/main" ]; then echo "main-${GITHUB_SHA::7}"; else echo "$GITHUB_REF_NAME"; fi) >> $GITHUB_ENV
echo PUSH_IMAGE=true >> $GITHUB_ENV
echo "Docker image will be published with the tag: ${{ env.IMAGE_TAG }}!"
chmod +x ./artifacts/polkadot-staking-miner

- name: Log in to Docker Hub
if: ${{ github.ref == 'refs/heads/main' || github.ref_type == 'tag' }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
push: true
context: ./artifacts
file: ./artifacts/Dockerfile
build-args: |
VCS_REF="${{ github.sha }}"
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
tags: |
${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
${{ env.IMAGE_NAME }}:latest
22 changes: 0 additions & 22 deletions .github/workflows/gitspiegel-trigger.yml

This file was deleted.

67 changes: 47 additions & 20 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
@@ -1,34 +1,64 @@
name: Daily compatibility check against latest polkadot

on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
inputs:
gitlab_pipeline:
description: 'Link to failed pipeline'
required: true
gitlab_test_job_status:
description: 'GitLab test job status'
required: true

jobs:
announce-status:
nightly-test:
runs-on: ubuntu-latest
steps:
- name: Announce a status
run: echo ${{ inputs.gitlab_test_job_status }}

create-an-issue:
if: ${{ inputs.gitlab_test_job_status == 'failed' }}
runs-on: ubuntu-latest
steps:
- name: Checkout staking-miner sources
- name: Checkout repository
uses: actions/checkout@v4

- name: Create an issue
- name: Free space on the runner
run: |
df -h
sudo apt -y autoremove --purge
sudo apt -y autoclean
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
df -h

- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-rust-${{ hashFiles('**/Cargo.lock') }}
cache-on-failure: true

- name: Run nightly tests
run: |
sudo apt install -y protobuf-compiler
rustup target add wasm32-unknown-unknown
rustup component add rust-src
git clone -b master --depth 1 https://github.com/paritytech/polkadot-sdk.git polkadot-sdk
Copy link
Member

@niklasad1 niklasad1 Dec 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergejparity

Do think it would be easy to cache these binaries similar to what https://github.com/paritytech/subxt/blob/master/.github/workflows/build-substrate.yml does?

We might be able to enable this in the CI instead of running it every night then...

The staking-miner-playaround is rarely changed and it might be possible to cache and only rebuild it if the versions doesn't match...

cd polkadot-sdk
cargo build -p polkadot --release --features fast-runtime
mkdir -p ~/.local/bin
sudo mv ./target/release/polkadot /usr/bin
sudo mv ./target/release/polkadot-execute-worker /usr/bin
sudo mv ./target/release/polkadot-prepare-worker /usr/bin
polkadot --version
cd -
rm -rf polkadot
cd staking-miner-playground
cargo build --release --features test-trimming
sudo mv ./target/release/staking-miner-playground /usr/bin
staking-miner-playground --version
cd -
RUST_LOG=info cargo test --workspace --all-features -- --nocapture
cargo clean

- name: Create an issue on failure
if: failure()
uses: JasonEtco/create-an-issue@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITLAB_PIPELINE_URL: ${{ inputs.gitlab_pipeline }}
FAILED_WORKFLOW_RUN_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks/${{ github.run_id }}
with:
# Use this issue template:
filename: .github/issue_templates/nightly_run_failed.md
Expand All @@ -38,6 +68,3 @@ jobs:
# Look for new *open* issues in this search (we want to
# create a new one if we only find closed versions):
search_existing: open

- name: Fail workflow if tests failed
run: exit 1
Loading