[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CWMTRGSXK32VCENTH835C9":3,"skill-same:01M6CWMTRGSXK32VCENTH835C9":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":37,"commitSha":38,"skillDirectory":5,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6CWMTRGSXK32VCENTH835C9","ci-cd",null,"CI\u002FCD pipeline best practices and implementation","ffsshhttiikk\u002Fopencode-agents-skills","ffsshhttiikk","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F226346827?v=4","01M6CWD9RR3Y7VRQX3MXYC8FYH","01M6CWD9WVPYAZW0J82G1VKGHY",3,"MIT","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fci-cd\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[23,24,25,26,27,28,29],"ci cd","ci","best practices","pipeline","devops","opencode","implementation","2026-11-10 10:12:30",false,"---\nname: ci-cd\ndescription: CI\u002FCD pipeline best practices and implementation\nlicense: MIT\ncompatibility: opencode\nmetadata:\n  audience: developers\n  category: devops\n---\n## What I do\n- Design CI\u002FCD pipelines\n- Implement automated testing\n- Configure build automation\n- Manage deployments\n- Implement rollback strategies\n- Configure notifications\n- Manage secrets in pipelines\n- Monitor pipeline health\n\n## When to use me\nWhen creating or optimizing CI\u002FCD workflows.\n\n## GitHub Actions Pipeline\n```yaml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n  workflow_dispatch:\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Python\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: '3.11'\n          cache: 'pip'\n      \n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n          pip install black isort mypy\n      \n      - name: Check formatting\n        run: |\n          black --check .\n          isort --check-only .\n      \n      - name: Type checking\n        run: mypy src\u002F\n\n  test:\n    runs-on: ubuntu-latest\n    needs: lint\n    strategy:\n      matrix:\n        python-version: ['3.10', '3.11', '3.12']\n        os: [ubuntu-latest, macos-latest]\n        exclude:\n          - python-version: '3.12'\n            os: 'macos-latest'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Python ${{ matrix.python-version }}\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: ${{ matrix.python-version }}\n          cache: 'pip'\n      \n      - name: Install dependencies\n        run: |\n          pip install -r requirements.txt\n          pip install pytest pytest-cov\n      \n      - name: Run tests\n        run: pytest --cov=src --cov-report=xml\n      \n      - name: Upload coverage\n        if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11'\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage.xml\n\n  build:\n    runs-on: ubuntu-latest\n    needs: test\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v3\n      \n      - name: Log in to Container Registry\n        uses: docker\u002Flogin-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      \n      - name: Extract metadata for Docker\n        id: meta\n        uses: docker\u002Fmetadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}\n          tags: |\n            type=ref,event=branch\n            type=sha\n      \n      - name: Build and push Docker image\n        uses: docker\u002Fbuild-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Deploy to Production\n        run: |\n          echo \"Deploying to production...\"\n          kubectl apply -f k8s\u002F\n        env:\n          KUBECONFIG: ${{ secrets.KUBE_CONFIG }}\n```\n\n## GitLab CI Pipeline\n```yaml\nstages:\n  - lint\n  - test\n  - build\n  - security\n  - deploy\n\nvariables:\n  DOCKER_DRIVER: overlay2\n  DOCKER_TLS_CERTDIR: \"\"\n\nlint:\n  stage: lint\n  image: python:3.11\n  script:\n    - pip install -r requirements.txt\n    - black --check .\n    - isort --check-only .\n    - mypy src\u002F\n  only:\n    - merge_requests\n    - main\n\ntest:\n  stage: test\n  image: python:3.11\n  script:\n    - pip install -r requirements.txt\n    - pytest --cov=src\n  coverage: '\u002FTOTAL.*\\s+(\\d+%)$\u002F'\n  artifacts:\n    reports:\n      junit: report.xml\n  parallel:\n    matrix:\n      - PYTHON_VERSION: ['3.10', '3.11', '3.12']\n\nsecurity:\n  stage: security\n  image: \n    name: aquasec\u002Ftrivy:latest\n    entrypoint: [\"\"]\n  script:\n    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .\n  allow_failure: true\n\nbuild:\n  stage: build\n  image: docker:24-dind\n  services:\n    - docker:24-dind\n  script:\n    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .\n    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA\n  only:\n    - main\n\ndeploy:\n  stage: deploy\n  script:\n    - echo \"Deploying application...\"\n  environment:\n    name: production\n    url: https:\u002F\u002Fexample.com\n  only:\n    - main\n```\n\n## Best Practices\n```\nPipeline Best Practices:\n\n1. Fast feedback\n   Run fast tests first\n   Parallelize where possible\n\n2. Isolate environments\n   Use containers\n   Don't share state\n\n3. Fail fast\n   Check linting before testing\n   Validate before building\n\n4. Use artifacts\n   Pass build outputs between jobs\n   Store test results\n\n5. Secure secrets\n   Use encrypted secrets\n   Don't log sensitive data\n\n6. Single source of truth\n   Pipeline as code\n   Version controlled\n\n7. Atomic commits\n   Small, focused commits\n   Clear commit messages\n\n8. Manual approvals\n   Require approval for production\n   Add gates for critical steps\n\n9. Monitor pipelines\n   Track success\u002Ffailure rates\n   Alert on regressions\n\n10. Keep pipelines simple\n    Don't overcomplicate\n    Extract complex logic to scripts\n```\n","## What I do\n- Design CI\u002FCD pipelines\n- Implement automated testing\n- Configure build automation\n- Manage deployments\n- Implement rollback strategies\n- Configure notifications\n- Manage secrets in pipelines\n- Monitor pipeline health\n\n## When to use me\nWhen creating or optimizing CI\u002FCD workflows.\n\n## GitHub Actions Pipeline\n```yaml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n  workflow_dispatch:\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Python\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: '3.11'\n          cache: 'pip'\n      \n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n          pip install black isort mypy\n      \n      - name: Check formatting\n        run: |\n          black --check .\n          isort --check-only .\n      \n      - name: Type checking\n        run: mypy src\u002F\n\n  test:\n    runs-on: ubuntu-latest\n    needs: lint\n    strategy:\n      matrix:\n        python-version: ['3.10', '3.11', '3.12']\n        os: [ubuntu-latest, macos-latest]\n        exclude:\n          - python-version: '3.12'\n            os: 'macos-latest'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Python ${{ matrix.python-version }}\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: ${{ matrix.python-version }}\n          cache: 'pip'\n      \n      - name: Install dependencies\n        run: |\n          pip install -r requirements.txt\n          pip install pytest pytest-cov\n      \n      - name: Run tests\n        run: pytest --cov=src --cov-report=xml\n      \n      - name: Upload coverage\n        if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11'\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage.xml\n\n  build:\n    runs-on: ubuntu-latest\n    needs: test\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v3\n      \n      - name: Log in to Container Registry\n        uses: docker\u002Flogin-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      \n      - name: Extract metadata for Docker\n        id: meta\n        uses: docker\u002Fmetadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}\n          tags: |\n            type=ref,event=branch\n            type=sha\n      \n      - name: Build and push Docker image\n        uses: docker\u002Fbuild-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    \n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Deploy to Production\n        run: |\n          echo \"Deploying to production...\"\n          kubectl apply -f k8s\u002F\n        env:\n          KUBECONFIG: ${{ secrets.KUBE_CONFIG }}\n```\n\n## GitLab CI Pipeline\n```yaml\nstages:\n  - lint\n  - test\n  - build\n  - security\n  - deploy\n\nvariables:\n  DOCKER_DRIVER: overlay2\n  DOCKER_TLS_CERTDIR: \"\"\n\nlint:\n  stage: lint\n  image: python:3.11\n  script:\n    - pip install -r requirements.txt\n    - black --check .\n    - isort --check-only .\n    - mypy src\u002F\n  only:\n    - merge_requests\n    - main\n\ntest:\n  stage: test\n  image: python:3.11\n  script:\n    - pip install -r requirements.txt\n    - pytest --cov=src\n  coverage: '\u002FTOTAL.*\\s+(\\d+%)$\u002F'\n  artifacts:\n    reports:\n      junit: report.xml\n  parallel:\n    matrix:\n      - PYTHON_VERSION: ['3.10', '3.11', '3.12']\n\nsecurity:\n  stage: security\n  image: \n    name: aquasec\u002Ftrivy:latest\n    entrypoint: [\"\"]\n  script:\n    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .\n  allow_failure: true\n\nbuild:\n  stage: build\n  image: docker:24-dind\n  services:\n    - docker:24-dind\n  script:\n    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .\n    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA\n  only:\n    - main\n\ndeploy:\n  stage: deploy\n  script:\n    - echo \"Deploying application...\"\n  environment:\n    name: production\n    url: https:\u002F\u002Fexample.com\n  only:\n    - main\n```\n\n## Best Practices\n```\nPipeline Best Practices:\n\n1. Fast feedback\n   Run fast tests first\n   Parallelize where possible\n\n2. Isolate environments\n   Use containers\n   Don't share state\n\n3. Fail fast\n   Check linting before testing\n   Validate before building\n\n4. Use artifacts\n   Pass build outputs between jobs\n   Store test results\n\n5. Secure secrets\n   Use encrypted secrets\n   Don't log sensitive data\n\n6. Single source of truth\n   Pipeline as code\n   Version controlled\n\n7. Atomic commits\n   Small, focused commits\n   Clear commit messages\n\n8. Manual approvals\n   Require approval for production\n   Add gates for critical steps\n\n9. Monitor pipelines\n   Track success\u002Ffailure rates\n   Alert on regressions\n\n10. Keep pipelines simple\n    Don't overcomplicate\n    Extract complex logic to scripts\n```\n",{"name":5,"license":14,"metadata":35,"description":7,"compatibility":28},{"audience":36,"category":27},"developers","main","5f7a3e453c98261f93d19a6a7de44ad8f7b72d41",2,"https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk","2026-03-01 06:55:40",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill ci-cd",{"tool":49,"command":50},"bunx","bunx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill ci-cd",{"tool":52,"command":53},"pnpm","pnpm dlx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill ci-cd","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fci-cd\u002FSKILL.md",true,[57],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fsdr-lab-rules.md","REFERENCE","参考文档",191,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FSecurity-and-Compliance\u002Fradio-sdr\u002Freferences\u002Fsdr-lab-rules.md",[64,75,85,94,104,113],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":30},"01M6CXT9TXDF79BWJTMQAPB49G","xamarin","Xamarin cross-platform development","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fxamarin\u002FSKILL.md",[],[66,71,72,73,28,74],"platform","cross-platform","mobile","development",{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":30},"01M6CXT8AD04MFYDA32VW3FKAG","wrangling","Data wrangling fundamentals","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwrangling\u002FSKILL.md",[],[77,82,28,83,84],"data wrangling","science","data",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":30},"01M6CXT717GCN7SRRNPBDP4508","windows","Windows operating system administration and scripting","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwindows\u002FSKILL.md",[],[87,92,28,93],"system","scripting",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":30},"01M6CXT54K794NMEM3XAPZZDKT","wide-column","Wide-column data model","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwide-column\u002FSKILL.md",[],[101,102,28,103,84],"wide column","databases","model",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":30},"01M6CXT28FMT2P4V9GZE67WA8E","wide-column-stores","Wide-column database stores","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwide-column-stores\u002FSKILL.md",[],[111,102,28,112],"wide column stores","database",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":30},"01M6CXT0D0M0Q4T2N7C2RX7DSN","websockets","WebSocket implementation and best practices","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwebsockets\u002FSKILL.md",[],[115,120,121,122,28,25,29],"websocket","real-time","time"]