{"id":797,"date":"2026-03-25T09:39:23","date_gmt":"2026-03-25T08:39:23","guid":{"rendered":"https:\/\/secure-pipelines.com\/uncategorized\/gitlab-ci-security-cheat-sheet\/"},"modified":"2026-03-25T09:39:23","modified_gmt":"2026-03-25T08:39:23","slug":"gitlab-ci-security-cheat-sheet","status":"publish","type":"post","link":"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/gitlab-ci-security-cheat-sheet\/","title":{"rendered":"\u0648\u0631\u0642\u0629 \u0645\u0631\u062c\u0639\u064a\u0629 \u0644\u0623\u0645\u0627\u0646 GitLab CI: \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a\u060c \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a\u060c \u0627\u0644\u0628\u064a\u0626\u0627\u062a\u060c \u0648OIDC"},"content":{"rendered":"<h2>\u0644\u0645\u0627\u0630\u0627 \u064a\u064f\u0639\u062f\u0651 \u0623\u0645\u0627\u0646 GitLab CI \u0645\u0647\u0645\u064b\u0651\u0627<\/h2>\n<p>\u062a\u064f\u0639\u062f\u0651 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 GitLab CI\/CD \u0623\u062f\u0648\u0627\u062a \u0642\u0648\u064a\u0629 \u2014 \u0644\u0643\u0646 \u0627\u0644\u0642\u0648\u0629 \u062a\u0623\u062a\u064a \u0645\u0639 \u0627\u0644\u0645\u062e\u0627\u0637\u0631. \u0645\u062a\u063a\u064a\u0651\u0631 \u0648\u0627\u062d\u062f \u062e\u0627\u0637\u0626 \u0627\u0644\u062a\u0643\u0648\u064a\u0646 \u0642\u062f \u064a\u0633\u0631\u0651\u0628 \u0623\u0633\u0631\u0627\u0631\u064b\u0627 \u062d\u0633\u0627\u0633\u0629. \u0645\u064f\u0646\u0641\u0651\u0630 \u063a\u064a\u0631 \u0645\u062d\u062f\u0651\u062f \u0627\u0644\u0646\u0637\u0627\u0642 \u0642\u062f \u064a\u0646\u0641\u0651\u0630 \u0634\u064a\u0641\u0631\u0629 \u062e\u0628\u064a\u062b\u0629. \u0628\u064a\u0626\u0629 \u063a\u064a\u0631 \u0645\u062d\u0645\u064a\u0629 \u0642\u062f \u062a\u0633\u0645\u062d \u0644\u0645\u0637\u0648\u0651\u0631 \u0645\u0628\u062a\u062f\u0626 \u0628\u0627\u0644\u0646\u0634\u0631 \u0645\u0628\u0627\u0634\u0631\u0629 \u0641\u064a \u0627\u0644\u0625\u0646\u062a\u0627\u062c. \u062a\u0645\u0646\u062d\u0643 \u0647\u0630\u0647 \u0627\u0644\u0648\u0631\u0642\u0629 \u0627\u0644\u0645\u0631\u062c\u0639\u064a\u0629 <strong>\u0623\u0643\u0648\u0627\u062f YAML \u062c\u0627\u0647\u0632\u0629 \u0644\u0644\u0646\u0633\u062e \u0648\u0627\u0644\u0644\u0635\u0642<\/strong> \u0644\u0643\u0644 \u0636\u0648\u0627\u0628\u0637 \u0627\u0644\u0623\u0645\u0627\u0646 \u0627\u0644\u062d\u0631\u062c\u0629 \u0641\u064a GitLab CI\u060c \u0645\u0646 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629 \u0625\u0644\u0649 \u0627\u062a\u062d\u0627\u062f OIDC.<\/p>\n<p>\u0627\u062d\u0641\u0638 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0641\u064a \u0645\u0641\u0636\u0644\u062a\u0643. \u0627\u0633\u062a\u062e\u062f\u0645\u0647\u0627 \u0643\u0645\u0631\u062c\u0639 \u0623\u0633\u0627\u0633\u064a \u0641\u064a \u0643\u0644 \u0645\u0631\u0629 \u062a\u064f\u0647\u064a\u0651\u0626 \u0641\u064a\u0647\u0627 \u0645\u0634\u0631\u0648\u0639\u064b\u0627 \u062c\u062f\u064a\u062f\u064b\u0627 \u0623\u0648 \u062a\u064f\u062f\u0642\u0651\u0642 \u0645\u0634\u0631\u0648\u0639\u064b\u0627 \u0642\u0627\u0626\u0645\u064b\u0627.<\/p>\n<h2>1. \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629\u060c \u0627\u0644\u0645\u064f\u0642\u0646\u0651\u0639\u0629\u060c \u0648\u0627\u0644\u0645\u062e\u0641\u064a\u0629<\/h2>\n<p>\u062a\u062a\u062d\u0643\u0651\u0645 \u0645\u062a\u063a\u064a\u0631\u0627\u062a GitLab CI\/CD \u0641\u064a \u0643\u064a\u0641\u064a\u0629 \u062a\u062f\u0641\u0651\u0642 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0625\u0644\u0649 \u062e\u0637\u0648\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643. \u0627\u0644\u062e\u0637\u0623 \u0641\u064a \u0636\u0628\u0637\u0647\u0627 \u0647\u0648 \u0627\u0644\u0633\u0628\u0628 \u0627\u0644\u0623\u0648\u0644 \u0644\u062a\u0633\u0631\u064a\u0628 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f \u0641\u064a CI\/CD. \u064a\u062c\u0628 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0643\u0644 \u0642\u064a\u0645\u0629 \u062d\u0633\u0627\u0633\u0629 <strong>\u0645\u062d\u0645\u064a\u0629<\/strong> (\u0645\u062a\u0627\u062d\u0629 \u0641\u0642\u0637 \u0639\u0644\u0649 \u0627\u0644\u0641\u0631\u0648\u0639\/\u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629)\u060c \u0648<strong>\u0645\u064f\u0642\u0646\u0651\u0639\u0629<\/strong> (\u0645\u062e\u0641\u064a\u0629 \u0645\u0646 \u0633\u062c\u0644\u0627\u062a \u0627\u0644\u0645\u0647\u0627\u0645)\u060c \u0648\u062d\u064a\u062b \u064a\u0643\u0648\u0646 \u0630\u0644\u0643 \u0645\u062f\u0639\u0648\u0645\u064b\u0627\u060c <strong>\u0645\u062e\u0641\u064a\u0629<\/strong> (\u063a\u064a\u0631 \u0645\u0631\u0626\u064a\u0629 \u0641\u064a \u0648\u0627\u062c\u0647\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0628\u0639\u062f \u0627\u0644\u0625\u0646\u0634\u0627\u0621).<\/p>\n<h3>\u0636\u0628\u0637 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0639\u0628\u0631 \u0648\u0627\u062c\u0647\u0629 \u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a (API)<\/h3>\n<pre><code># Create a protected + masked variable via the GitLab API\ncurl --request POST \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/variables\" \\\n  --form \"key=AWS_SECRET_ACCESS_KEY\" \\\n  --form \"value=$MY_SECRET\" \\\n  --form \"protected=true\" \\\n  --form \"masked=true\" \\\n  --form \"variable_type=env_var\"<\/code><\/pre>\n<h3>\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0641\u064a <code>.gitlab-ci.yml<\/code><\/h3>\n<pre><code>variables:\n  # Group or project-level variables are injected automatically.\n  # File-type variables are written to a temp path.\n  DEPLOY_TOKEN:\n    description: \"Token for deploying to production\"\n    value: \"\"  # Intentionally blank \u2014 set in CI\/CD Settings\n\ndeploy_production:\n  stage: deploy\n  script:\n    - echo \"Deploying with masked token...\"\n    - .\/deploy.sh --token \"$DEPLOY_TOKEN\"\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  environment:\n    name: production<\/code><\/pre>\n<p><strong>\u0627\u0644\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629:<\/strong><\/p>\n<ul>\n<li>\u0644\u0627 \u062a\u0636\u0639 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0645\u0628\u0627\u0634\u0631\u0629 \u0641\u064a <code>.gitlab-ci.yml<\/code> \u0623\u0628\u062f\u064b\u0627 \u2014 \u0627\u0633\u062a\u062e\u062f\u0645 \u062f\u0627\u0626\u0645\u064b\u0627 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0645\u062a\u063a\u064a\u0631\u0627\u062a CI\/CD.<\/li>\n<li>\u0627\u0636\u0628\u0637 <code>protected=true<\/code> \u062d\u062a\u0649 \u062a\u0643\u0648\u0646 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0645\u062a\u0627\u062d\u0629 \u0641\u0642\u0637 \u0639\u0644\u0649 \u0627\u0644\u0641\u0631\u0648\u0639 \u0627\u0644\u0645\u062d\u0645\u064a\u0629.<\/li>\n<li>\u0627\u0636\u0628\u0637 <code>masked=true<\/code> \u062d\u062a\u0649 \u064a\u062a\u0645 \u0625\u062e\u0641\u0627\u0621 \u0627\u0644\u0642\u064a\u0645 \u0645\u0646 \u0633\u062c\u0644\u0627\u062a \u0627\u0644\u0645\u0647\u0627\u0645.<\/li>\n<li>\u0627\u0633\u062a\u062e\u062f\u0645 <strong>\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629<\/strong> \u0644\u0644\u0623\u0633\u0631\u0627\u0631 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 \u0639\u0628\u0631 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639 (\u0645\u062b\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0644\u0633\u062d\u0627\u0628\u0629).<\/li>\n<\/ul>\n<h2>2. \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0648\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0646\u0637\u0627\u0642<\/h2>\n<p>\u062a\u0646\u0641\u0651\u0630 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a (Runners) \u0645\u0647\u0627\u0645 CI\/CD \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643. \u0625\u0630\u0627 \u0643\u0627\u0646 \u0623\u064a \u0645\u064f\u0646\u0641\u0651\u0630 \u064a\u0645\u0643\u0646\u0647 \u062a\u0646\u0641\u064a\u0630 \u0623\u064a \u0645\u0647\u0645\u0629\u060c \u0641\u0642\u062f \u064a\u0633\u062a\u063a\u0644\u0651 \u0637\u0644\u0628 \u062f\u0645\u062c \u062e\u0628\u064a\u062b \u0630\u0644\u0643 \u0644\u0633\u0631\u0642\u0629 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0645\u0646 \u0645\u064f\u0646\u0641\u0651\u0630 \u0627\u0644\u0625\u0646\u062a\u0627\u062c. \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0646\u0637\u0627\u0642 \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d \u0623\u0645\u0631 \u0636\u0631\u0648\u0631\u064a.<\/p>\n<h3>\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630 \u0645\u0639 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a \u0648\u0627\u0644\u062d\u0645\u0627\u064a\u0629<\/h3>\n<pre><code># Register a runner scoped to protected branches only\ngitlab-runner register \\\n  --non-interactive \\\n  --url \"https:\/\/gitlab.example.com\" \\\n  --token \"$RUNNER_REG_TOKEN\" \\\n  --executor docker \\\n  --docker-image alpine:latest \\\n  --tag-list \"production,protected\" \\\n  --access-level ref_protected<\/code><\/pre>\n<h3>\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642 \u0627\u0644\u0645\u0647\u0627\u0645 \u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0645\u062d\u062f\u062f\u0629<\/h3>\n<pre><code># .gitlab-ci.yml \u2014 ensure production jobs only run on protected runners\ndeploy_production:\n  stage: deploy\n  tags:\n    - production\n    - protected\n  script:\n    - kubectl apply -f k8s\/production\/\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  environment:\n    name: production\n\n# Development jobs use a separate, unprivileged runner\ntest:\n  stage: test\n  tags:\n    - shared\n    - development\n  script:\n    - pytest tests\/<\/code><\/pre>\n<p><strong>\u0623\u0641\u0636\u0644 \u0627\u0644\u0645\u0645\u0627\u0631\u0633\u0627\u062a:<\/strong><\/p>\n<ul>\n<li>\u0627\u0633\u062a\u062e\u062f\u0645 <code>--access-level ref_protected<\/code> \u0644\u062a\u0642\u064a\u064a\u062f \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0628\u0627\u0644\u0641\u0631\u0648\u0639 \u0648\u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629.<\/li>\n<li>\u0627\u0633\u062a\u062e\u062f\u0645 <strong>\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u062e\u0627\u0635\u0629 \u0628\u0627\u0644\u0645\u0634\u0631\u0648\u0639<\/strong> \u0644\u0623\u062d\u0645\u0627\u0644 \u0627\u0644\u0639\u0645\u0644 \u0627\u0644\u062d\u0633\u0627\u0633\u0629 \u2014 \u0644\u0627 \u062a\u0634\u0627\u0631\u0643 \u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0623\u0628\u062f\u064b\u0627 \u0639\u0628\u0631 \u0645\u0634\u0627\u0631\u064a\u0639 \u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0637\u0629.<\/li>\n<li>\u0641\u0636\u0651\u0644 <strong>\u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0627\u0644\u0645\u0624\u0642\u062a\u0629<\/strong> (\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a Docker \u0623\u0648 Kubernetes) \u062d\u062a\u0649 \u064a\u062a\u0645 \u062a\u062f\u0645\u064a\u0631 \u0627\u0644\u0628\u064a\u0626\u0629 \u0628\u0639\u062f \u0643\u0644 \u0645\u0647\u0645\u0629.<\/li>\n<li>\u0639\u0637\u0651\u0644 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 \u0641\u064a \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639 \u0627\u0644\u062a\u064a \u062a\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0639\u0645\u0644\u064a\u0627\u062a \u0646\u0634\u0631 \u062d\u0633\u0627\u0633\u0629.<\/li>\n<\/ul>\n<h2>3. \u0627\u0644\u0628\u064a\u0626\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629 \u0645\u0639 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0627\u062a<\/h2>\n<p>\u062a\u0636\u064a\u0641 \u0627\u0644\u0628\u064a\u0626\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629 \u0628\u0648\u0627\u0628\u0629 \u0628\u0634\u0631\u064a\u0629 \u0642\u0628\u0644 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0646\u0634\u0631. \u0647\u0630\u0627 \u0647\u0648 \u062e\u0637 \u062f\u0641\u0627\u0639\u0643 \u0627\u0644\u0623\u062e\u064a\u0631 \u0636\u062f \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a \u063a\u064a\u0631 \u0627\u0644\u0645\u0635\u0631\u0651\u062d \u0628\u0647\u0627 \u0641\u064a \u0627\u0644\u0625\u0646\u062a\u0627\u062c.<\/p>\n<h3>\u062a\u0647\u064a\u0626\u0629 \u0627\u0644\u0628\u064a\u0626\u0629 \u0641\u064a <code>.gitlab-ci.yml<\/code><\/h3>\n<pre><code># .gitlab-ci.yml \u2014 deployment with environment protection\ndeploy_staging:\n  stage: deploy\n  script:\n    - .\/deploy.sh staging\n  environment:\n    name: staging\n    url: https:\/\/staging.example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\ndeploy_production:\n  stage: deploy\n  script:\n    - .\/deploy.sh production\n  environment:\n    name: production\n    url: https:\/\/example.com\n    deployment_tier: production\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n      when: manual\n      allow_failure: false<\/code><\/pre>\n<h3>\u0625\u0639\u062f\u0627\u062f \u0642\u0648\u0627\u0639\u062f \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629 \u0639\u0628\u0631 \u0648\u0627\u062c\u0647\u0629 \u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a (API)<\/h3>\n<pre><code># Protect the production environment with required approvals\ncurl --request POST \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/protected_environments\" \\\n  --data '{\"name\": \"production\", \"deploy_access_levels\": [{\"group_id\": 9899826}], \"required_approval_count\": 2, \"approval_rules\": [{\"group_id\": 9899826, \"required_approvals\": 2}]}'<\/code><\/pre>\n<p>\u0642\u0645 \u0628\u062a\u0647\u064a\u0626\u0629 \u0630\u0644\u0643 \u0636\u0645\u0646 <strong>Settings > CI\/CD > Protected Environments<\/strong> \u0641\u064a \u0648\u0627\u062c\u0647\u0629 \u0645\u0633\u062a\u062e\u062f\u0645 GitLab. \u0627\u0637\u0644\u0628 <strong>\u0645\u0648\u0627\u0641\u0642\u062a\u064a\u0646 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644<\/strong> \u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0646\u0634\u0631 \u0627\u0644\u0625\u0646\u062a\u0627\u062c. \u0642\u064a\u0651\u062f \u0648\u0635\u0648\u0644 \u0627\u0644\u0646\u0634\u0631 \u0644\u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0623\u0648 \u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0645\u062d\u062f\u062f\u064a\u0646 \u2014 \u0644\u0627 \u062a\u0633\u062a\u062e\u062f\u0645 \u0623\u0628\u062f\u064b\u0627 &#8220;All maintainers&#8221;.<\/p>\n<h2>4. \u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642 CI_JOB_TOKEN<\/h2>\n<p><code>CI_JOB_TOKEN<\/code> \u0647\u0648 \u0631\u0645\u0632 \u0645\u0645\u064a\u0632 \u062a\u0644\u0642\u0627\u0626\u064a \u064a\u062d\u0642\u0646\u0647 GitLab \u0641\u064a \u0643\u0644 \u0645\u0647\u0645\u0629. \u0627\u0641\u062a\u0631\u0627\u0636\u064a\u064b\u0627\u060c \u064a\u0645\u0643\u0646\u0647 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0634\u0627\u0631\u064a\u0639 \u0623\u062e\u0631\u0649 \u0641\u064a \u0645\u062c\u0645\u0648\u0639\u062a\u0643 \u2014 \u0648\u0647\u0630\u0627 \u062e\u0637\u0631 \u062c\u062f\u0651\u064a \u0644\u0644\u062a\u062d\u0631\u0651\u0643 \u0627\u0644\u062c\u0627\u0646\u0628\u064a. \u0645\u0646\u0630 GitLab 16.0\u060c \u064a\u062c\u0628 \u0639\u0644\u064a\u0643 \u062a\u0642\u064a\u064a\u062f \u0646\u0637\u0627\u0642\u0647.<\/p>\n<h3>\u062a\u0642\u064a\u064a\u062f \u0648\u0635\u0648\u0644 \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0645\u0645\u064a\u0632<\/h3>\n<pre><code># Check current CI_JOB_TOKEN access scope\ncurl --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/job_token_scope\"\n\n# Limit CI_JOB_TOKEN to only access specific projects\ncurl --request PATCH \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/job_token_scope\" \\\n  --data '{\"enabled\": true}'\n\n# Add an allowlisted project\ncurl --request POST \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/job_token_scope\/allowlist\" \\\n  --data '{\"target_project_id\": 12345}'<\/code><\/pre>\n<h3>\u0627\u0633\u062a\u062e\u062f\u0627\u0645 <code>CI_JOB_TOKEN<\/code> \u0628\u0623\u0645\u0627\u0646 \u0641\u064a \u062e\u0637\u0648\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628<\/h3>\n<pre><code># .gitlab-ci.yml \u2014 using CI_JOB_TOKEN for cross-project triggers\ntrigger_deploy:\n  stage: deploy\n  trigger:\n    project: my-group\/deploy-project\n    branch: main\n    strategy: depend\n  # CI_JOB_TOKEN is used automatically for the trigger.\n  # The target project must allowlist this project's token.<\/code><\/pre>\n<p><strong>\u0627\u0644\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629:<\/strong> \u0641\u0639\u0651\u0644 \u062d\u062f\u0651 \u0646\u0637\u0627\u0642 \u0631\u0645\u0632 \u0645\u0647\u0645\u0629 CI\/CD \u0641\u064a \u0643\u0644 \u0645\u0634\u0631\u0648\u0639. \u0623\u0636\u0641 \u0641\u0642\u0637 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 \u0627\u0644\u062a\u064a \u062a\u062d\u062a\u0627\u062c \u0641\u0639\u0644\u064b\u0627 \u0644\u0644\u0648\u0635\u0648\u0644 \u0639\u0628\u0631 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0633\u0645\u0648\u062d\u0629. \u0631\u0627\u062c\u0639 \u0627\u0644\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u0645\u0633\u0645\u0648\u062d\u0629 \u0643\u0644 \u062b\u0644\u0627\u062b\u0629 \u0623\u0634\u0647\u0631.<\/p>\n<h2>5. \u0631\u0645\u0648\u0632 OIDC <code>id_tokens<\/code> \u0644\u0640 AWS \u0648GCP<\/h2>\n<p>\u064a\u064f\u0644\u063a\u064a \u0627\u062a\u062d\u0627\u062f OIDC \u0627\u0644\u062d\u0627\u062c\u0629 \u0625\u0644\u0649 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0637\u0648\u064a\u0644\u0629 \u0627\u0644\u0623\u0645\u062f \u0641\u064a \u0645\u062a\u063a\u064a\u0631\u0627\u062a CI\/CD \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643 \u0646\u0647\u0627\u0626\u064a\u064b\u0651\u0627. \u064a\u064f\u0635\u062f\u0631 GitLab \u0631\u0645\u0632 JWT \u0642\u0635\u064a\u0631 \u0627\u0644\u0623\u0645\u062f\u060c \u0648\u064a\u0633\u062a\u0628\u062f\u0644\u0647 \u0645\u0632\u0648\u0651\u062f \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0628\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0639\u062a\u0645\u0627\u062f \u0645\u0624\u0642\u062a\u0629. \u0647\u0630\u0627 \u0647\u0648 \u0627\u0644\u0645\u0639\u064a\u0627\u0631 \u0627\u0644\u0630\u0647\u0628\u064a \u0644\u0645\u0635\u0627\u062f\u0642\u0629 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0641\u064a \u062e\u0637\u0648\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628.<\/p>\n<h3>\u0627\u062a\u062d\u0627\u062f OIDC \u0645\u0639 AWS<\/h3>\n<pre><code># .gitlab-ci.yml \u2014 OIDC authentication with AWS\ndeploy_aws:\n  stage: deploy\n  image: amazon\/aws-cli:latest\n  id_tokens:\n    GITLAB_OIDC_TOKEN:\n      aud: https:\/\/gitlab.example.com\n  variables:\n    ROLE_ARN: arn:aws:iam::123456789012:role\/gitlab-ci-deploy\n  script:\n    - >\n      export $(printf \"AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s\"\n      $(aws sts assume-role-with-web-identity\n      --role-arn $ROLE_ARN\n      --role-session-name \"GitLabCI-${CI_PROJECT_ID}-${CI_PIPELINE_ID}\"\n      --web-identity-token \"$GITLAB_OIDC_TOKEN\"\n      --duration-seconds 3600\n      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'\n      --output text))\n    - aws s3 sync .\/build s3:\/\/my-production-bucket\/\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  environment:\n    name: production<\/code><\/pre>\n<h3>\u0627\u062a\u062d\u0627\u062f \u0647\u0648\u064a\u0629 \u0623\u062d\u0645\u0627\u0644 \u0627\u0644\u0639\u0645\u0644 \u0645\u0639 GCP<\/h3>\n<pre><code># .gitlab-ci.yml \u2014 OIDC authentication with GCP\ndeploy_gcp:\n  stage: deploy\n  image: google\/cloud-sdk:latest\n  id_tokens:\n    GITLAB_OIDC_TOKEN:\n      aud: https:\/\/gitlab.example.com\n  script:\n    - echo \"$GITLAB_OIDC_TOKEN\" > \/tmp\/gitlab_token.txt\n    - >\n      gcloud iam workload-identity-pools create-cred-config\n      projects\/$GCP_PROJECT_NUMBER\/locations\/global\/workloadIdentityPools\/$POOL_ID\/providers\/$PROVIDER_ID\n      --service-account=\"$GCP_SERVICE_ACCOUNT\"\n      --output-file=\/tmp\/gcp_creds.json\n      --credential-source-file=\/tmp\/gitlab_token.txt\n    - export GOOGLE_APPLICATION_CREDENTIALS=\/tmp\/gcp_creds.json\n    - gcloud config set project $GCP_PROJECT_ID\n    - gcloud run deploy my-service --image gcr.io\/$GCP_PROJECT_ID\/my-app:$CI_COMMIT_SHA\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  environment:\n    name: production<\/code><\/pre>\n<p>\u0639\u0644\u0649 \u062c\u0627\u0646\u0628 \u0627\u0644\u0633\u062d\u0627\u0628\u0629\u060c \u0642\u0645 \u0628\u062a\u0647\u064a\u0626\u0629 \u0633\u064a\u0627\u0633\u0629 \u0627\u0644\u062b\u0642\u0629 \u0644\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u0637\u0627\u0644\u0628\u0627\u062a \u0645\u062b\u0644 <code>project_path<\/code> \u0648<code>ref<\/code> \u0648<code>ref_protected<\/code> \u0628\u062d\u064a\u062b \u064a\u0645\u0643\u0646 \u0641\u0642\u0637 \u0644\u0645\u0634\u0627\u0631\u064a\u0639 \u0648\u0641\u0631\u0648\u0639 \u0645\u062d\u062f\u062f\u0629 \u062a\u0648\u0644\u0651\u064a \u0627\u0644\u062f\u0648\u0631.<\/p>\n<h2>6. \u0623\u0645\u0627\u0646 \u062e\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 \u0637\u0644\u0628\u0627\u062a \u0627\u0644\u062f\u0645\u062c<\/h2>\n<p>\u062a\u0639\u0645\u0644 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 \u0637\u0644\u0628\u0627\u062a \u0627\u0644\u062f\u0645\u062c (Merge Request) \u0639\u0644\u0649 \u0634\u064a\u0641\u0631\u0629 \u0644\u0645 \u062a\u062a\u0645 \u0645\u0631\u0627\u062c\u0639\u062a\u0647\u0627 \u0628\u0639\u062f. \u0639\u0627\u0645\u0644\u0647\u0627 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642\u0629. \u0644\u0627 \u062a\u0643\u0634\u0641 \u0623\u0628\u062f\u064b\u0627 \u0623\u0633\u0631\u0627\u0631 \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0644\u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 \u0637\u0644\u0628\u0627\u062a \u0627\u0644\u062f\u0645\u062c.<\/p>\n<pre><code># .gitlab-ci.yml \u2014 separate rules for MR vs. branch pipelines\ntest:\n  stage: test\n  script:\n    - pytest tests\/\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\ndeploy_production:\n  stage: deploy\n  script:\n    - .\/deploy.sh production\n  rules:\n    # NEVER run on merge request pipelines\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      when: never\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  environment:\n    name: production<\/code><\/pre>\n<p><strong>\u0627\u0644\u0636\u0648\u0627\u0628\u0637 \u0627\u0644\u062d\u0631\u062c\u0629:<\/strong><\/p>\n<ul>\n<li>\u0627\u0633\u062a\u062e\u062f\u0645 <code>rules:<\/code> \u0644\u0636\u0645\u0627\u0646 \u0639\u062f\u0645 \u062a\u0634\u063a\u064a\u0644 \u0645\u0647\u0627\u0645 \u0627\u0644\u0646\u0634\u0631 <strong>\u0623\u0628\u062f\u064b\u0627<\/strong> \u0639\u0644\u0649 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 <code>merge_request_event<\/code>.<\/li>\n<li>\u0627\u0637\u0644\u0628 <strong>\u0646\u062c\u0627\u062d \u062e\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628<\/strong> \u0642\u0628\u0644 \u0627\u0644\u062f\u0645\u062c (Settings > Merge Requests).<\/li>\n<li>\u0641\u0639\u0651\u0644 <strong>&#8220;Pipelines must succeed&#8221;<\/strong> \u0648<strong>&#8220;All discussions must be resolved.&#8221;<\/strong><\/li>\n<li>\u0641\u0643\u0651\u0631 \u0641\u064a \u062a\u0641\u0639\u064a\u0644 <strong>merged results pipelines<\/strong> \u0644\u0627\u062e\u062a\u0628\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u0629 \u0628\u0639\u062f \u0627\u0644\u062f\u0645\u062c.<\/li>\n<\/ul>\n<h2>7. \u0642\u0627\u0644\u0628 \u0643\u0634\u0641 \u0627\u0644\u0623\u0633\u0631\u0627\u0631<\/h2>\n<p>\u064a\u0644\u062a\u0642\u0637 \u0645\u0627\u0633\u062d \u0643\u0634\u0641 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0627\u0644\u0645\u062f\u0645\u062c \u0641\u064a GitLab \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0644\u0645\u064f\u0631\u0633\u0644\u0629 \u0639\u0646 \u0637\u0631\u064a\u0642 \u0627\u0644\u062e\u0637\u0623 \u0642\u0628\u0644 \u0648\u0635\u0648\u0644\u0647\u0627 \u0625\u0644\u0649 \u0627\u0644\u0641\u0631\u0639 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a.<\/p>\n<pre><code># .gitlab-ci.yml \u2014 include the secret detection template\ninclude:\n  - template: Jobs\/Secret-Detection.gitlab-ci.yml\n\n# Override to make the pipeline fail if secrets are found\nsecret_detection:\n  variables:\n    SECRET_DETECTION_HISTORIC_SCAN: \"true\"  # Scan full git history\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  allow_failure: false  # Block the pipeline on detection<\/code><\/pre>\n<p>\u0644\u0645\u0633\u062d \u0623\u0643\u062b\u0631 \u0634\u0645\u0648\u0644\u064b\u0627\u060c \u0623\u0636\u0641 \u0642\u0648\u0627\u0644\u0628 <strong>SAST<\/strong> \u0648<strong>\u0641\u062d\u0635 \u0627\u0644\u062a\u0628\u0639\u064a\u0627\u062a<\/strong> (dependency scanning) \u0623\u064a\u0636\u064b\u0627:<\/p>\n<pre><code>include:\n  - template: Jobs\/Secret-Detection.gitlab-ci.yml\n  - template: Jobs\/SAST.gitlab-ci.yml\n  - template: Jobs\/Dependency-Scanning.gitlab-ci.yml<\/code><\/pre>\n<p>\u0631\u0627\u062c\u0639 \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0641\u064a <strong>Security Dashboard<\/strong> (\u0627\u0644\u0645\u062a\u0627\u062d \u0639\u0644\u0649 GitLab Ultimate) \u0623\u0648 \u062d\u0644\u0651\u0644 \u0645\u0644\u0641\u0627\u062a JSON \u0627\u0644\u0646\u0627\u062a\u062c\u0629 \u0641\u064a \u0627\u0644\u0645\u0633\u062a\u0648\u064a\u0627\u062a \u0627\u0644\u0623\u062f\u0646\u0649.<\/p>\n<h2>8. \u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062f\u0641\u0639 (Push Rules)<\/h2>\n<p>\u062a\u0641\u0631\u0636 \u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062f\u0641\u0639 \u0633\u064a\u0627\u0633\u0627\u062a \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 Git \u2014 \u0642\u0628\u0644 \u0623\u0646 \u062a\u062f\u062e\u0644 \u0627\u0644\u0634\u064a\u0641\u0631\u0629 \u062d\u062a\u0649 \u0641\u064a \u062e\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628. \u0627\u0633\u062a\u062e\u062f\u0645\u0647\u0627 \u0644\u0645\u0646\u0639 \u062f\u0641\u0639 \u0627\u0644\u0623\u0633\u0631\u0627\u0631\u060c \u0648\u0641\u0631\u0636 \u0645\u0639\u0627\u064a\u064a\u0631 \u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0625\u064a\u062f\u0627\u0639\u060c \u0648\u062a\u0642\u064a\u064a\u062f \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a.<\/p>\n<pre><code># Set push rules via the API\ncurl --request PUT \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https:\/\/gitlab.example.com\/api\/v4\/projects\/$PROJECT_ID\/push_rule\" \\\n  --data '{\"deny_delete_tag\": true, \"prevent_secrets\": true, \"commit_message_regex\": \"^(feat|fix|chore|docs|refactor|test|ci)\\\\(.*\\\\):.*\", \"max_file_size\": 50, \"member_check\": true, \"reject_unsigned_commits\": true}'<\/code><\/pre>\n<p><strong>\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062f\u0641\u0639 \u0627\u0644\u0645\u0648\u0635\u0649 \u0628\u0647\u0627:<\/strong><\/p>\n<ul>\n<li><code>prevent_secrets: true<\/code> \u2014 \u064a\u0631\u0641\u0636 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062f\u0641\u0639 \u0627\u0644\u062a\u064a \u062a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0645\u0644\u0641\u0627\u062a \u062a\u0628\u062f\u0648 \u0643\u0623\u0633\u0631\u0627\u0631 (\u0645\u0641\u0627\u062a\u064a\u062d\u060c \u0631\u0645\u0648\u0632 \u0645\u0645\u064a\u0632\u0629\u060c \u0634\u0647\u0627\u062f\u0627\u062a).<\/li>\n<li><code>reject_unsigned_commits: true<\/code> \u2014 \u064a\u062a\u0637\u0644\u0628 \u0625\u064a\u062f\u0627\u0639\u0627\u062a \u0645\u0648\u0642\u0651\u0639\u0629 \u0628\u0640 GPG (GitLab Premium \u0648\u0623\u0639\u0644\u0649).<\/li>\n<li><code>commit_message_regex<\/code> \u2014 \u064a\u0641\u0631\u0636 \u0631\u0633\u0627\u0626\u0644 \u0625\u064a\u062f\u0627\u0639 \u062a\u0642\u0644\u064a\u062f\u064a\u0629 \u0644\u0645\u0633\u0627\u0631\u0627\u062a \u062a\u062f\u0642\u064a\u0642 \u0646\u0638\u064a\u0641\u0629.<\/li>\n<li><code>max_file_size<\/code> \u2014 \u064a\u0645\u0646\u0639 \u0625\u0631\u0633\u0627\u0644 \u0645\u0644\u0641\u0627\u062a \u062b\u0646\u0627\u0626\u064a\u0629 \u0643\u0628\u064a\u0631\u0629 \u0639\u0646 \u0637\u0631\u064a\u0642 \u0627\u0644\u062e\u0637\u0623.<\/li>\n<li><code>member_check: true<\/code> \u2014 \u064a\u0631\u0641\u0636 \u0627\u0644\u0625\u064a\u062f\u0627\u0639\u0627\u062a \u0645\u0646 \u063a\u064a\u0631 \u0623\u0639\u0636\u0627\u0621 \u0627\u0644\u0645\u0634\u0631\u0648\u0639.<\/li>\n<\/ul>\n<h2>9. \u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0647\u0627\u0645 \u0648<code>interruptible<\/code><\/h2>\n<p>\u062a\u0647\u062f\u0631 \u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u062e\u0627\u0631\u062c\u0629 \u0639\u0646 \u0627\u0644\u0633\u064a\u0637\u0631\u0629 \u0627\u0644\u0645\u0648\u0627\u0631\u062f \u0648\u064a\u0645\u0643\u0646 \u0627\u0633\u062a\u063a\u0644\u0627\u0644\u0647\u0627 \u0641\u064a \u0627\u0644\u062a\u0639\u062f\u064a\u0646 \u0627\u0644\u062e\u0641\u064a \u0644\u0644\u0639\u0645\u0644\u0627\u062a \u0627\u0644\u0631\u0642\u0645\u064a\u0629. \u0627\u0636\u0628\u0637 \u0645\u0647\u0644\u0627\u062a \u0632\u0645\u0646\u064a\u0629 \u0635\u0631\u064a\u062d\u0629 \u0648\u0639\u0644\u0651\u0645 \u0627\u0644\u0645\u0647\u0627\u0645 \u063a\u064a\u0631 \u0627\u0644\u062d\u0631\u062c\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0645\u0642\u0627\u0637\u0639\u0629 \u062d\u062a\u0649 \u064a\u062a\u0645 \u0625\u0644\u063a\u0627\u0624\u0647\u0627 \u0639\u0646\u062f \u0628\u062f\u0621 \u062e\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 \u062c\u062f\u064a\u062f \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0641\u0631\u0639.<\/p>\n<pre><code># .gitlab-ci.yml \u2014 timeouts and interruptible\ndefault:\n  timeout: 30m          # Global default timeout for all jobs\n  interruptible: true   # Cancel running jobs when a new commit is pushed\n  retry:\n    max: 1\n    when:\n      - runner_system_failure\n      - stuck_or_timeout_failure\n\ntest:\n  stage: test\n  timeout: 15m\n  interruptible: true\n  script:\n    - pytest tests\/ --timeout=600\n\ndeploy_production:\n  stage: deploy\n  timeout: 20m\n  interruptible: false  # NEVER cancel a running production deployment\n  script:\n    - .\/deploy.sh production\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n      when: manual\n  environment:\n    name: production<\/code><\/pre>\n<p><strong>\u0625\u0631\u0634\u0627\u062f\u0627\u062a:<\/strong><\/p>\n<ul>\n<li>\u0627\u0636\u0628\u0637 <strong>\u0645\u0647\u0644\u0629 \u0632\u0645\u0646\u064a\u0629 \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639<\/strong> \u0641\u064a Settings > CI\/CD > General Pipelines (\u0627\u0644\u0645\u0648\u0635\u0649 \u0628\u0647: 60 \u062f\u0642\u064a\u0642\u0629 \u0643\u062d\u062f \u0623\u0642\u0635\u0649).<\/li>\n<li>\u0627\u0636\u0628\u0637 <strong>\u0645\u0647\u0644\u0627\u062a \u0632\u0645\u0646\u064a\u0629 \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0645\u0647\u0645\u0629<\/strong> \u0623\u0643\u062b\u0631 \u0635\u0631\u0627\u0645\u0629 \u0645\u0646 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639.<\/li>\n<li>\u0639\u0644\u0651\u0645 \u0645\u0647\u0627\u0645 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631 \u0648\u0627\u0644\u062a\u0646\u0633\u064a\u0642 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 <code>interruptible: true<\/code> \u0644\u062a\u0648\u0641\u064a\u0631 \u0633\u0639\u0629 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a.<\/li>\n<li>\u0639\u0644\u0651\u0645 \u0645\u0647\u0627\u0645 \u0627\u0644\u0646\u0634\u0631 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 <code>interruptible: false<\/code> \u0644\u0645\u0646\u0639 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u062c\u0632\u0626\u064a\u0629.<\/li>\n<li>\u0627\u0633\u062a\u062e\u062f\u0645 <code>retry<\/code> \u0644\u0623\u0639\u0637\u0627\u0644 \u0627\u0644\u0628\u0646\u064a\u0629 \u0627\u0644\u062a\u062d\u062a\u064a\u0629 \u0627\u0644\u0645\u0624\u0642\u062a\u0629 \u0641\u0642\u0637 \u2014 \u0644\u064a\u0633 \u0623\u0628\u062f\u064b\u0627 \u0644\u0641\u0634\u0644 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a.<\/li>\n<\/ul>\n<h2>\u062c\u062f\u0648\u0644 \u0645\u0631\u062c\u0639\u064a \u0633\u0631\u064a\u0639<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u0627\u0644\u0636\u0627\u0628\u0637<\/th>\n<th>\u0645\u0643\u0627\u0646 \u0627\u0644\u062a\u0647\u064a\u0626\u0629<\/th>\n<th>\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u062f\u0646\u0649 \u0644\u0644\u0645\u0633\u062a\u0648\u0649<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629\/\u0627\u0644\u0645\u064f\u0642\u0646\u0651\u0639\u0629<\/td>\n<td>Settings > CI\/CD > Variables<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a<\/td>\n<td>Settings > CI\/CD > Runners<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>\u0627\u0644\u0628\u064a\u0626\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u064a\u0629<\/td>\n<td>Settings > CI\/CD > Protected Environments<\/td>\n<td>Premium<\/td>\n<\/tr>\n<tr>\n<td>\u0646\u0637\u0627\u0642 CI_JOB_TOKEN<\/td>\n<td>Settings > CI\/CD > Token Access<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>OIDC id_tokens<\/td>\n<td><code>.gitlab-ci.yml<\/code><\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>\u0643\u0634\u0641 \u0627\u0644\u0623\u0633\u0631\u0627\u0631<\/td>\n<td><code>include: template<\/code><\/td>\n<td>Free (Ultimate \u0644\u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a)<\/td>\n<\/tr>\n<tr>\n<td>\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062f\u0641\u0639<\/td>\n<td>Settings > Repository > Push Rules<\/td>\n<td>Premium<\/td>\n<\/tr>\n<tr>\n<td>\u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0647\u0627\u0645<\/td>\n<td>Settings > CI\/CD + <code>.gitlab-ci.yml<\/code><\/td>\n<td>Free<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>\u0642\u0631\u0627\u0621\u0627\u062a \u0625\u0636\u0627\u0641\u064a\u0629 \u0648\u0645\u062e\u062a\u0628\u0631\u0627\u062a \u0639\u0645\u0644\u064a\u0629<\/h2>\n<p>\u0648\u0627\u0635\u0644 \u062a\u0639\u0632\u064a\u0632 \u0623\u0645\u0627\u0646 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 GitLab CI\/CD \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643 \u0645\u0639 \u0647\u0630\u0647 \u0627\u0644\u0645\u0648\u0627\u0631\u062f \u0630\u0627\u062a \u0627\u0644\u0635\u0644\u0629:<\/p>\n<ul>\n<li><a href=\"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/gitlab-ci-cd-security-definitive-guide\/\">\u062f\u0644\u064a\u0644 \u0623\u0645\u0627\u0646 GitLab CI\/CD<\/a> \u2014 \u0634\u0631\u062d \u0634\u0627\u0645\u0644 \u0644\u0643\u0644 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0623\u0645\u0627\u0646 \u0641\u064a GitLab CI\/CD.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/secrets-management-ci-cd-pipelines-patterns-vault\/\">\u0623\u0641\u0636\u0644 \u0645\u0645\u0627\u0631\u0633\u0627\u062a \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0641\u064a CI\/CD<\/a> \u2014 \u062a\u0639\u0645\u0651\u0642 \u0641\u064a \u062a\u0643\u0627\u0645\u0644 vault\u060c \u0648\u0627\u0644\u062a\u062f\u0648\u064a\u0631\u060c \u0648\u0623\u0633\u0631\u0627\u0631 \u0627\u0644\u062d\u062f \u0627\u0644\u0623\u062f\u0646\u0649 \u0645\u0646 \u0627\u0644\u0635\u0644\u0627\u062d\u064a\u0627\u062a.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/short-lived-credentials-workload-identity-federation-ci-cd\/\">\u0645\u0635\u0627\u062f\u0642\u0629 OIDC \u0641\u064a \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 CI\/CD<\/a> \u2014 \u0645\u062e\u062a\u0628\u0631 \u0639\u0645\u0644\u064a \u062e\u0637\u0648\u0629 \u0628\u062e\u0637\u0648\u0629 \u0644\u062a\u0647\u064a\u0626\u0629 OIDC \u0645\u0639 AWS \u0648GCP \u0648Azure.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/complete-guide-ci-cd-pipeline-security\/\">\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0623\u0645\u0627\u0646 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 CI\/CD<\/a> \u2014 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062f\u0642\u064a\u0642 \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0627\u0644\u062a\u064a \u062a\u063a\u0637\u064a GitHub Actions \u0648GitLab CI \u0648Jenkins.<\/li>\n<li><a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\" target=\"_blank\" rel=\"noopener\">\u0648\u062b\u0627\u0626\u0642 GitLab CI\/CD \u0627\u0644\u0631\u0633\u0645\u064a\u0629<\/a> \u2014 \u0627\u0644\u0645\u0631\u062c\u0639 \u0627\u0644\u0631\u0633\u0645\u064a \u0644\u062c\u0645\u064a\u0639 \u0645\u064a\u0632\u0627\u062a GitLab CI\/CD.<\/li>\n<\/ul>\n<p>\u0627\u0644\u0623\u0645\u0627\u0646 \u0644\u064a\u0633 \u0639\u0645\u0644\u064a\u0629 \u062a\u0647\u064a\u0626\u0629 \u062a\u062a\u0645 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u2014 \u0628\u0644 \u0647\u0648 \u0645\u0645\u0627\u0631\u0633\u0629 \u0645\u0633\u062a\u0645\u0631\u0629. \u0631\u0627\u062c\u0639 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0623\u0645\u0627\u0646 \u062e\u0637\u0648\u0637 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628 \u0643\u0644 \u062b\u0644\u0627\u062b\u0629 \u0623\u0634\u0647\u0631\u060c \u0648\u0642\u0645 \u0628\u062a\u062f\u0648\u064a\u0631 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f\u060c \u0648\u062a\u062f\u0642\u064a\u0642 \u0648\u0635\u0648\u0644 \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a\u060c \u0648\u062d\u0627\u0641\u0638 \u0639\u0644\u0649 \u062a\u062d\u062f\u064a\u062b \u0646\u0633\u062e\u0629 GitLab \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643. \u062a\u0645\u0646\u062d\u0643 \u0647\u0630\u0647 \u0627\u0644\u0648\u0631\u0642\u0629 \u0627\u0644\u0645\u0631\u062c\u0639\u064a\u0629 \u0627\u0644\u0644\u0628\u0646\u0627\u062a \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629. \u0627\u0644\u0622\u0646 \u0627\u0630\u0647\u0628 \u0648\u0623\u0645\u0651\u0646 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628\u0643.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0644\u0645\u0627\u0630\u0627 \u064a\u064f\u0639\u062f\u0651 \u0623\u0645\u0627\u0646 GitLab CI \u0645\u0647\u0645\u064b\u0651\u0627 \u062a\u064f\u0639\u062f\u0651 \u062e\u0637\u0648\u0637 \u0623\u0646\u0627\u0628\u064a\u0628 GitLab CI\/CD \u0623\u062f\u0648\u0627\u062a \u0642\u0648\u064a\u0629 \u2014 \u0644\u0643\u0646 \u0627\u0644\u0642\u0648\u0629 \u062a\u0623\u062a\u064a \u0645\u0639 \u0627\u0644\u0645\u062e\u0627\u0637\u0631. \u0645\u062a\u063a\u064a\u0651\u0631 \u0648\u0627\u062d\u062f \u062e\u0627\u0637\u0626 \u0627\u0644\u062a\u0643\u0648\u064a\u0646 \u0642\u062f \u064a\u0633\u0631\u0651\u0628 \u0623\u0633\u0631\u0627\u0631\u064b\u0627 \u062d\u0633\u0627\u0633\u0629. \u0645\u064f\u0646\u0641\u0651\u0630 \u063a\u064a\u0631 \u0645\u062d\u062f\u0651\u062f \u0627\u0644\u0646\u0637\u0627\u0642 \u0642\u062f \u064a\u0646\u0641\u0651\u0630 \u0634\u064a\u0641\u0631\u0629 \u062e\u0628\u064a\u062b\u0629. \u0628\u064a\u0626\u0629 \u063a\u064a\u0631 \u0645\u062d\u0645\u064a\u0629 \u0642\u062f \u062a\u0633\u0645\u062d \u0644\u0645\u0637\u0648\u0651\u0631 \u0645\u0628\u062a\u062f\u0626 \u0628\u0627\u0644\u0646\u0634\u0631 \u0645\u0628\u0627\u0634\u0631\u0629 \u0641\u064a \u0627\u0644\u0625\u0646\u062a\u0627\u062c. \u062a\u0645\u0646\u062d\u0643 \u0647\u0630\u0647 \u0627\u0644\u0648\u0631\u0642\u0629 \u0627\u0644\u0645\u0631\u062c\u0639\u064a\u0629 \u0623\u0643\u0648\u0627\u062f YAML \u062c\u0627\u0647\u0632\u0629 \u0644\u0644\u0646\u0633\u062e \u0648\u0627\u0644\u0644\u0635\u0642 &#8230; <a title=\"\u0648\u0631\u0642\u0629 \u0645\u0631\u062c\u0639\u064a\u0629 \u0644\u0623\u0645\u0627\u0646 GitLab CI: \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a\u060c \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a\u060c \u0627\u0644\u0628\u064a\u0626\u0627\u062a\u060c \u0648OIDC\" class=\"read-more\" href=\"https:\/\/secure-pipelines.com\/ar\/ci-cd-security\/gitlab-ci-security-cheat-sheet\/\" aria-label=\"Read more about \u0648\u0631\u0642\u0629 \u0645\u0631\u062c\u0639\u064a\u0629 \u0644\u0623\u0645\u0627\u0646 GitLab CI: \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a\u060c \u0627\u0644\u0645\u064f\u0646\u0641\u0651\u0630\u0627\u062a\u060c \u0627\u0644\u0628\u064a\u0626\u0627\u062a\u060c \u0648OIDC\">\u0627\u0642\u0631\u0623 \u0627\u0644\u0645\u0632\u064a\u062f<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,30],"tags":[],"post_folder":[],"class_list":["post-797","post","type-post","status-publish","format-standard","hentry","category-ci-cd-security","category-gitlab-ci"],"_links":{"self":[{"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/posts\/797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/comments?post=797"}],"version-history":[{"count":0,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/posts\/797\/revisions"}],"wp:attachment":[{"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/media?parent=797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/categories?post=797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/tags?post=797"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/secure-pipelines.com\/ar\/wp-json\/wp\/v2\/post_folder?post=797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}