Files
wrkflw/test_gitlab_ci/workflow.gitlab-ci.yml
bahdotsh e73b0df520 feat(gitlab): add comprehensive GitLab CI/CD pipeline support
This commit adds full support for GitLab CI/CD pipelines:

- Add GitLab CI pipeline models with complete spec support (jobs, stages, artifacts, cache, etc.)
- Implement GitLab CI/CD pipeline parsing and validation
- Add schema validation against GitLab CI JSON schema
- Support automatic pipeline type detection based on filename and content
- Add GitLab-specific CLI commands and flags
- Implement pipeline conversion for executor compatibility
- Add validation for common GitLab CI configuration issues
- Update CLI help text to reflect GitLab CI/CD support
- Support listing both GitHub and GitLab pipeline files

This expands wrkflw to be a multi-CI tool that can validate and execute both GitHub
Actions workflows and GitLab CI/CD pipelines locally.
2025-05-02 15:08:59 +05:30

186 lines
4.2 KiB
YAML

stages:
- prepare
- build
- test
- deploy
# Global workflow rules to control when pipelines run
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: always
- if: $CI_COMMIT_BRANCH == "main"
when: always
- if: $CI_COMMIT_TAG
when: always
- if: $CI_COMMIT_BRANCH == "develop"
when: always
- if: $CI_COMMIT_BRANCH =~ /^release\/.*/
when: always
- if: $CI_COMMIT_BRANCH =~ /^hotfix\/.*/
when: always
- when: never # Skip all other branches
variables:
RUST_VERSION: "1.76"
CARGO_HOME: "${CI_PROJECT_DIR}/.cargo"
# Default settings
default:
image: "rust:${RUST_VERSION}"
interruptible: true
# Cache definition to be used by other jobs
.cargo-cache:
cache:
key:
files:
- Cargo.lock
paths:
- ${CARGO_HOME}
- target/
# Prepare the dependencies (runs on all branches)
prepare:
stage: prepare
extends: .cargo-cache
script:
- cargo fetch --locked
artifacts:
paths:
- Cargo.lock
# Build only on main branch and MRs
build:
stage: build
extends: .cargo-cache
needs:
- prepare
script:
- cargo build --release
artifacts:
paths:
- target/release/
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TAG
# Build with debug symbols on develop branch
debug-build:
stage: build
extends: .cargo-cache
needs:
- prepare
script:
- cargo build
artifacts:
paths:
- target/debug/
rules:
- if: $CI_COMMIT_BRANCH == "develop"
# Test job - run on all branches except release and hotfix
test:
stage: test
extends: .cargo-cache
needs:
- job: build
optional: true
- job: debug-build
optional: true
script:
- |
if [ -d "target/release" ]; then
cargo test --release
else
cargo test
fi
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH =~ /^feature\/.*/
# Only lint on MRs and develop
lint:
stage: test
extends: .cargo-cache
script:
- rustup component add clippy
- cargo clippy -- -D warnings
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "develop"
# Run benchmarks only on main branch
benchmark:
stage: test
extends: .cargo-cache
needs:
- build
script:
- cargo bench
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TAG
# Deploy to staging on develop branch pushes
deploy-staging:
stage: deploy
needs:
- test
environment:
name: staging
url: https://staging.example.com
script:
- echo "Deploying to staging..."
- cp target/release/wrkflw /tmp/wrkflw-staging
rules:
- if: $CI_COMMIT_BRANCH == "develop"
when: on_success
- if: $CI_COMMIT_BRANCH =~ /^release\/.*/
when: manual
# Deploy to production on main branch and tags
deploy-prod:
stage: deploy
needs:
- test
- benchmark
environment:
name: production
url: https://example.com
script:
- echo "Deploying to production..."
- cp target/release/wrkflw /tmp/wrkflw-prod
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
when: manual
- if: $CI_COMMIT_BRANCH =~ /^hotfix\/.*/
when: manual
# Notify slack only when deploy succeeded or failed
notify:
stage: .post
image: curlimages/curl:latest
needs:
- job: deploy-staging
optional: true
- job: deploy-prod
optional: true
script:
- |
if [ "$CI_JOB_STATUS" == "success" ]; then
curl -X POST -H 'Content-type: application/json' --data '{"text":"Deployment succeeded! :tada:"}' $SLACK_WEBHOOK_URL
else
curl -X POST -H 'Content-type: application/json' --data '{"text":"Deployment failed! :boom:"}' $SLACK_WEBHOOK_URL
fi
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE != "merge_request_event"
- if: $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE != "merge_request_event"
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH =~ /^hotfix\/.*/